라즈베리파이에 Kabi Tracking kmod zfs를 설치하자:6 boot disk 파티셔닝


이 글의 목적

RHEL을 zfs에 설치하기 위해 디스크를 zfs로 파티셔닝 합니다.
이 과정에서는 boot disk에 부팅을 위한 boot 파티션, root 파티션, swap을 생성하고 이 파티션에 OS를 설치하기 위해 마운트 할 것입니다.

파티션 번호 주의

매우 주의해야 하는 부분입니다.
우리가 boot disk를 빈 disk에 설정한다고 해도, 해당 디스크에는 UEFI firmware 파티션이 존재합니다.
live boot나 ISO 설치 파티션까지 한 디스크에 존재한다면 파티션 번호는 달라질 수 있습니다.
꼭 파티션 번호 주의 하세요.

openzfs: RHEL-based distro Root on ZFS

이 글의 소제목에는 open zfs의 RHEL-based distro Root on ZFS의 목차와 번호를 붙였습니다.

Preparation:6 – SSH 연결

우리는 뭔가 이상한 live boot를 만드는 과정에서 root로 ssh 로그인을 허용했습니다.
ip a를 이용해 ip를 확인하고 SSH로 연결합니다.

Preparation:7 boot disk 장치 명 확인 + 변수 설정

여기서는 ls로 확인하라고 하지만, 저는 그것만으로 인식하기 어렵더군요.

lsblk
# 디스크 크기와 파티션을 통해 디스크 번호를 확인
ls -al /dev/disk/by-id/
# 디스크 id 옆에 링크 된 장치 이름이 병행 표시된다.

# DISK 변수에 disk device id를 넣습니다.
# 이 때 raid를 할 예정이면 DISK에 여러개를 '띄어쓰기'로 구분하여 여러개를 넣습니다.
#DISK='/dev/disk/by-id/ID1 /dev/disk/by-id/ID2'
DISK='/dev/disk/by-id/ID'

Preparation:8 파티셔닝에 필요한 값 기억하기

우리는 파티션 번호가 다르기 떄문에 제공된 스크립트로 하면 큰일납니다.

#swap을 넣으려고 하는 경우
# 절전모드를 사용한다면 스왑은 램보다 커야합니다.
# GB 단위입니다.
INST_PARTSIZE_SWAP=8
# INST_PARTSIZE_RPOOL에 값을 넣지 않으면 디스크의 모든 남은 공간을 RPOOL에 사용합니다.
INST_PARTSIZE_RPOOL=
# boot disk의 현재 파티션 갯수입니다.
# 파티셔닝 하기 전 현재의 파티션 갯수입니다.
PART_COUNT=4

Preparation:9-13 ZFS 설치

10~12번 과정에서 zfs repo를 dnf repo에 추가하고 설치합니다.
우리는 빌드해둔 zfs가 있으므로 이를 설치합니다.

cd /zfs
sudo yum localinstall *.$(uname -p).rpm
modprobe zfs

Preparation:14 install partition tool

dnf install -y gdisk dosfstools

sys install: 1 partition disk

파티션 번호 주의

open zfs의 1번 항목에서는 다음과 같이 설정하도록 안내하고 있습니다.

디스크 모두 지우기
1번 파티션. EFI 형식으로 1M ~ 1G까지 약 0.999G 파티션 생성
2번  파티션. BE00(solaris boot) 형식으로 4G 생성(boot. /boot/EFI)
3번 파티션. BF00(solaris root) 형식으로 INST_PARTSIZE_RPOOL 크기만큼 생성(rpool. /)
4번 파티션. 8200 형식으로 INST_PARTSIZE_SWAP만큼 생성. 해당 변수가 없으면 생성 안함.
5번 파티션. 1번 파티션 앞에 1M의 크리고 BIOS 부트 파티션 생성

하지만 여기는 우리와 많이 다릅니다.
우리에게 맞게 수정해야합니다.

ARM 기반인 라즈베리파이는 BIOS 부트가 안됩니다.
따라서 5번 파티션은 불필요 합니다.
따라서 1번 파티션 역시 1M부터 시작될 필요가 없습니다.
1번 파티션도 0:1G로 설정하면 됩니다.

