16GB 카드에 Raspbian을 설치하고 파일 시스템을 확장했습니다. 카드를 백업했을 때 dd
.img 파일 출력은 약 16GB였습니다. 이 중 대부분은 ext4 파티션에서 사용되지 않은 공간입니다. 저는 해당 파티션에서 약 2.5GB의 공간만 사용했습니다. (두 개의 파티션이 있습니다. 첫 번째는 부팅용 FAT이고 두 번째는 rootfs용 ext4입니다.) 이미지를 더 작은 크기로 복원할 수 있도록 Ubuntu 16.04 서버 설치(GUI 없음)에 있는 backup.img 파일을 축소하고 싶습니다. 크기 카드(예: 8GB).
/dev/loop0
지금까지 나는 나에게 제공된 오프셋 값을 사용하여 ext4 파티션을 마운트했습니다 fdisk -l backup.img
. 그런 다음 ext4 fs를 축소하는 것처럼 보이는 e2fsck -f /dev/loop0
then을 사용했습니다 . 제가 올바른 방향으로 가고 있나요? 다음이 될 것 resize2fs -M /dev/loop0
같지만 parted
난 이미아니요그것을 경험해 보세요.
cli 도구만 사용하여 이 작업을 어떻게 수행할 수 있습니까?
고쳐 쓰다:
다음은 실행 결과입니다 fdisk -l backup.img
.
Disk backup.img: 14.9 GiB, 15931539456 bytes, 31116288 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: 0x79d38e92
Device Boot Start End Sectors Size Id Type
backup.img1 * 8192 124927 116736 57M e W95 FAT16 (LBA)
backup.img2 124928 31116287 30991360 14.8G 83 Linux
답변1
fdisk/parted가 다음 단계로 파일 시스템을 축소하는 올바른 방향으로 가고 있음을 확인할 수 있습니다. 까다로운 부분은 새 파일 시스템의 크기 바로 옆에 가져오거나, 계산을 하거나, 안전을 위해 추가로 100KB를 누출하는 것입니다. 필요한 경우 나중에 새 카드에서 조정할 수 있습니다.
명령은 일반적으로 umount, resize, fdisk/parted, partprobe, fsck 및 모든 것이 정상인지 확인하기 위한 mount입니다. 크기를 조정하려는 파티션이 2T보다 작으므로 fdisk
또는 를 사용할 수 있습니다 parted
.
파일 시스템이 회수해야 하는 공간을 여전히 차지하고 있는 동안에는 파티션을 안정적으로 축소할 수 없기 때문에 크기 조정 프로세스가 먼저 수행되어야 합니다. 일관성을 유지하기 위해 파티션을 다시 축소해야 하고 남은 공간이 없기 때문에 "구독"을 제거하여 사용해야 합니다. 파일 시스템 구조가 새 크기와 일치하도록 파일 시스템이 마지막에 배치됩니다.
이 RH 기사를 남겨 드리겠습니다. partprobe
새 파티션 크기가 항상 즉시 인식되지 않거나 이전 커널에서 인식되지 않기 때문에 누락되었습니다 .
resize2fs를 사용하여 ext2/3/4 파일 시스템을 축소하는 방법
누락된 단계는 다음과 같습니다.
sudo fdisk /dev/loop
p - to check for partition number (probably 2)
d - to delete
2 - partition 2
n - new partition
p - primary
ENTER - default beginning
+new size - smaller card size
w - write it
sudo partprobe /dev/loop
이를 수행하려면 이미지 파일을 마운트 해제하십시오. 추가 크기는 더 이상 파일 이미지의 파일 시스템 및 파티션 크기에서 사용되는 것으로 표시되지 않으므로 운영 체제는 공간을 사용하려고 시도하지 않습니다. 따라서 예상 크기로 안전하게 잘라낼 수 있습니다.
truncate -s 8GB fileName
적절한 크기를 사용하려면 게으르기 때문에 파일 시스템을 필요한 것보다 작은 크기로 파쇄하고(즉, 새 파티션의 크기 - 400k, 그런 다음 파티션을 축소한 후 다시 확장) 필요한 파티션을 생성합니다. 크기 사용(가능한 첫 번째 파티션 채우기는 8GB-2048(2K)에서 첫 번째 파티션 크기를 뺀 크기) 수학은 별로 필요하지 않습니다.
올바르게 계산하려면 다음을 살펴보세요.
답변2
사용하는 방법자동 RPi 이미지 축소기?
코드를 보고 무슨 일이 일어나고 있는지 확인할 수도 있습니다.
if [[ ! $(whoami) =~ "root" ]]; then
echo ""
echo "**********************************"
echo "*** This should be run as root ***"
echo "**********************************"
echo ""
exit
fi
if [[ -z $1 ]]; then
echo "Usage: ./autosizer.sh "
exit
fi
if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi
partinfo=`parted -m $1 unit B print`
partnumber=`echo "$partinfo" | grep ext4 | awk -F: ' { print $1 } '`
partstart=`echo "$partinfo" | grep ext4 | awk -F: ' { print substr($2,0,length($2)-1) } '`
loopback=`losetup -f --show -o $partstart $1`
e2fsck -f $loopback
minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
minsize=`echo $minsize+1000 | bc`
resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback
partnewsize=`echo "$minsize * 4096" | bc`
newpartend=`echo "$partstart + $partnewsize" | bc`
part1=`parted $1 rm 2`
part2=`parted $1 unit B mkpart primary $partstart $newpartend`
endresult=`parted -m $1 unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)-1) } '`
truncate -s $endresult $1