Como montar um sistema de arquivos ZFS externo sem danificar / alterar o sistema de arquivos atual ou externo

9

Estou usando o FreeBSD 10.2 usando o ZFS no root como o sistema de arquivos (zroot01) . Eu tenho um disco rígido externo com um sistema de arquivos ZFS de outro sistema FreeBSD 10.2 (zroot02) que eu quero montar temporariamente, somente leitura, para que eu possa obter alguns arquivos dele e desconectá-lo depois . Eu não quero que o sistema ZFS externo danifique ou substitua meu sistema de arquivos atual, nem quero que os dados do externo também sejam corrompidos / alterados.

Para demonstrar o que estou tentando realizar, se eu estivesse usando o UFS, faria algo assim:

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

... onde /dev/ada0s2 é a partição em minha unidade externa e /mnt/my-fun-mountpoint está no diretório /mnt do meu sistema operacional existente.

Todas as pesquisas e man pages não fornecem um método claro para isso. O que as respostas que eu encontrei acabaram tomando conta do meu sistema de arquivos atual e corrompendo-o além do reparo - obviamente não é o resultado que estou procurando. Eu tentei isso há um tempo atrás, então eu não lembro quais comandos eu tentei, infelizmente.

Você pode fornecer algumas orientações claras sobre como fazer isso? Agradecemos antecipadamente por sua ajuda.

    
por Will B 19.07.2016 / 22:44

1 resposta

11

Bem, isso realmente depende de como somente leitura você quer que o pool esteja. E não, isso não é uma piada.

Primeiro, um pouco de terminologia: no ZFS, você importa um pool e, opcionalmente, monta os (quaisquer) sistemas de arquivos dentro dele. Você pode importar um pool sem montar nenhum sistema de arquivos passando -N a zpool import e, depois, montando os sistemas de arquivos desejados usando zfs mount . (Este é um cenário perfeitamente válido se, por exemplo, você quiser acessar apenas um único sistema de arquivos de muitos, ou se você quiser fazer algo parecido com um scrub off-line do pool.)

O ZFS não é um grande fã de acesso verdadeiramente somente leitura. Por exemplo, se o ZFS detectar um erro que consiga reparar, acredito que ele consertará o erro e gravará os dados reparados no disco mesmo que você tenha importado o pool como somente leitura. Meu entendimento é que, no parlace do ZFS, "somente leitura" se aplica somente ao estado visível ao usuário do conjunto e seus conjuntos de dados. Se, por outro lado, você fizer uma cópia binária do disco em um arquivo (ou conjunto de arquivos), tornar esses arquivos realmente somente de leitura e tentar importar o conjunto a partir dele, o ZFS não poderá importar o arquivo. piscina em tudo, não importa o quanto você tente. Se você fizer os arquivos graváveis, funcionará bem. (Eu realmente tentei isso há algumas semanas atrás, embora usando um zvol, e o ZFS veementemente recusou para importar o pool. Quando eu defini o zvol para ler / escrever em vez de somente leitura, o pool importou bem.) Outros sistemas de arquivos como (no Linux) ext4 e provavelmente outros lidam com essa situação de forma graciosa, mas o ZFS hesita.

Se você tiver azar e não tiver RAM ECC instalado no sistema onde você está importando o pool, então a tentativa do ZFS de corrigir qualquer erro encontrado pode, na verdade, piorar as coisas , embora opiniões diferem sobre se isto é realmente um risco real na prática. Pessoalmente, sou da opinião de que quaisquer dados que eu me importo o suficiente para proteger com ZFS e snapshots e redundância em nível de armazenamento e backups e outros merecem a proteção oferecida pela RAM ECC também, mas muitos PCs não possuem memória RAM ECC.

Assim, você pode importar o pool no modo somente leitura, com uma raiz alternativa específica para evitar que ele pisoteie os dedos de qualquer outra pessoa, mas você precisa estar ciente de que não é necessariamente verdadeiro somente leitura em um sentido forense. (Isso, no entanto, garantirá que você não altere nada acidentalmente no pool.) Para fazer uma importação somente leitura, supondo que o pool seja denominado tank e que o (s) nó (s) do dispositivo esteja (ão) disponível (s) /dev , você usaria um comando como:

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

Isso procurará em /dev por qualquer item que contenha um pool do ZFS com o nome tank , importe-o temporariamente e defina a propriedade readonly to on (o que significa que todas as gravações iniciadas pelo usuário serão rejeitadas ) e definindo temporariamente sua propriedade altroot como /mnt/someplace . (Esses valores de propriedade são "temporários" no sentido de que eles não são mantidos no (s) disco (s) como valores de propriedade atuais, portanto, se você exportar e reimportar o pool sem eles, os valores voltarão ao normal. Possivelmente seja gravado no histórico do pool, uma vez que o pool é importado, você pode olhar com zpool history tank se você estiver inclinado.) Uma vez que o pool é importado, você verá seus arquivos em / mnt / someplace e terá acesso somente leitura a eles, incluindo quaisquer snapshots já feitos nos conjuntos de dados no pool.

Dado o seu exemplo, suspeito que você usaria algo como:

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

Quando terminar, lembre-se de exportar o pool de maneira limpa:

# zpool export tank

ou talvez

# zpool export zroot02

Isso desmontará todos os sistemas de arquivos e outros conjuntos de dados dentro do pool, liberará todos os buffers (na medida em que qualquer necessidade for liberada em primeiro lugar), marcará o pool como não importado em todos os dispositivos constituintes e executar quaisquer outras tarefas de manutenção necessárias para garantir que o pool possa ser movido com segurança para um sistema diferente e importado para lá posteriormente.

    
por 19.07.2016 / 23:15

Tags