파티션 번호는 조금씩 밀려나야 합니다.
raspberrypii UEFI 파티션은 모두가 공통적으로 가지고 있습니다.
boot disk에 OS install disk를 구현했다면 현재 파티션이 2개일 것입니다.
boot disk에 liveboot disk를 구현했다면 파티션이 3개일 것입니다(부트와 root)
boot disk에 live boot, OS install disk를 모두 구현했다면 4개가 있겠지요.

그러면 만약 하나의 디스크에 OS install, liveboot를 모두 구현했다면 EFI 디스크는 1번이 아닌 5번 파티션이 될 것입니다.
이 처럼 모든 파티션이 파티션 갯수만큼 밀려날 것입니다.

이것들을 반영하여 스크립트를 만들면 아래와 같아질 것입니다.

# example. 앞에 4개의 파티션이 있는 경우
for i in ${DISK}; do
sgdisk -n5:0:+1G -t5:EF00 $i
sgdisk -n6:0:+4G -t6:BE00 $i

test -z $INST_PARTSIZE_SWAP || sgdisk -n8:0:+${INST_PARTSIZE_SWAP}G -t8:8200 $i

if test -z $INST_PARTSIZE_RPOOL; then
    sgdisk -n7:0:0   -t7:BF00 $i
else
    sgdisk -n7:0:+${INST_PARTSIZE_RPOOL}G -t7:BF00 $i
fi

done

저는 저런 스크립트 사용 안하고 gidsk를 이용해서 파티셔닝 했습니다.

sys install:2 create boot pool

파티션 번호 주의

open zfs에 따르면 다음과 같은 명령으로 /boot에 마운트 될 zfs pool을 생성합니다.

이는 raid 1을 사용하는 경우입니다.
raid5를 사용하는 경우 mirror 대신 raidz, raid6이면 raidz2를 입력합니다.

zpool create \
    -o compatibility=grub2 \
    -o ashift=12 \
    -o autotrim=on \
    -O acltype=posixacl \
    -O canmount=off \
    -O compression=lz4 \
    -O devices=off \
    -O normalization=formD \
    -O relatime=on \
    -O xattr=sa \
    -O mountpoint=/boot \
    -R /mnt \
    bpool \
    mirror \
    $(for i in ${DISK}; do
       printf "$i-part2 ";
      done)

raid와 파티션 번호를 반영하면 다음과 같이 만들어집니다.

zpool create \
    -o compatibility=grub2 \
    -o ashift=12 \
    -o autotrim=on \
    -O acltype=posixacl \
    -O canmount=off \
    -O compression=lz4 \
    -O devices=off \
    -O normalization=formD \
    -O relatime=on \
    -O xattr=sa \
    -O mountpoint=/boot \
    -R /mnt \
    bpool \
    $(for i in ${DISK}; do
       printf "$i-part6 ";
      done)

sys install:3 create Root pool

파티션 번호 주의
zpool create \
    -o ashift=12 \
    -o autotrim=on \
    -R /mnt \
    -O acltype=posixacl \
    -O canmount=off \
    -O compression=zstd \
    -O dnodesize=auto \
    -O normalization=formD \
    -O relatime=on \
    -O xattr=sa \
    -O mountpoint=/ \
    rpool \
   $(for i in ${DISK}; do
      printf "$i-part7 ";
     done)

여기도 raid 여부와 파티션 번호에 주의하여주세요

sys install:4 dataset 생성

이 과정에서 boot와 root pool이 마운트 됩니다.
성능이 안되므로 암호화는 pass합니다.

zfs on linux에 따르면 다음과 같이 실행하면 되겠죠.

zfs create \
 -o canmount=off \
 -o mountpoint=none \
 rpool/redhat

 zfs create -o canmount=on -o mountpoint=/     rpool/redhat/root
zfs create -o canmount=on -o mountpoint=/home rpool/redhat/home
zfs create -o canmount=off -o mountpoint=/var  rpool/redhat/var
zfs create -o canmount=on  rpool/redhat/var/lib
zfs create -o canmount=on  rpool/redhat/var/log

