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

11

Estou usando o FreeBSD 10.2 usando o ZFS na raiz 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 desejo montar temporariamente, somente leitura, para que eu possa tirar alguns arquivos dele e desconectá-lo depois. Eu não quero o sistema ZFS externo para espancar ou substituir o meu sistema de arquivos atual, nem quero os dados do externo para ser corrompido / alterado também.

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/ada0s2está a partição na minha unidade externa e /mnt/my-fun-mountpointestá no /mntdiretório do meu sistema operacional existente.

Toda a pesquisa e a leitura da página de manual não forneceram um método claro para isso. As respostas que encontrei acabaram assumindo o 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 não lembro quais comandos tentei, infelizmente.

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

Será
fonte

Respostas:

13

Bem, isso realmente depende de quão somente leitura você deseja que a piscina seja. 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 nele. Você pode importar uma piscina sem montar qualquer sistema de arquivo, passando -Npara zpool importe, posteriormente, montar quaisquer sistemas de arquivos desejados usando zfs mount. (Esse é um cenário perfeitamente válido se, por exemplo, você desejar acessar apenas um único sistema de arquivos dentre muitos, ou se desejar fazer algo semelhante a uma limpeza off-line do pool.)

O ZFS não é um grande fã de acesso verdadeiramente somente leitura. Por exemplo, se o ZFS detectar um erro capaz de reparar, acredito que ele consertará o erro e gravará os dados reparados no disco, mesmo se você importou o pool como somente leitura. Meu entendimento é que, no ZFS parlace, "somente leitura" se aplica apenas ao estado visível do usuário do pool 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 leitura e tentar importar o pool de lá, o ZFS não poderá importar o arquivo piscina, não importa o quanto você tente. Se você tornar os arquivos graváveis, ele funcionará bem. (Na verdade, eu tentei isso apenas algumas semanas atrás, embora usando um zvol, e o ZFS recusou veementementepara importar o pool. Quando defino o zvol para leitura / gravação, em vez de somente leitura, o pool é importado.

Se você não tiver sorte e não tiver RAM de ECC instalada no sistema em que está importando o pool, a tentativa do ZFS de corrigir os erros encontrados pode realmente piorar as coisas , embora as opiniões sejam diferentes sobre se esse é realmente um risco real. na prática. Pessoalmente, sou da opinião de que quaisquer dados que importam o suficiente sobre proteger com ZFS e instantâneos e redundância de nível de armazenamento e backups e outros enfeites merece a proteção oferecida pela ECC RAM também, mas muitos PCs não têm ECC RAM.

Portanto, você pode importar o pool no modo somente leitura, com uma raiz alternativa específica para impedir que ele pise nos dedos de qualquer outra pessoa, mas você precisa estar ciente de que não é necessariamente verdadeiramente somente leitura no sentido forense. (No entanto, garantirá que você não altere acidentalmente nada no pool.) Para fazer uma importação somente leitura, assumindo que o pool seja nomeado tanke que o (s) nó (s) do dispositivo esteja / esteja disponível /dev, você deve use um comando como:

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

Isso procurará /devqualquer coisa que contenha um pool ZFS com o nome tank, importe-o, configure temporariamente a propriedade pool readonlypara on(o que significa que todas as gravações iniciadas pelo usuário serão rejeitadas) e temporariamente configure sua altrootpropriedade para /mnt/someplace. (Esses valores de propriedade são "temporários" no sentido de que não são persistidos 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, que, depois que o pool for importado, você poderá ver comzpool history tank se você preferir.) Depois que o pool for importado, você verá seus arquivos em / mnt / someplace e terá acesso normal somente leitura a eles, incluindo todos os snapshots que já foram 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 corretamente o pool:

# zpool export tank

ou talvez

# zpool export zroot02

Isso desmontará todos os sistemas de arquivos e outros conjuntos de dados do pool, liberará todos os buffers (na medida em que for necessário liberar o fluxo), marcará o pool como não importado em todos os dispositivos constituintes e executará outras tarefas de limpeza necessárias para garantir que o pool possa ser movido com segurança para um sistema diferente e importado para ele posteriormente.

um CVn
fonte
1
Se você realmente tem certeza de que o que você afirma no terceiro parágrafo está correto, isso seria um erro na implementação do BSD ZFS. A importação somente leitura do conjunto ZFS foi projetada para ser realmente somente leitura, ou seja, nunca tenta gravar ou corrigir dados ou metadados, incluindo o histórico do conjunto. Veja arc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre
1
@jlliagre Estou bastante certeza, mas pode ter sido no contexto de alguma outra aplicação ZFS. Eu realmente não vejo por que eles diferem em um aspecto tão fundamental; Acredito que todas as implementações de código aberto do ZFS compartilham uma quantidade significativa de código que rastreia sua linhagem até a Sun. Eu só poderia configurar algum tipo de ambiente de teste para isso e cutucá-lo com um bastão e depois ver o que acontece, mas levará algum tempo até que eu possa dedicar tempo para realmente fazer isso.
um CVn