라이브 시스템 없이 SSH를 통해 LVM의 다른 PV로 루트 파티션을 이동하는 방법

라이브 시스템 없이 SSH를 통해 LVM의 다른 PV로 루트 파티션을 이동하는 방법

데비안 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 RAID1md0
  • 4TB RAID1md1
  • PV 켜짐md0
  • PV 켜짐md1p1
  • vg0두 PV가 모두 포함된 VG
  • root원래 루트 fs(UUID xxx) 로서의 LV
  • newroot임시 루트 fs(UUID yyy) 로서의 LV
  • ext4 켜짐 vg0-root(UUID aaa)
  • ext4 켜짐 vg0-newroot(UUID bbb)

/etc/fstab그에 따라 변경되었습니다(장치 매퍼 경로가 교체됨).

지금까지 전체 이전 루트를 newroot로 rsync했고 모든 UUID를 and in aaa으로 교체 했습니다 ( bbb참고 : UEFI 부팅을 사용하지 않습니다 ).aaaxxxbbbyyy/boot/grub/grub.cfggrub2

initramfsupdate-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에 있는 루트 파티션을 축소하려고 시도한 내용은 다음과 같습니다.

  1. 루트 파티션 스냅샷을 생성합니다. 변경할 때 공간이 할당되어 있는지 확인하십시오.
  2. fsck로 스냅샷을 확인하세요.
  3. 스냅샷의 크기를 조정하고(축소) 파일 시스템 상단과 LV의 대상 크기 경계 사이에 약간의 버퍼가 있는지 확인하십시오. 안전을 위해.
  4. 스냅샷을 다시 rootfs LV에 병합합니다.
  5. 재부팅합니다. 병합은 실제로 이 시점(아마도 부팅 중)에 수행됩니다.
  6. 재부팅 후 - rootfs 볼륨을 축소하고 rootfs의 크기를 다시 조정하여 LV 상단의 모든 공간을 채웁니다.

한 가지 단점이 있습니다. 라이브 파일 시스템에서 스냅샷을 만들 때 1단계와 5단계 사이에서 일부 데이터가 손실되고 1단계에서 (사용 중인 FS에 따라) 일부 불일치가 발생할 수 있습니다.

그것은 놀랍게도 나에게 효과적이었습니다.

이상적인 세계에서는 부팅 중에 rootfs rw를 다시 마운트하기 전에 1단계가 수행되므로 스냅샷이 깨끗해집니다. 나는 dracut에서 그것을 수행하는 방법을 찾지 못했습니다. 내가 사용하려고 했던 도구가 그곳에서 작동하지 않았습니다.

관련 정보