목적

부트로더에서 스냅샷을 관리하고
chroot하고,
kcl(kernel command line) 수정 할 수 있는 방법이 있습니다!

jump into chroot
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에서 OS가 실행되지 않을 때
이런 화면이 나오면 GRUB까지는 진행이 되었으나 커널이나 initramfs를 찾지 못한 것입니다.

GRUB 화면에서 c를 누릅니다.
다시 이 화면으로 돌아오셔서 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를 누르면 이러한 화면이 나올것입니다.

jump into chroot
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로 적용

nano /etc/fstab
이제 마운트가 잘 되는지 확인을 해봅시다.
mount -a

UEFI에 부트 옵션을 추가합니다.

부팅 장치를 선택하지 않아도 자동으로 새로운 부트로더로 부팅되도록 합니다.











답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

닫기를 누르면 이용하실 수 있지만, 광고 차단은 해제해주시면 좋겠습니다.
Powered By
100% Free SEO Tools - Tool Kits PRO