Как смонтировать внешнюю файловую систему ZFS без забивания / изменения текущей или внешней файловой системы

11

Я использую FreeBSD 10.2, используя ZFS в качестве файловой системы root (zroot01) . У меня есть внешний жесткий диск с файловой системой ZFS из другой системы FreeBSD 10.2 (zroot02), который я хочу временно смонтировать, только для чтения, чтобы я мог извлечь из него некоторые файлы, а затем отключить его. Я не хочу, чтобы внешняя система ZFS блокировала или заменяла мою текущую файловую систему, а также не хочу, чтобы данные на внешней системе также были повреждены / изменены.

Чтобы продемонстрировать, что я пытаюсь достичь, если бы я использовал UFS, я бы сделал что-то вроде этого:

mount -t ufs -o ro /dev/ada0s2 /mnt/my-fun-mountpoint

... где /dev/ada0s2находится раздел на моем внешнем диске и /mnt/my-fun-mountpointнаходится в /mntкаталоге моей существующей операционной системы.

Весь поиск и чтение man-страниц не обеспечили кристально чистый метод для этого. Какие ответы я даже найти в конечном итоге взять на мою текущую файловую систему и развращает его за ремонт - явно не результат я ищу. Я пытался это сделать некоторое время назад, поэтому, к сожалению, я не помню, какие команды я пробовал.

Можете ли вы дать четкое руководство о том, как это сделать? Спасибо заранее за вашу помощь.

Будет Б
источник

Ответы:

13

Ну, это действительно зависит от того, насколько пул будет доступен только для чтения. И нет, это не шутка.

Сначала немного терминологии: в ZFS вы импортируете пул и дополнительно монтируете (любые) файловые системы внутри него. Вы можете импортировать пул без монтажа любых файловых систем, передавая -Nк zpool importи затем позже монтировать требуемые файловые системы с помощью zfs mount. (Это вполне допустимый сценарий, если, например, вы хотите получить доступ только к одной файловой системе из множества, или если вы хотите сделать что-то, похожее на автономную очистку пула.)

ZFS не большой поклонник действительно доступ только для чтения. Например, если ZFS обнаружит ошибку, которую она может исправить, я считаю, что она исправит ошибку и запишет восстановленные данные на диск, даже если вы импортировали пул только для чтения. Насколько я понимаю, в ZFS parlace «только для чтения» применяется только к видимому пользователю состоянию пула и его наборов данных. Если, с другой стороны, вы делаете двоичную копию диска в файл (или набор файлов), делаете эти файлы действительно доступными только для чтения и пытаетесь импортировать пул оттуда, ZFS не сможет импортировать бассейн вообще, как ни старайся. Если вы сделаете файлы доступными для записи, все будет работать нормально. (Я действительно попробовал это всего несколько недель назад, хотя и использовал zvol, и ZFS категорически отказаласьимпортировать пул. Когда я установил zvol для чтения / записи вместо «только для чтения», пул импортировался нормально.) Другие файловые системы, такие как (в Linux) ext4 и, возможно, другие, справляются с этой ситуацией несколько изящно, но ZFS сопротивляется.

Если вам не повезло, и в системе, в которую вы импортируете пул, не установлена ​​оперативная память ECC , то попытка ZFS исправить любые ошибки, с которыми она сталкивается, может даже ухудшить ситуацию , хотя мнения о том, является ли это реальным риском, расходятся. на практике. Лично я придерживаюсь мнения , что любые данные , которые я не безразлична для защиты с ZFS и снимков и избыточности хранения данных уровня и резервного копирования и этажерки заслуживает защиты , предлагаемых ECC RAM также, но многие компьютеры не имеют ECC RAM.

Таким образом, вы можете импортировать пул в режиме только для чтения с определенным альтернативным корнем, чтобы он не наступал ни на что другое, но вы должны знать, что он не обязательно действительно только для чтения в криминалистическом смысле. (Тем не менее, это гарантирует, что вы ничего не измените в пуле случайно.) Чтобы выполнить импорт только для чтения, предполагая, что пул назван tankи что в нем доступны / доступны узлы устройства /dev, вы бы используйте команду как:

# zpool import tank -d /dev -o readonly=on -R /mnt/someplace

Это будет выглядеть в /devдля чего - нибудь , держащего ZFS пула с именем tank, импортировать его, временно установив свойство пула readonlyв on(что означает , что все инициированный пользователь запись будет отклонена) и временно установив его altrootсвойство /mnt/someplace. (Эти значения свойств являются «временными» в том смысле, что они не сохраняются на диске (дисках) в качестве текущих значений свойств, поэтому, если вы экспортируете и повторно импортируете пул без них, значения вернутся к нормальному состоянию. Они могут возможно, будет записан в историю пула, который после импорта пула можно посмотреть с помощьюzpool history tank если вы так склонны.) После импорта пула вы увидите ваши файлы в / mnt / someplace и получите обычный доступ только для чтения к ним, включая любые снимки, которые уже сделаны в наборах данных в пуле.

Учитывая ваш пример, я подозреваю, что вы будете использовать что-то вроде:

# zpool import zroot02 -d /dev -o readonly=on -R /mnt/my-fun-mountpoint

Когда вы закончите, не забудьте экспортировать пул:

# zpool export tank

или возможно

# zpool export zroot02

Это приведет к размонтированию всех файловых систем и других наборов данных в пуле, очистке всех буферов (в той степени, в которой требуется очистка в первую очередь), маркировке пула как не импортированного на все составляющие устройства и выполнению любых других необходимых служебных задач для обеспечения что пул можно безопасно переместить в другую систему и импортировать туда позже.

CVn
источник
1
Если вы действительно уверены, что то, что вы утверждаете в третьем абзаце, верно, это будет ошибкой в ​​реализации BSD ZFS. Импорт в пул ZFS только для чтения был разработан, чтобы быть действительно доступным только для чтения, то есть он никогда не пытается записывать или исправлять какие-либо данные или метаданные, включая историю пула. См. Arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre
1
@jlliagre Я вполне уверен, но это могло быть в контексте какой-то другой реализации ZFS. Я действительно не понимаю, почему они отличаются в таком фундаментальном аспекте; Я полагаю, что все реализации ZFS с открытым исходным кодом имеют значительный объем кода, который ведет свою историю от Sun. Я мог бы просто создать для этого какую-то среду тестирования и ткнуть в нее палкой, а затем посмотреть, что произойдет, но пройдет некоторое время, прежде чем я смогу посвятить время тому, чтобы это сделать.
CVn