섹터 크기가 다른 디스크에서 dd 사용

섹터 크기가 다른 디스크에서 dd 사용

파티션을 새 드라이브로 이동하고 싶습니다. 기존 드라이브의 섹터 크기는 512바이트이고 새 드라이브의 섹터 크기는 4096바이트입니다. 전체 디스크를 추가하려고 시도했지만 이전 드라이브의 파티션이 4K 경계에 정렬되지 않았기 때문에 실패했습니다. 그래서 대신 fdisk를 사용하여 새 드라이브에 처음부터 파티션을 만든 다음 dd를 사용하여 디스크 간에 해당 파티션을 복사했습니다. 마지막으로 resize2fs를 사용하여 새 드라이브의 파일 시스템을 확장했습니다. 새 파티션(지금까지는 읽기 전용)을 마운트하고 파일을 볼 수 있으며 fsck는 깨끗하다고 ​​말하므로 이것이 효과가 있었던 것 같습니다.

하지만 이것이 과연 안전한 일인지에 대해서는 여전히 의문이 남아 있습니다. 예를 들어, FS는 이렇게 하면 문제가 발생할 수 있는 방식으로 섹터 크기에 관심을 두나요, 아니면 VFS 계층이나 HD 자체에 의해 보호됩니까?

답변1

처음에 시도했지만 실패한 dd 명령이 무엇인지 알려주지 않았습니다. 그러나 coreutils 패키지의 dd 명령 소스 코드를 확인하는 데 약간의 시간이 걸렸으며 여기에 문제가 있는 것 같습니다.

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.  */

오류 메시지를 보내주시면 추가 검색을 할 수 있습니다. 하지만 나에게는 이것이 우리가 맞은 곳이다. 512바이트 페이지 경계를 4KiB 페이지 경계와 정렬하는 것은 올바르지 않은 것 같습니다.

이제 두 번째 부분으로 넘어가서 두 번째 드라이브(fdisk 포함)의 파티션을 512바이트 크기로 생성하셨나요? 그러나 대부분의 최신 디스크에서 OS에 알리는 섹터 크기는 1MiB, 즉 4096KiB입니다.

fdisk.c의 update_sector_offset 함수에서 다음을 볼 수 있습니다.

/*
             * 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는 fdisk 구조체에 대한 설명자입니다.

그래서 이 부분이 명확하지 않습니다. 즉, 새 디스크가 섹터 크기를 4096KiB 또는 512바이트로 광고한 경우입니다.

이제 마지막 부분으로 왔습니다.

아니요, 파일 시스템은 실제로 섹터 크기에 관심이 없습니다. 그리고 블록 크기가 4KiB라면 문제가 없을 것입니다. 왜냐하면 가상 페이지 크기(mm 컨텍스트)가 4KiB이므로 mmaped IO가 이에 맞춰 조정되어야 하기 때문입니다. 내 노트북에서는 블록 크기와 물리적 섹터 크기가 동일합니다.

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

$ sudo blockdev --getbsz /dev/sda
4096

IO는 섹터 크기가 아닌 블록 크기와 관련하여 발생합니다. 물리적 섹터 크기로 인해 FS에 문제가 발생하면 매우 놀랄 것입니다. 그러나 VFS는 그다지 멀지 않습니다. VFS는 애플리케이션 발행 ​​IO와 실제 파일 시스템 사이에 있습니다. 우리가 논의하고 있는 것은 VFS 계층 아래에 ​​있습니다.

관련 정보