zfs create -o canmount=off -o mountpoint=none bpool/redhat
zfs create -o canmount=on -o mountpoint=/boot bpool/redhat/root

저는 좀 다르게 했습니다.
추후 zfs-autosnapshot을 이용해서 자동으로 스냅샷을 찍게 될텐데, 불필요한 dataset은 스냅샷 할 필요가 없고, 자주 변경되는 내용은 자주 ㅈ스냅샷 할 필요가 있습니다.
그래서 저는 snapshot 빈도에 따라 데이타셋을 생성했습니다.

zfs create -o canmount=on -o mountpoint=/  rpool/redhat/root
zfs create -o canmount=off  rpool/redhat/root/var
zfs create -o canmount=off  rpool/redhat/root/usr
zfs create -o canmount=on  rpool/redhat/root/usr/local
zfs create -o canmount=on rpool/redhat/root/home
zfs create -o canmount=on rpool/redhat/root/root

zfs create -o canmount=on  rpool/redhat/root/var/lib
zfs create -o canmount=on  rpool/redhat/root/var/log
zfs create -o canmount=on  rpool/redhat/root/var/spool
zfs create -o canmount=on  rpool/redhat/root/var/snap

zfs create -o canmount=on rpool/redhat/root/var/lib/NetworkManager
zfs create -o canmount=on rpool/redhat/root/var/lib/docker
zfs create -o canmount=on rpool/redhat/root/var/lib/snapd

zfs create -o canmount=off -o mountpoint=none bpool/redhat
zfs create -o canmount=on -o mountpoint=/boot bpool/redhat/boot

zfs create -o canmount=off -o mountpoint=/var rpool/redhat/NoSnap-var
zfs create -o canmount=on rpool/redhat/NoSnap-var/cache
zfs create -o canmount=off rpool/redhat/NoSnap-var/lib
zfs create -o canmount=on rpool/redhat/NoSnap-var/lib/nfs
zfs create -o canmount=on rpool/redhat/NoSnap-var/tmp

zfs create -o canmount=off -o mountpoint=none rpool/redhat/muchSnap
zfs create -o canmount=on -o mountpoint=/-USERDATA  rpool/redhat/muchSnap/-USERDATA

sys install:5 format and mount EFI, ESP

파티션 번호 주의
for i in ${DISK}; do
# 디스크의 EFI 파티션 포맷
 mkfs.vfat -n EFI ${i}-part5
# 디스크의 EFI 마운트 폴더 생성
 mkdir -p /mnt/boot/efis/${i##*/}-part5
# 디스크의 EFI 파티션 마운트
 mount -t vfat ${i}-part5 /mnt/boot/efis/${i##*/}-part5
done

# 대표 하나 마운트
mkdir -p /mnt/boot/efi
mount -t vfat $(echo $DISK | cut -f1 -d\ )-part5 /mnt/boot/efi

정리

zfs를 설치하고, 파티션을 zfs로 포맷, /mnt에 마운트 하였습니다.
다음편에서는 /mnt를 root로 취급하여 /mnt에 OS를 설치하겠습니다.

목차

  1. 준비물
  2. 디스크 파티션 및 OS install disk 생성
  3. 뭔가 이상한(?) live boot disk 만들기
  4. 이것으로 뭔가 이상한 라이브 부트 이미지로 부팅했습니다.
    boot from live image
    공식 튜토리얼에 따르면 이제 두줄 진행했어요.ㅎㅎㅎㅎㅎ
  5. zfs 패키지 준비하기 (참조: Custom Packages: rpm)
  6. boot disk 파티셔닝 (파티션 번호 주의) (참조: RHEL Root on ZFS)
  7. linux core 설치
  8. zfs disk로 chroot하여 zfs 설치 및 부트로더 설정
  9. tmpfs, swap 설정(root on zfs의 ubuntu 참조))
  10. 주의사항 – 제가 경험한 문제들 (스냅샷, grub2 pc module, dracut location, grub2-mkconfig, kernel-abi abailbility list, passwd 전 selinux 끄기, lib modules/* 사용하지 말기, pv dd로 boot pool 백업하기. )

답글 남기기

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


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

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