
데비안 10을 부팅할 루트 파티션을 어떻게 변경할 수 있나요?
원격에서 LVM 논리 볼륨에 있는 루트 파일 시스템의 크기를 줄이고 싶습니다. 즉, Live CD로 부팅하지 않고 SSH를 통해서만 가능합니다.
rootfs가 마운트되어 있는 동안에는 축소할 수 없기 때문에 기존 rootfs를 복제하고 거기에서 부팅한 후 크기를 조정한 다음 원래 rootfs로 부팅하고 임시 파일을 삭제하기로 했습니다.
AFAIK는 Debain 10과 동일한 "부팅 체인"을 사용하기 때문에 Ubuntu Server 18.04를 사용하여 VM에서 시도했습니다. 그러나 복제된 파티션을 루트로 안정적으로 설정할 수 없었습니다. 재부팅 후 확인해 mount
보니 원래 루트가 여전히 사용됩니다.
/etc/fstab
업데이트되었습니다/boot/grub/grub.cfg
업데이트되었습니다initramfs
업데이트되었습니다
현재 구성
- 1TB RAID1
md0
- 4TB RAID1
md1
- PV 켜짐
md0
- PV 켜짐
md1p1
vg0
두 PV가 모두 포함된 VGroot
원래 루트 fs(UUIDxxx
) 로서의 LVnewroot
임시 루트 fs(UUIDyyy
) 로서의 LV- ext4 켜짐
vg0-root
(UUIDaaa
) - ext4 켜짐
vg0-newroot
(UUIDbbb
)
/etc/fstab
그에 따라 변경되었습니다(장치 매퍼 경로가 교체됨).
지금까지 전체 이전 루트를 newroot로 rsync했고 모든 UUID를 and in aaa
으로 교체 했습니다 ( bbb
참고 : UEFI 부팅을 사용하지 않습니다 ).aaa
xxx
bbb
yyy
/boot/grub/grub.cfg
grub2
initramfs
update-initramfs -u
(수정 후 ) 을 사용하여 업데이트되었습니다 /etc/initramfs-tools/conf.d/resume
.
그와 같은 순서로. 그러나 VM에서의 테스트는 이전 루트로 바로 부팅되거나 GRUB 복구 셸로 던져졌습니다.
update-grub
볼륨을 인식 newroot
하고 일치하는 항목을 추가했으며 grub.cfg
테스트 VM에서 부팅할 때 수동으로 항목을 선택했습니다(SSH를 통해서는 불가능...). 또한 이전 루트를 부팅했습니다.
또한 루트 파티션을 하드코딩하는 ROOT
옵션 도 있는 것을 확인했습니다 ./etc/initramfs-tools/initramfs.conf
루트 bootarg를 전달할 수 없는 경우 선택적 루트 bootarg 하드코딩을 허용합니다. 루트 bootarg는 해당 특수 설정을 무시합니다.
하지만 내 루트에 대한 bootarg가 있으므로 grub.cfg
이 설정은 적용되지 않습니다.
다음 부팅 시 다른 UUID를 루트로 사용하려면 또 무엇을 구성해야 합니까?
답변1
알고 보니 root= bootarg를 교체하는 것을 잊어버렸습니다 /boot/grub/grub.cfg
...
완전성을 위해:
라이브 시스템 없이 SSH를 통해 LVM의 다른 PV로 루트 파티션을 이동하는 방법
참고: 중요한 데이터는 항상 백업하세요! 이 방법은 해킹이므로 프로덕션 시스템에서는 사용하면 안 됩니다. 어떤 경우든 LV 복제와 새 루트 파티션에서의 부팅 사이에 기록된 데이터는 항상 손실됩니다.
다른 디스크에 새 LVM 생성
fdisk /dev/sdb #Create new partition for PV (sdb1)
pvcreate /dev/sdb1
vgcreate vg1 /dev/sdb1
lvcreate -n newroot -L10G vg1 #Size has to be larger than effective usage on current root
mkfs.ext4 -L newroot /dev/mapper/vg1-newroot
새로운 LVM에 대한 정보 수집
lvdisplay
vgdisplay
pvdisplay
blkid
다음 명령은 여기에 제시된 정보를 다음과 같이 참조합니다.
- $pv0uuid = 이전 PV의 UUID
- $pv1uuid = 새 PV의 UUID
- $vg{0,1}uuid = {old,new} VG의 UUID
- $lv{0,1}UUID = {old,new} LV의 UUID
- $root{0,1}UUID = {old,new} 루트 파일 시스템의 UUID
- $vg{0,1} = {old,new} VG의 이름
- $lv{0,1} = {old,new} LV의 이름
그리고 /etc/grub/grub.cfg
로 제시될 것입니다 $grubcfg
. UEFI 시스템의 경우 이는 가능성이 높습니다 /boot/grub2/grub.cfg
.
아래 명령을 복사하여 붙여넣을 수 있도록 bash
사용 시 변수로 설정하는 것이 좋습니다 .pv0uuid=xxxxxx-xxxx...
GRUB 구성에서 새 루트 설정
다음 명령은 GRUB 구성의 텍스트를 대체합니다.
sed -i "s/$pv0uuid/$pv1uuid/g" $grubcfg
sed -i "s/$vg0uuid/$vg1uuid/g" $grubcfg
sed -i "s/$lv0uuid/$lv1uuid/g" $grubcfg
sed -i "s/$root0uuid/$root1uuid/g" $grubcfg
sed -i "s/$vg0/$vg1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/$lv0/$lv1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/\/dev\/mapper\/$vg0-$lv0/\/dev\/mapper\/$vg1-$lv1/g" /etc/fstab #BEWARE COMMON NAMES
일반적인 이름을 조심하세요:
sed
교체합니다모든root
일치하는 텍스트가 있으면 GRUB 또는 fstab 구성의 다른 곳에서 사용된 것과 같은 단어를 바꾸면 유효하지 않게 되기 때문에 이러한 변경을 직접 수행하는 것이 좋습니다 !
VG 및 LV 이름은 nano
( )를 사용하여 검색하고 수동으로 바꾸는 것이 좋습니다 . CTRL+W
만일의 경우에는 PV 장치 이름을 검색하는 것도 권장됩니다...
루트 볼륨 복제
mount /dev/mapper/$vg1-$lv1 /mnt
rsync -rAa --one-file-system / /mnt/
umount /mnt
재부팅
재부팅하고 기도하십시오. 새 LV가 에 마운트되고 있는지 확인합니다 /
.
이전 LVM 삭제
lvremove /dev/$vg0/*
vgremove $vg0
pvremove /dev/sda2 #Path to $pv0uuid
대청소
선택사항이지만 권장됨
- 마지막으로 이전 VG를 삭제하십시오
/etc/lvm/archive
. 그렇지 않으면 부팅할 때마다 검색되어 지연이 발생합니다. update-grub
update-initramfs -u
노트
Ubuntu 18.04에서 테스트한 결과, 다른 배포판에서는 GRUB 구성을 다르게 처리할 수 있습니다(UUID와 장치 경로 및 업데이트 명령 관련).
당연히 데이터 손실을 최소화하려면 불필요한 서비스를 모두 미리 중지하세요.
systemd 대상, 사용자 정의 스크립트 및 LVM 스냅샷을 사용하여 (대부분의) 데이터 손실을 방지하는 방법이 있을 수 있습니다. 재부팅하기 전 가능한 마지막 순간에 데이터를 다시 $lv0
동기화 해야 합니다 . $lv1
이 게시물의 범위를 벗어났습니다 ...
/boot
별도의 파티션이 아닌 경우 $grubcfg
다시 재부팅하기 전에 새 루트를 다시 확인하세요.
답변2
이것이 도움이 될지 확실하지 않지만 LV에 있는 루트 파티션을 축소하려고 시도한 내용은 다음과 같습니다.
- 루트 파티션 스냅샷을 생성합니다. 변경할 때 공간이 할당되어 있는지 확인하십시오.
- fsck로 스냅샷을 확인하세요.
- 스냅샷의 크기를 조정하고(축소) 파일 시스템 상단과 LV의 대상 크기 경계 사이에 약간의 버퍼가 있는지 확인하십시오. 안전을 위해.
- 스냅샷을 다시 rootfs LV에 병합합니다.
- 재부팅합니다. 병합은 실제로 이 시점(아마도 부팅 중)에 수행됩니다.
- 재부팅 후 - rootfs 볼륨을 축소하고 rootfs의 크기를 다시 조정하여 LV 상단의 모든 공간을 채웁니다.
한 가지 단점이 있습니다. 라이브 파일 시스템에서 스냅샷을 만들 때 1단계와 5단계 사이에서 일부 데이터가 손실되고 1단계에서 (사용 중인 FS에 따라) 일부 불일치가 발생할 수 있습니다.
그것은 놀랍게도 나에게 효과적이었습니다.
이상적인 세계에서는 부팅 중에 rootfs rw를 다시 마운트하기 전에 1단계가 수행되므로 스냅샷이 깨끗해집니다. 나는 dracut에서 그것을 수행하는 방법을 찾지 못했습니다. 내가 사용하려고 했던 도구가 그곳에서 작동하지 않았습니다.