파티션을 왼쪽으로 확장한 후 파일 시스템을 왼쪽으로 이동

파티션을 왼쪽으로 확장한 후 파일 시스템을 왼쪽으로 이동

긴 이야기 짧게

여러 파티션이 있는 이미지가 있습니다 dd. 궁극적인 목표는 disk.dd이 이미지의 파일 크기를 줄이는 것입니다 .dd

더 높은 번호의 파티션을 삭제하고 다시 만든 후 start sector offset(예: 파티션을 왼쪽으로 확장) 그 안에 파일 시스템이 있는 파티션이 있고 해당 파티션은 primary superblock파티션 내부 어딘가에 있으며 해당 파티션이 어떤 섹터에 있는지 알고 있습니다. primary superblock존재합니다.

e2fsck이 파일 시스템을 파티션의 시작 부분으로 어떻게 이동할 수 있습니까 ?

그런 다음 파일 시스템을 축소한 resize2fs다음 오른쪽에서 파티션을 축소할 수 있습니다. 즉, 더 낮은 값으로 파티션을 다시 생성합니다 end sector offset.

dd그런 다음 마지막 파티션까지 후속 파티션에 대해 이 프로세스를 반복하여 모든 파티션을 효과적으로 축소하여 이미지 크기를 줄입니다.

제안하지 마십시오 gparted. 명령줄 솔루션을 찾고 있습니다.

또한 사용하기가 더 쉬울 것이라는 것을 알고 있습니다 LVM. 하지만 이 레거시 시스템은


긴 버전


disk.dd명령을 사용하여 찍은 dd 이미지가 있습니다

dd if=/dev/sda of=/path/to/disk.dd

다음과 같은 레이아웃의 시스템

Disk /dev/loop15: 465.78 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x54093dd5

Device        Boot     Start       End   Sectors   Size Id Type
/dev/loop15p1 *         2048  81922047  81920000  39.1G 83 Linux
/dev/loop15p2       81922048 143362047  61440000  29.3G 82 Linux swap / Solaris
/dev/loop15p3      143362048 163842047  20480000   9.8G 83 Linux
/dev/loop15p4      163842048 976773167 812931120 387.7G  5 Extended
/dev/loop15p5      163844096 976773119 812929024 387.7G 83 Linux

이제 다른 시스템에서 disk.dd루프 장치를 사용하여 액세스하고 있습니다.

losetup --find --partscan disk.dd

ext4모든 파일 시스템의 크기를 조정했습니다.

resize2fs -M /dev/loopNpartX
resize2fs /dev/loopNpartX FSsize

즉, partition p1, p3그리고p5

를 사용하면 파일 시스템과 모든 파일 시스템의 바이트 수를 dumpe2fs볼 수 있습니다 . 제 경우에는 위에 표시된 대로 3개의 파티션에서 호스팅됩니다.logical block size4096ext4

이제 이 글을 구두로 올바르게 읽었다면 (틀렸다면 정정해주세요)

파일 시스템의 주요 슈퍼블록은 "일반적으로 예상되는0"는 파티션 에 있습니다.

그래서 슈퍼블록 정보를 덤프할 수 있습니다.

dumpe2fs -h -o superblock=0 -o blocksize=4096 /dev/loopNpartX

disk.dd이제 파일 크기를 줄이기 위해 파티션을 축소할 차례입니다.


block count다시 각 파일 시스템을 사용합니다 .dumpe2fs

fdiskphysical block size또는 장치의 경우 sectors내 경우에는 512바이트

sectors그래서 파일 시스템을 수용할 만큼 충분한 수를 찾기 위해 다음 공식을 사용했습니다.

Required Sectors = ( ( Block Count + 100 ) * Logical Block Size ) / Physical Block Size

100버퍼 역할을 합니다. 파일 시스템 구성에 대해 놓친 경우를 대비해 이 정도면 충분합니다.

모든 파일 시스템에 대해 이 작업을 수행했습니다.


지금


다음을 사용하여 lsblk -f기존 파일 시스템의 UUID를 얻을 수 있습니다.

다음을 사용하여 계속 열어두고 싶은 fdisk -l파티션을 얻을 수 있습니다.boot flag

이제 파티션을 축소하기 위해 삭제하고 다시 생성하겠습니다.fdisk

-- 첫 번째 파티션

start sector offset = 2048
last sector offset  = 2048 + "Required Sectors" for this filesystem

-- 두 번째 파티션

기존 디스크의 두 번째 파티션은 swap축소하지 않고 왼쪽으로 이동하기만 하면 됩니다.

start sector offset = "last sector offset" of first partition + 1
last sector offset  = "start sector offset" + Total sectors as as on existing partition

그런 다음 유형을 다음으로 변경한 Swap 다음 tune2fs -UUUID를 dd이미지의 내용 으로 다시 변경했습니다.

--3부 리그

