Usando o dd em discos com diferentes tamanhos de setor

5

Gostaria de mover uma partição para uma nova unidade. A unidade antiga tem um tamanho de setor de 512 bytes, enquanto a nova possui um tamanho de setor de 4096 bytes. Eu tentei fazer um dd do disco inteiro, mas isso falhou porque a partição na unidade antiga não estava alinhada aos limites de 4K. Então, em vez disso, criei uma partição do zero na nova unidade usando fdisk, depois copiei essa partição entre discos usando dd. Finalmente, eu expandi o sistema de arquivos na nova unidade usando resize2fs. Isso parece ter funcionado, já que eu posso montar a nova partição (somente leitura até agora) e visualizar arquivos, e o fsck diz que está limpo.

Mas ainda tenho dúvidas sobre se isso é algo seguro de se fazer. Por exemplo, o FS preocupa-se com o tamanho do setor de uma maneira que quebraria as coisas fazendo isso, ou seria protegido contra isso pela camada VFS ou pela própria HD?

    
por pavon 22.12.2013 / 08:04

1 resposta

3

Você não nos disse qual foi o comando dd que você tentou inicialmente, que falhou. No entanto, passei um pouco de tempo verificando o código-fonte do comando dd (do pacote coreutils) e parece que tivemos um problema aqui.

1852   /* Some devices require alignment on a sector or page boundary
1853      (e.g. character disk devices).  Align the input buffer to a
1854      page boundary to cover all bases.  Note that due to the swab
1855      algorithm, we must have at least one byte in the page before
1856      the input buffer;  thus we allocate 2 pages of slop in the
1857      real buffer.  8k above the blocksize shouldn't bother anyone.
1858 
1859      The page alignment is necessary on any Linux kernel that supports
1860      either the SGI raw I/O patch or Steven Tweedies raw I/O patch.
1861      It is necessary when accessing raw (i.e. character special) disk
1862      devices on Unixware or other SVR4-derived system.  */

Se você der a mensagem de erro, posso fazer uma pesquisa adicional. Mas para mim foi aqui que fomos atingidos. Isso está alinhando o limite de 512 bytes da página com um limite de 4 páginas KiB não parece certo.

Agora, chegando à segunda parte, você criou a partição da segunda unidade (com fdisk) como tamanho de 512 bytes. No entanto, o tamanho do setor anunciado pela maioria dos discos modernos para o SO é de 1 MiB, ou seja, 4096 KiB.

Na função update_sector_offset do fdisk.c você verá

/*
             * Align the begin of partitions to:
             *
             * a) topology
             *  a2) alignment offset
             *  a1) or physical sector (minimal_io_size, aka "grain")
             *
             * b) or default to 1MiB (2048 sectrors, Windows Vista default)
             *
             * c) or for very small devices use 1 phy.sector
             */
            sector_t x = 0;

            if (fdisk_dev_has_topology(cxt)) {
                    if (cxt->alignment_offset)
                            x = cxt->alignment_offset;
                    else if (cxt->io_size > 2048 * 512)
                            x = cxt->io_size;
            }
            /* default to 1MiB */
            if (!x)
                    x = 2048 * 512;

            sector_offset = x / cxt->sector_size;

* cxt é o descritor para a estrutura fdisk.

Então, essa parte não está clara para mim. Ou seja, se o seu novo disco anunciava o tamanho do setor como 4096 KiB ou 512 bytes.

Agora, chegando à última parte.

Não, os sistemas de arquivos não se importam com o tamanho do setor. E desde que o tamanho do bloco seja 4 KiB, as coisas devem ficar bem, porque, como o tamanho da página virtual (no contexto mm) é de 4 KiB, o IO mmaped precisa estar alinhado com isso. No meu laptop, o tamanho do bloco e o tamanho do setor físico são os mesmos.

$ sudo blockdev --getpbsz /dev/sda
[sudo] password for chakraborty: 
4096

$ sudo blockdev --getbsz /dev/sda
4096

IO acontece no contexto do tamanho do bloco, não do tamanho do setor. Se devido ao tamanho do setor físico FS encontra algum problema, eu ficaria muito surpreso. No entanto, o VFS não chega tão longe. O VFS está entre o aplicativo que está emitindo o IO e o sistema de arquivos real. O que estamos discutindo está abaixo da camada VFS.

    
por 22.12.2013 / 11:54

Tags