목적
부트로더에서 스냅샷을 관리하고
chroot하고,
kcl(kernel command line) 수정 할 수 있는 방법이 있습니다!
snapshot
이것을 설치해보는 것이 목적입니다.
환경
Oracle Virtual machine
ububtu 22.04를 zfs로 설치
apt update && apt upgrade
RHEL은 댓글로 남겨주세요
저는 RHEL을 사용합니다.
하지만 이 게시물에 올라갈 사진을 스크린샷 하기 위해 RHEL on zfs를 구현할 수는 없었습니다.
ubuntu와 달리 zfs에 OS 설치하는 스크립트를 제공하지 않기 때문입니다.
ubuntu 22.04.01이 아닌 이유이기도 합니다.
ubuntu 22.04.01부터는 다시 zfs가 없어졌다고 하더라구요.
스크립트가 없으면 파티션부터 모든 과정을 cli로 해야하는데, 이게 생각보다 오래 걸리고 귀찬은 일입니다.
어쨋든! RHEL on zfs를 설치하셨는데, zbm으로 부트로더를 변경하려고 하신다면 댓글로 남겨주세요.
막히는 부분은 도와드리겠습니다.
GRUB에서 문제가 발생한다면?
아래 절차들을 따라하다보면 GRUB에서 stuck될 수 있습니다.
엄연히 우리는 부트로더를 건드리고 있는 것이기 때문이죠.
그래서 grub 문제가 생겼을 때 탈출(?)하는 방법을 먼저 소개해드리려고 합니다.
GRUB에서 OS가 실행되지 않을 때
이런 화면이 나오면 GRUB까지는 진행이 되었으나 커널이나 initramfs를 찾지 못한 것입니다.
다시 이 화면으로 돌아오셔서 C를 누르시면 shell 화면이 나옵니다.
쉘 화면에서 다음을 입력하여 UEFI로 진입하실 수 있습니다.
fwsetup
ZBM 설치 시작!
과정 목차
간추려 보면 별거 없습니다
전반전
ZBM 설치
zfs, zpool 옵션 설정
bpool의 kernel과 initramfs를 백업
rpool로 kernel과 initramfs를 복원
후반전
Jump into chroot
bpool 제거
grub을 제 및 zbm을 설치
fstab을 수정
UEFI에 부트 옵션 추가
전반전
전반전까지만 해도 zbm을 이용해서 부팅하는데는 문제가 없습니다.
하지만 후반전도 필수입니다.
부팅에 필수인 것이 아니라 사용에 있어서 필수라고 할수 있죠.
필요 패키지 설치
우분투는 기본으로 curl이 없더군요..
sudo su -
apt install curl
임시로 외부 장치에 zfs boot menu 설치
임시로 부트로더 설치할 장치 추가
100MB 정도만 있으면 됩니다.
아무 USB 장치의 파티션을 100MB만 확보해도 좋습니다.
디스크를 확인합니다.
lsblk # 임시로 zbm을 넣을 디스크를 확인합니다.
DISK=/dev/sda # 디스크 이름을 변수에 넣습니다.
gdisk로 파티션 생성
gdisk $DISK
n # 생성
(그냥 ENTER) # 파티션 번호
(그냥 ENTER) #파티션 시작위치
(그냥 ENTER) #파티션 용량
EF00 #파티션 Type. EF00가 EFI 파티션입니다.
w # 파티션 테이블 쓰기
y # confirm
파티션 생성 과정의 full log입니다.
root@qwer-VirtualBox:~# gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.8
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries in memory.
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-419396, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-419396, default = 419396) or {+-}size{KMGTP}:
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI system partition'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
파티션을 포맷하고 /mnt에 폴더를 만들어서 마운트
저는 만들어진 파티션이 1번 파티션입니다.
1번 파티션에 zbm을 설치하겠습니다.
PART=1 # 저는 1번 파티션에 ZBM을 설치할 것입니다.
mkfs.fat -F 32 -n "ZBM-temporary" ${DISK}${PART}
mkdir -p /mnt/zfs-boot-efi
mount -t vfat ${DISK}${PART} /mnt/zfs-boot-efi
EFI 파일을 넣을 폴더를 생성하고, EFI 파일을 다운로드/ 설치
cd /mnt/zfs-boot-efi
mkdir -pv /mnt/zfs-boot-efi/EFI/BOOT && cd "$_"
curl -Ljo BOOTX64.EFI https://get.zfsbootmenu.org/efi
rpool을 부트로더에서 부팅할 수 있도록 설정
pool의 bootfs 옵션과
filesystem의 옵션을 설정합니다.
pool에 설정하는 bootfs는 /에 마운트 되는 filesystem을 입력해주면 됩니다.
zfs에 설정하는 commandline은 커널옵션이 포함되어야 합니다.
# /에 마운트 되는 파일 시스템을 찾고 bootfs에 넣습니다.
zfs mount | grep '/$' | awk '{print $1}'
zpool set bootfs=zfs mount | grep '/$' | awk '{print $1}'
rpool
zfs set org.zfsbootmenu:active=on rpool
# if ubuntu
zfs set org.zfsbootmenu:commandline="ro quiet loglevel=4 splash" rpool
# if RHEL
zfs set org.zfsbootmenu:commandline="ro quiet loglevel=4 rhgb" rpool
kernel과 initramfs를 백업
bpool의 파일들을 rpool로 옮기게 됩니다.
/boot에는 bpool이 마운트 되어있고
/에는 rpool이 마운트 되어있기 때문에 /에 폴더를 생성하면 rpool에 들어가겠죠.
mkdir /boot2
cp -a /boot/* /boot2
ZBM에서 rpool로 부팅 가능하게 만들기
UEFI에서 ZBM으로 부팅
ll /dev/disk/by-path
# 장치의 경로를 확인합니다.
systemctl reboot --firmware-setup
# UEFI 펌웨어로 진입합니다.
위에서 확인한 경로의 장치로 부팅합니다.
아직 rpool/ROOT/ubuntu_asdf
에 커널이 없기 때문에 커널을 찾을 수 없다고 하면서 Recovery로 진입하게 되요.
kernel과 initramfs를 rpool의 boot로 복원
zbm에 진입하면 모든 pool이 import 되어있습니다.
따라서 모두 export한 후에 /mnt로 import합니다.
그리고 bpool은 파괴시키고 /boot2에 복사해둔 것을 /boot로 이동합니다.
zpool export -a
zpool import -R /mnt rpool
zpool import -R /mnt bpool
zpool destroy bpool
mv /mnt/boot2/* /mnt/boot
zpool export -a
zbm에서 ubuntu로 부팅 가능
따라서 UEFI 펌웨어 설정에서 zbm을 영구적으로 추가하기만 하면
이 상태로 사용할 수는 있습니다.
그러니까 이 이후는 필수는 아니죠.
하지만 이후 작업을 하는 이유를 들으면 분명히 다 하고 싶어질 것입니다.
지금 저를 따라왔으면 이런 구조를 갖고 있게 됩니다.
임시 저장소(200MB) – zbm
ubuntu 디스크 – grub, swap, bpool, rpool
그런데 grub 대신 사용하는 것이 zbm이므로 grub이 불필요
해졌습니다.
bpool에 있던 boot 안의 파일들을 모두 rpool에 /boot 폴더를 만들어서 안에 넣었으며, zbm은 bpool이 아닌 rpool의 boot 폴더에 있는 커널을 이용해 부팅하기 때문에 bpool도 필요 없습니다.
그러면 이 두 파티션을 지우면 생기는 공간에 zbm을 설치할 수 있지 않을까요?
zbm을 설치하면 이제 임시로 장착한 디스크가 없어도 되지 않을까요?
후반전
이제는 임시 부트로더를 내장으로 이동하여 임시 디스크 없이 부팅 가능하게 할것입니다.
다시 zbm으로 부팅
본체 전원버튼이나 reset 버튼을 이용해서 다시 시작하여 ZBM으로 부팅해주세요
이번에는 커널과 initramfs가 존재하기 때문에 zbm 메뉴로 진입할 수 있게 됩니다.
enter를 눌러서 부팅하거나 esc를 눌러서 zbm으로 진입할 수 있다는 메세지가 나오면 가볍게 esc를 눌러주세요
Jump into chroot
ESC를 누르면 이러한 화면이 나올것입니다.
ctrl
+J
를 눌러서 chroot 해주세요
여기서는 ubuntu에 설치된 모든 명령을 사용할 수 있게 됩니다.
bpool 제거
lsblk # ubuntu 디스크가 어떤 디스크인지 확인합니다.
# 저는 /dev/sdb네요
sudo gdisk /dev/sdb
p
를 입력하면 /dev/sdb의 파티션들이 보입니다.
이 때 Code가 BE00(Solaris Boot)인 파티션을 지웁니다.
d
3
w
y
The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8)
와 같은 메세지가 보인다면
partprobe
를 실행해주세요
bpool 제거 과정 full log
ubuntu@ubuntu:~$ sudo gdisk /dev/sdb
GPT fdisk (gdisk) version 1.0.8
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): p
Disk /dev/sdb: 52428800 sectors, 25.0 GiB
Model: VBOX HARDDISK
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): C428D26D-E9DE-4AB1-9C1C-EB4A4BA075F4
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 52428766
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 1050623 512.0 MiB EF00 EFI System Partition
2 1050624 3430399 1.1 GiB 8200
3 3430400 5998591 1.2 GiB BE00
4 5998592 52428766 22.1 GiB BF00
Command (? for help): d
Partition number (1-4): 3
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
ubuntu@ubuntu:~$ partprobe
grub을 지우고, zbm을 설치
임시 zbm을 마운트 할 폴더를 생성하고 마운트 합니다.
mkdir -p /mnt/zbm
mount -t vfat /dev/sda1 /mnt/zbm
ubuntu disk의 grub 파티션을 fat32로 포맷하고 마운트합니다.
mkfs.fat -F 32 -n "ZBM" /dev/sdb1
mkdir -p /mnt/zfs
mount -t vfat /dev/sdb1 /mnt/zfs
zbm을 복사합니다.
rm -rf /mnt/zfs/*
cp -a /mnt/zbm/* /mnt/zfs
fstab을 수정합니다.
포맷하면서 변경된 /dev/sdb1의 uuid를 확인합니다.
# uuid 확인
ll /dev/disk/by-uuid
sudo nano /mnt/etc/fstab
fstab을 다음과 같이 수정합니다.
/boot/efi도 변경할 예정이므로 주석
grub은 사용하지 않으므로 주석
스왑은 그대로 두기
/boot/efi는 그대로 복사해서 아래에 새로 추가. 이 때 새로운 UUID로 적용
이제 마운트가 잘 되는지 확인을 해봅시다.
mount -a
UEFI에 부트 옵션을 추가합니다.
부팅 장치를 선택하지 않아도 자동으로 새로운 부트로더로 부팅되도록 합니다.
답글 남기기