start sector offset = "last sector offset" of second partition + 1
last sector offset  = "start sector offset" + "Required Sectors" for this filesystem

여기가 내가 붙어있는 곳이야


세 번째 파티션을 왼쪽으로 확장한 후 파티션에 파일 시스템이 있고 시작 섹터(즉, 해당 섹터 primary superblock) 를 알고 있습니다.

e2fsck하지만 파일 시스템이 파티션의 시작 부분으로 왼쪽으로 이동되도록 파티션에서 이 파일 시스템을 수정하는 방법을 모르겠습니다.

답변1

fsck는 불가능합니다. 파일 시스템에서는모든 것이 상쇄됩니다시작 섹터를 변경하면이러한 오프셋은 모두 변경됩니다.. fsck에는 모든 것(수퍼블록, 로그, 디렉터리, 파일 세그먼트 등)에 대한 모든 오프셋을 다시 쓰는 기능이 없습니다. 이렇게 할 수 있더라도 새 시작 섹터가 내부 파일 시스템 구조와 정렬된 경우에만 작동합니다.

아직 완료되지 않았습니다.

대신 dd를 사용하여 모든 데이터를 왼쪽으로 이동해야 합니다(본질적으로 gparted가 수행하는 작업). 파일 시스템을 완전히 이동해야만 파일 시스템 내의 오프셋이 변경되지 않습니다.

원칙적으로 dd 명령은 다음과 같이 작동할 수 있습니다. 서로 다른 오프셋으로 동일한 장치를 읽고 씁니다. 왼쪽으로 이동하는 데에만 사용할 수 있으므로 탐색(쓰기)다음보다 작아야 합니다.건너뛰기(읽기). 512b 섹터의 모든 셀(을 지정하는 경우 bs=1M파티션은 MiB로 정렬되어야 하며 모든 셀은 MiB로 정렬되어야 함)

dd if=/dev/sdx of=/dev/sdx \
   seek=newpartitionstart \
   skip=oldpartitionstart \
   count=filesystemsize

그러나 이는매우 위험한.자신의 책임하에 사용하십시오.먼저 데이터를 백업해 두시기 바랍니다.

오른쪽으로 이동하는 것은 더 복잡합니다. 거꾸로 작업해야 합니다. 그렇지 않으면 아직 읽지 않은 데이터를 덮어쓰고 프로세스의 모든 것을 파괴하게 됩니다.


데이터를 이동하지 않고도 이 작업을 수행할 수 있는 유일한 도구는 blocks --lvmify기존 파일 시스템 파티션을 LVM으로 변환하는 것입니다. LVM을 사용하면 논리적으로 오른쪽으로 확장되고 물리적으로 스토리지는 왼쪽으로 확장됩니다. LVM이 없으면 선형 장치 매핑을 수동으로 설정할 수도 있지만 그렇게 하면 비표준 솔루션을 사용하게 됩니다.


이런 종류의 문제를 해결하는 가장 현명한 방법(gparted를 사용하고 싶지 않은 경우)은 모든 데이터를 백업한 다음 원하는 레이아웃으로 새 파티션과 파일 시스템을 만든 다음 데이터를 복원하는 것입니다.

이 dd 이미지가 백업 솔루션인 경우 대신 파일 백업을 고려하세요. 디스크 이미지는 작업하기 어려울 수 있으며, 특히 나중에 변환하려는 경우에는 더욱 그렇습니다.


주요 목표가 이미지 파일의 저장 요구 사항을 줄이는 것이라면, 할 수 있는 일은 fstrim(루프 마운트 파일 시스템의 경우 - 모든 여유 공간 손실) 또는 blkdiscard(루프 스왑 파티션의 경우 - 모든 데이터 손실)입니다.

이미지를 저장하는 파일 시스템이 스파스 파일과 홀 펀칭을 지원하는 경우 이미지의 여유 공간도 지원 파일 시스템에 해제되므로 레이아웃 변경 없이도 dd 이미지는 저장 공간을 더 적게 사용합니다.

다시 말하지만 이는 위험합니다. 이미지 파일의 잘못된 부분을 폐기하면 이미지 파일이 되돌릴 수 없을 정도로 손상될 수 있습니다. 이미지 파일용 루프 장치를 생성하고 이를 마운트하는 간단한 행위로 인해 이미지 파일이 수정/손상되었습니다.

소스 디스크가 SSD이고 이미 fstrim을 정기적으로 사용하고 잘린 영역을 바이너리 ZERO로 읽는 경우 먼저 dd 를 사용하여 이미 희소한 dd 이미지를 생성할 수 있습니다 dd conv=sparse if=/dev/ssd of=ssd.img. 이렇게 하면 바이너리 0 영역이 ssd.img 파일에서 공간을 차지하지 않습니다. conv=sparse0이 아닌 대상 드라이브로 복원할 때 이를 다른 방향으로 사용하면 결과가 손상될 수 있습니다 .

관련 정보