ubuntu zfs를 선택한 이유

왜 ubuntu를 선택했을까.
왜 zfs를 하려고 할까.

ZFS: 압도적인 성능.

cpu 요구 사양이 높아질수록 당연히 고성능 프로세서가 필요해집니다.
하지만 반대로 연산 성능 요구사양이 낮아질수록, cpu가 계산할 양이 감소할 수록 스토리지 성능이 곧 컴퓨터의 체감 성능이 되죠.

예를 들어서 설명해보겠습니다.
프로그램을 처리하는데 10초가 걸리면 0.1초만에 불러오나 0.2초만에 불러오나 큰 차이가 안납니다.
하지만 프로그램을 처리하는데 0.01초가 걸린다면, 프로그램을 불러오는 시간이 0.1초냐 0.2초냐에 따라 결과가 엄청 크게 차이나게 됩니다.

NAS 용도로 사용할 때는 두번째에 가깝습니다.
파일 공유 링크 생성이 cpu를 필요로 하겠습니까, 링크로 접속했을 때 필요하겠습니까, 파일 업로드 다운로드에 처리가 필요하겠습니까.

저는 라즈베리파이와 Qnap TS 563을 비교해보겠습니다.
ts 563도 15년 모델로, 라즈베리파이보다 cpu 성능은 고작 1.5배입니다.
큐냅은 ssd에 os가 설치되어있습니다.
읽기 속도는 15배, iops는 거의 20배에 달합니다.
당연히 라즈베리파이가 느렸죠.

zfs 위에 우분투를 설치하면 raspberrypi가 더 빨라집니다.
물론 램의 반인 2기가바이트 이상을 쓰면 sd 카드 속도로 느려지지만요..

RHEL이 더 좋은것 같다면서?

이전 글에서 기업용으로는 우분투보다 RHEL 계열이 나은것 같다는 글을 썼습니다.
이 글이 오해를 일으킬 수 있다고 생각하는데, 우분투가 나쁘다는 글이 아닙니다.
기업용으로 적합하지 않다는 글이었죠.
게다가 저는 System Engineering 방향으로 취직을 하려고 하고있습니다.
그래서 RHEL 쪽에 익숙해지면 좋겠다고 생각한 것이죠.

익숙해진 후에도 회사에서는 RHEL, 집에서는 우분투를 사용하면 헷갈릴 것 같기도 해서 통일시켜보려고 했죠.
즉, 지금 저에게는 Enterprise linux 배포판이 필요하다는 글이었습니다.

하지만.. 결국은 우분투를 설치하게 되었습니다.

RHEL 계열을 포기한 이유

  1. RHEL 계열에도 zfs를 repository에서 제공한다.
    하지만 aarch64는 없다.
  2. 빌드 방법이 제공되지만, 라즈베리파이 성능상 10~15분 걸린다.
    • 22년 9월 14일 내용 추가: 이글 작성 후에 알게 된 내용이지만, kABI-tracking kmod 스타일로 패키지를 만들면, 커널이 업데이트 되어도 다시 빌드하지 않습니다 *
  3. zfs는 여전히 개발이 활발히 진행중이고, 업데이트가 잦은 편이다.
    zfs release note.
    zfs가 출시될 때마다 ubuntu repo에 추가되지는 않겠지만, linux용 zfs는 2개월에 한번씩은 업데이트가 존재한다.
    • 22년 9월 14일 내용 추가: 놀랍게도 그 이후로 5.18, 5.19에 대응하여 업데이트 하고, 단 한번도 없었습니다. *
  4. 업데이트가 중단되는 시놀로지 피해서 넘어가는 것인데, 업데이트가 쉽지 않으면 안된다.(zfs 뿐만 아니라 eeprom도 업데이트가 되었으면 했다.)

raspberrypi에 zfs 기반 ubuntu 설치하기

업데이트를 생각하면 우분투보다 raspberrypi OS가 더 편합니다.
3개의 문장만 입력하면 os 업그레이드, rom 업그레이드, 앱 업그레이드 전부 되지요.
심지어 버전 업도..
그럼에도 우분투를 선택한 이유가 있습니다.

왜 ubuntu인가?

u-boot 때문입니다.
raspberrypi OS는 앞에서 2번째 파티션으로 부팅하게 됩니다.
반면에 raspberrypi용 rocky linux나 oracle linux, ubuntu는 첫번째 파티션부터 순서대로 부팅을 시도합니다.

u-boot 특성상 앞 파티션부터 순서대로 부팅을 시도해봅니다.
그러니까 zfs pool 파티션만 만들면 zfs pool로 부팅하기가 쉽습니다.
1번 파티션에 부트, 2번 파티션을 비우고 3번 파티션에 부팅 rootfs 파티션을 만들어 부팅,
2번 파티션에 zfspool을 만들어서 전부 마운트
모든 파일을 복사하고, bind를 하여 설정 수정, zfs 드라이버를 불러오도록 커널을 수정합니다.
재시동하면 2번파티션 zfs로 부팅이 됩니다.

원문 링크

Ubuntu 20.04 Root on ZFS for Raspberry Pi – open ZFS
open ZFS에서 라즈베리파이용으로 zfs root 설치 방법이 적혀있습니다.
저 또한 이대로 따라 하면서 전혀 문제가 없었습니다.
다만 본문을 읽어봐도 현재 하는 작업이 어떤 이유에 수행되는지에 대한 설명이 없어서 한국어로 설명해드리려고 합니다.

주의사항

제 글은 22년 5월 20일 글이고, 이후 링크의 글은 수정될 수 있습니다.
제 글을 참고하여 링크의 글 대로 수행하세요.
제 글은 과정을 설명하는 글로 모든 과정이 포함되지 않을 수 있습니다.

준비하기

제 글은 sdcard로 부팅하는 경우를 가정하였습니다.
zfs를 사용하면 arc가 작동 되서 root 파티션이 저장된 디스크의 성능은 상관이 없습니다.
ram에 읽기/쓰기 캐시가 저장되기 때문입니다.
RAM은 휘발성 저장소이니, 부팅은 느리겠지만 고작 그것을 위해 USB 포트 하나 희생은 좀 그런것 같네요.ㅎㅎ

raspberry pi용 우분투의 이미지가 부트 볼륨 4기가바이트를 요구합니다.
우리는 4기가바이트 파티션으로 부팅한 후에, 그것을 복사할 예정이므로 최소 8기가의 sdcard가 요구됩니다.

sdcard를 포맷할 우분투가 필요합니다.
img 파일의 파티션을 골라서 복사하는 windows 용 프로그램이 있다면 그것을 사용해도 좋지만, 저라면 vmware에 우분투 설치해서 하겠습니다.ㅠㅠ

부팅 디스크 만들기

먼저 부팅 디스크 구조를 설명드리겠습니다.
일반적으로 raspberrypi ubuntu는 2개의 볼륨을 갖고 있습니다
fat32의 boot. ext4의 rootfs입니다.
img 파일을 그대로 sdcard에 넣으면 256MiB의 부트 파티션과 약 4GiB의 rootfs 파티션이 생성됩니다.
그러나 우리는 2번째 파티션은 비워진 파티션으로 만들고, 3번째 파티션으로 부팅되게 만들어야 합니다.
비어있는 2번 파티션은 3번째 파티션으로 부팅한 이후에 zfs로 포맷할 파티션이기 때문이죠.
따라서 boot를 복사, img의 2번 파티션을 sdcard의 3번째 파티션으로 복사 합니다.

sdcard 포맷을 위해 우분투 pc에 raspberrypi 부팅용 sdcard를 장착합니다.
  1. raspberrypi용 우분투 압축 파일을 압축 해제하여 img 파일을 구출(?)해냅니다.
xz -d ubuntu-22.04-preinstalled-server-arm64+raspi.img.xz 

이제 우리가 작업하는 경로에는 ubuntu-22.04-preinstalled-server-arm64+raspi.img가 있습니다.

  1. ubuntu 디스크 이미지의 파티션 구조를 확인합니다.
sfdisk -d ubuntu-22.04-preinstalled-server-arm64+raspi.img

이 명령을 입력하면 아래와 같은 값이 반환됩니다.

label: dos
label-id: 0x638274e3
device: ubuntu-22.04-preinstalled-server-arm64+raspi.img
unit: sectors
ubuntu-22.04-preinstalled-server-arm64+raspi.img1  start=        2048, size=      524288, type=c, bootable
ubuntu-22.04-preinstalled-server-arm64+raspi.img2  start=      526336, size=     7129360, type=83

type=c, bootable으로 나타나는 첫번째 파티션이 fat로 포맷된 boot 볼륨입니다.
type=83인 파티션이 ubuntu 파티션입니다.
각 파티션 정보에 size=으로 용량이 나타나는데 이 값을 변수로 저장해줍니다.
이 때 용량은 상요자마다 다를 수 있습니다.
저는 부팅용 sdcard의 용량이 256으로 아주 넉넉해서 ROOT변수를 14258720으로 두배를 넣어줬습니다.

BOOT=524288
ROOT=7129360
  1. 나중에 파티션 적용할 때 사용하기 위해 파티션 정보를 파일 형태로 저장합니다.
cat > partitions << EOF
label: dos
unit: sectors

 1 : start=  2048,  size=$BOOT,  type=c, bootable
 2 : start=$((2048+BOOT)),  size=$ROOT, type=83
 3 :  start=$((2048+BOOT+ROOT)), size=$ROOT, type=83
EOF

2번 파티션과 3번 파티션의 용량은 $ROOT 변수에 설정된 값이 적용됩니다.
2번 파티션은 zfs 설정 후 부팅 볼륨이 될것이고, 3번 파티션은 ext4로 임시로 사용할 부팅 볼륨이 됩니다.

  1. 디스크 경로를 변수에 넣기

변수에 넣는 이유는, 아래에 적게 될 코드들을 그대로 복사 붙여넣기 하여 사용할수 있게 만들기 위함입니다.
먼저 lsblk를 입력하여 sdcard가 어떤 이름을 갖는지 확인합니다

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   40G  0 disk 
├─sda1   8:1    0   20G  0 part /
├─sda2   8:2    0   10G  0 part /home
├─sda3   8:3    0    4G  0 part [SWAP]
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    6G  0 part /tmp
sr0     11:0    1  4.4G  0 rom

결과로 이런 화면이 표시될텐데, 이 중에 용량을 확인하면서 sdcard를 찾습니다.

만약 sdcard를 리더기를 없이 직접 연결한 경우 sdcard의 경로가 /dev/dsa의 형식이 아니라 /dev/mmcblk 형식으로 나타날 것입니다.

# /dev/sda 형식으로 인식 된 경우
DISK='sdcard 경로'
export DISKP=${DISK}
# /dev/mmcblk 형식으로 인식 된 경우
DISK='sdcard 경로'
export DISKP=${DISK}p
  1. swap 사용 중지하기

raspberrypi에 장착할 sdcard가 사용했던 디스크인 경우 포맷에 지장이 생길 수 있습니다.
그래서 사용 중인것을 사용 못하게 하는 절차입니다.
먼저 스왑을 없앱니다.
(누가 sdcard에 스왑을 했는지 모르겠네요;;)

swapon -v
#swap을 확인,
#스왑이 있는 경우 표시됨
#표시 된 디스크 중 sdcard가 존재한다면 해제해주자.
sudo swapoff [표시된 sdcard]
  1. 기존의 zfs를 삭제해주자.
sudo zpool labelclear -f ${DISK}
  1. @@ 기존의 파티션을 삭제하자.

원문에서는 바로 삭제를 진행한다.
하지만 나는 이대로 수행이 불가능했다.
cli 환경의 linux가 아니라, desktop 환경의 linux라면 sdcard를 꽂으면 자동으로 마운트가 된다.
이 상태에서 파티션이 불가능하다.
-f옵션을 주어 강제 포맷을 시도해도 불가능하다.
먼저 sdcard가 마운트 된 대상을 확인하고, 언마운트를 해준 후에 7번을 진행한다.

#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   40G  0 disk 
├─sda1   8:1    0   20G  0 part /mnt/a
├─sda2   8:2    0   10G  0 part /mnt/b
├─sda3   8:3    0    4G  0 part [SWAP]
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    6G  0 part
sr0     11:0    1  4.4G  0 rom

이 결과에서 만약 sdcard가 sda라고 한다면 /mnt/a /mnt/b를 알아둬야 합니다.
언마운트를 합니다.

umount /mnt/a
umount /mnt/b

그러고 나서 7번을 실행합니다.

echo "label: dos" | sudo sfdisk ${DISK}
sudo partprobe
ls ${DISKP}*

이제 디스크가 깨끗해진 것을 확인할 수 있습니다.

  1. sdcard에 파티션 생성하기.

앞서서 우리는 partition이라는 파일을 생성했습니다.
해당 파일에는 3개의 파티션의 시작위치와 용량이 기록되어있죠.
이 파일을 통해 sdcard의 파티션을 지정할 예정입니다.

sudo sfdisk $DISK < partitions
  1. img 파일 연결

img 파일의 내부를 읽어올 수 있도록 가상의 장치를 생성하고, 연결합니다.
IMG 변수에는 이 가상 장치의 이름이 저장됩니다.

IMG=$(sudo losetup -fP --show \
          ubuntu-20.04.4-preinstalled-server-arm64+raspi.img)
  1. 1번 파티션을 복사합니다.
sudo dd if=${IMG}p1 of=${DISKP}1 bs=1M

IMG 디스크의 1번째 파티션을 DISK의 1번 파티션으로 복사합니다.

  1. sdcard의 2번 파티션 지우기

2번 파티션은 부팅 이후 zfs로 만들어줘야 합니다.
2번 파티션에 파일이 존재하면 2번 파티션으로 부팅이 되겠죠.
그래서 2번 파티션은 아무것도 없도록 만들어줘야 합니다.

sudo wipefs -a ${DISK}2
  1. rootfs 파티션을 sdcard의 3번 파티션에 복사해줍니다.

원래 2번에 들어갈 파티션을 3번에 복사해줍니다.
따라서 $IMG가 가리키는 loop 장치의 2번 파티션을 3번 파티션에 복사하게 됩니다.

sudo dd if=${IMG}p2 of=${DISKP}3 bs=1M status=progress conv=fsync

주의하세요. ${DISKP}는 3이고 $IMG는 2입니다.

  1. lo 언마운트 단계입니다. 무시합니다.

제 절차를 따라왔다면, 지금 켜진 우분투는 가상입니다.
가상 머신 끄고 삭제할테니, 그딴거(?) 필요 없지요.
패스.

  1. 라즈베리파이가 USB로 부팅을 하는 경우 수행해야 합니다.

전 이 부분은 안되더라구요.
mktemp -d /mnt/XXXXXXXX 명령 수행에 있어 오류가 발생하는데, 저는 sdcard니까요.
그냥 무시했습니다.

  1. sdcard로 라즈베리파이 부팅하기.

ZFS 파티션 세팅하기

  1. root 계정으로 전환합니다.
    sudo -i

  2. DISK와 DISKP 변수를 설정합니다.

#sdcard 부팅에 한합니다.
DISK=/dev/mmcblk0
DISKP=${DISK}p
  1. zfs를 설치합니다.
apt update
apt install pv zfs-initramfs
  1. 2번 볼륨을 zfs 볼륨으로 만들기.

암호화가 있다는데, 프로세싱 성능 턱없이 부족한 라즈베리파이에 무슨 암호화입니까..ㅠ
외장 디스크는 몰라도 sdcard, 루트 볼륨에는 암호화는 좀 그렇죠.

압축도 cpu를 사용하는 것이죠.
그래서 테스트를 해봤습니다.
80 MB/s의 속도로 SMB를 사용해서 쓰기를 했는데, 압축이 없는 볼륨과 비교해서 cpu 사용량은 1% 조차 증가하지 않았고, 속도도 1MB/s 정도로 아주 적게 낮아졌습니다.

압축을 사용하도록 하고, 이 풀의 하위 볼륨들을 /mnt에 마운트하도록 합니다.

zpool create \
    -o ashift=12 \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O dnodesize=auto -O normalization=formD -O relatime=on \
    -O xattr=sa -O mountpoint=/ -R /mnt \
    rpool ${DISKP}2

system installation

  1. 컨테이너 생성

마운트 할 수 없는 ROOT pool을 만듭니다.
rpool 바로 아래에 data set을 만들지 않고 ROOT를 만든 이유는 모르겠으나, 일단 이 분은 만들으라고 합니다.
이 부분은 왜 하는지 모르기 때문에, open ZFS 공식 자료를 그대로 활용하기로 했습니다.

zfs create -o canmount=off -o mountpoint=none rpool/ROOT
  1. root filesystem을 만듭니다.

랜덤한 값으로 6자리 UUID를 만들고, UUID를 넣어 root file system을 만들었습니다.
그리고 root filesystem을 생성하고 마운트 합니다.

UUID=$(dd if=/dev/urandom bs=1 count=100 2>/dev/null |
    tr -dc 'a-z0-9' | cut -c-6)

zfs create -o canmount=noauto -o mountpoint=/ \
    -o com.ubuntu.zsys:bootfs=yes \
    -o com.ubuntu.zsys:last-used=$(date +%s) rpool/ROOT/ubuntu_$UUID
zfs mount rpool/ROOT/ubuntu_$UUID
  1. root 폴더 안의 ubuntu 기본 폴더를 생성합니다.

var, usr, usr, var 등을 생성합니다.
이렇게 만드는 이유는 나중에 필요한 구간만 스냅샷에서 복원하기 위함입니다.
또 자주 스냅샷 찍을 공간과 별로 중요하지 않거나 쉽게 파일이 변경되지 않는 곳은 덜 자주 스냅샷을 찍을수도 이겠죠.

zfs create -o com.ubuntu.zsys:bootfs=no \
    rpool/ROOT/ubuntu_$UUID/srv
zfs create -o com.ubuntu.zsys:bootfs=no -o canmount=off \
    rpool/ROOT/ubuntu_$UUID/usr
zfs create rpool/ROOT/ubuntu_$UUID/usr/local
zfs create -o com.ubuntu.zsys:bootfs=no -o canmount=off \
    rpool/ROOT/ubuntu_$UUID/var
zfs create rpool/ROOT/ubuntu_$UUID/var/games
zfs create rpool/ROOT/ubuntu_$UUID/var/lib
zfs create rpool/ROOT/ubuntu_$UUID/var/lib/AccountsService
zfs create rpool/ROOT/ubuntu_$UUID/var/lib/apt
zfs create rpool/ROOT/ubuntu_$UUID/var/lib/dpkg
zfs create rpool/ROOT/ubuntu_$UUID/var/lib/NetworkManager
zfs create rpool/ROOT/ubuntu_$UUID/var/log
zfs create rpool/ROOT/ubuntu_$UUID/var/mail
zfs create rpool/ROOT/ubuntu_$UUID/var/snap
zfs create rpool/ROOT/ubuntu_$UUID/var/spool
zfs create rpool/ROOT/ubuntu_$UUID/var/www

zfs create -o canmount=off -o mountpoint=/ \
    rpool/USERDATA
zfs create -o com.ubuntu.zsys:bootfs-datasets=rpool/ROOT/ubuntu_$UUID \
    -o canmount=on -o mountpoint=/root \
    rpool/USERDATA/root_$UUID

저는 sdcard가 256기가바이트입니다.
rootfs 중 일부를 smb나 webdav로 공유하는데 사용할 예정입니다.
/share로 마운트 되는 볼륨을 만들어주었습니다.

zfs create rpool/ROOT/ubuntu_$UUID/share
  1. 동기화를 꺼서 성능을 증가시킵니다.

설명에 따르면 zfs는 굉장히 상업적이고, 충돌에 대해 안전 장치가 있다고 합니다.
그럼에도 지속적으로 보장이 필요한 데이터베이스나 NFS 서버에는 standard로 둘것을 권장하고 있습니다.

특별히 package 설치에서 성능 향상이 있다고 하더니, SMB나 webdav를 통한 파일 업로드/다운로드에서는 성능 향상을 경험하지 못했습니다.
그래서 저는 수행하지 않았습니다.

#저는 하지 않았습니다.
# zfs set sync=disabled rpool/ROOT
  1. 3번 파티션 내용을 2번 파티션으로 복사합니다.

/mnt 안에 zpool의 datasets들이 마운트 되어있습니다.
그래서 /mnt를 제외한 / 하위 폴더를 모두 /mnt 안에 복사합니다.

(cd /; tar -cf - --one-file-system --warning=no-file-ignored .) | \
    pv -p -bs $(du -sxm --apparent-size / | cut -f1)m | \
    (cd /mnt ; tar -x)

현재 라즈베리파이는 3번 파티션에서 부팅했기 때문에 3번 파티션을 지울수 없습니다.
커널에 zfs 모듈을 넣어 zfs 부팅이 가능하게 한 후에 다시시작할 예정입니다.
다시시작하게되면 2번 zfs 파티션으로 부팅이 되고, 3번 파티션을 날리면 됩니다.

system config

여기서 우리는 zfs로 부팅할 수 있게 설정할 것입니다.

  1. hostname을 설정합니다.

[HOSTNAME]에 원하는 값을 넣어서 실행합니다.

hostname [HOSTNAME]
hostname > /mnt/etc/hostname

hostname을 설정하면 host 파일도 수정해야 합니다.
vi /mnt/etc/hosts를 입력하면 나오는 화면에 다음을 추가합니다
역시 [HOSTNAME] 대신 앞에서 설정한 hostname을 적어줍니다.

127.0.1.1       [HOSTNAME]
  1. zed를 중지합니다.

systemctl stop zed

  1. 현재 시스템의 장치들을 /mnt 아래에 bind하고 root를 변경합니다.

dev, boot, proc, run, sys와 같은 중요 폴더들을 /mnt 하위에 bind하고, /mnt를 루트로 변경합니다.
이 작업을 수행한 후부터는 수정하는 파일들이 위 폴더에 해당하지 않는 경우, 3번 파티션이 아닌 2번 파티션의 파일을 수정하는 것입니다.

mount --make-private --rbind /boot/firmware /mnt/boot/firmware
mount --make-private --rbind /dev  /mnt/dev
mount --make-private --rbind /proc /mnt/proc
mount --make-private --rbind /run  /mnt/run
mount --make-private --rbind /sys  /mnt/sys
chroot /mnt /usr/bin/env DISK=$DISK UUID=$UUID bash --login
  1. apt update 및 언어/ 지역 설정
apt update
dpkg-reconfigure locales
dpkg-reconfigure tzdata

apt update로 패키지 목록을 새로고칩니다.
locale을 ko-KR.UTF-8로 변경합니다.
timezone을 서울로 변경합니다.

5번 항목은 LUKS 사용자에 한합니다.

  1. /tmp에 tmpfs로 마운트합니다.
cp /usr/share/systemd/tmp.mount /etc/systemd/system/
systemctl enable tmp.mount
  1. group을 추가합니다.

왜 하는지 모르겠습니다;;

addgroup --system lpadmin
addgroup --system sambashare
  1. zfs 마운트 순서를 결정합니다.

/var/log와 /var/tmp로 인해 순서 변경이 필요합니다.

mkdir /etc/zfs/zfs-list.cache
touch /etc/zfs/zfs-list.cache/rpool
ln -s /usr/lib/zfs-linux/zed.d/history_event-zfs-list-cacher.sh /etc/zfs/zed.d
zed -F &

이 작업을 수행하면 커서만 깜빡 거리고 아무것도 안뜹니다.
이 때 다음을 입력해줍니다.

zfs set canmount=noauto rpool/ROOT/ubuntu_$UUID
cat /etc/zfs/zfs-list.cache/rpool

zed를 중단합니다.

fg
^C #(키보드에서 ctrl과 C를 동시에 누릅니다.)

지금은 /mnt가 루트로 되어있지만, zfs로 부팅된 후에는 /가 루트가 되어야 합니다.
따라서 zfs list에서 /mnt가 포함된 경로를 /로 변경해줘야 합니다.

sed -Ei "s|/mnt/?|/|" /etc/zfs/zfs-list.cache/*
  1. 기존의 ext4 파티션을 부팅할 때 마운트 할 파티션 목록에서 제거합니다.

이것을 남겨둔 채로 3번 파티션을 지우면 부팅에 실패하게 됩니다.
vi /etc/fstab에 가셔서 LABEL=writable / ext가 포함된 행을 모두 제거합니다.
해당 행에 가서 dd를 누르면 줄이 지워집니다
지워지면 :qw를 순서대로 누르면 저장됩니다.

  1. 커널 명령을 수정합니다.
# 원본을 백업합니다.
cp /boot/firmware/cmdline.txt /boot/firmware/cmdline.txt.bak
# root의 filesystem을 ext4가 아닌 zfs임을 명시합니다. 
sed -i "s|root=LABEL=writable rootfstype=ext4|root=ZFS=rpool/ROOT/ubuntu_$UUID|" \
    /boot/firmware/cmdline.txt
sed -i "s| fixrtc||" /boot/firmware/cmdline.txt
sed -i "s|$| init_on_alloc=0|" /boot/firmware/cmdline.txt
  1. 디버깅을 넣습니다.

기본으로 디버깅 로깅하는 대신 스플래시 이미지가 표시되는데, nosplash를 설정함으로써 디버깅 정보가 표시됩니다.
/boot/firmware/cmdline.txt의 가장 뒤에 추가하는 명령을 실행합니다.

sed -i "s|$| nosplash|" /boot/firmware/cmdline.txt

첫 ZFS 부팅.

ZFS입니다.
lsblk 입력해보면 그 어떤 파티션도 /에 마운트 되지 않은 모습을 보실 수 있습니다.

  1. 계정을 root로 변경합니다.

sudo -i

  1. DISK 변수를 다시 선언합니다.

DISK=/dev/mmcblk0

  1. EXT4 파티션을 제거하고, 파티션 2를 확장합니다.
sfdisk $DISK --delete 3
echo ", +" | sfdisk --no-reread -N 2 $DISK

파티션이 확장되어도 볼륨이 확장되지 않습니다.
raspberry pi를 재시작하면 자동으로 확장됩니다.

  1. 계정을 생성합니다.

기본 계정은 계정 이름이 알려져 있으므로 위험합니다.
[YOUR_USERNAME]에 희망하는 계정 이름을 입력합니다.
다음 코드를 실행하면 희망하는 비밀번호를 묻습니다.

username=[YOUR_USERNAME]

UUID=$(dd if=/dev/urandom bs=1 count=100 2>/dev/null |
    tr -dc 'a-z0-9' | cut -c-6)
ROOT_DS=$(zfs list -o name | awk '/ROOT\/ubuntu_/{print $1;exit}')
zfs create -o com.ubuntu.zsys:bootfs-datasets=$ROOT_DS \
    -o canmount=on -o mountpoint=/home/$username \
    rpool/USERDATA/${username}_$UUID
adduser $username

cp -a /etc/skel/. /home/$username
chown -R $username:$username /home/$username
usermod -a -G adm,cdrom,dip,lpadmin,lxd,plugdev,sambashare,sudo $username
  1. 다시시작 합니다.

reboot

  1. root 계정으로 전환합니다.

sudo -i

  1. zfs 볼륨을 확장합니다.

zfs list rpool를 실행하여 확장 된 것을 확인합니다.
일반적으로 자동으로 확장되는데, 확장이 안되면 다음을 실행합니다.

DISK=/dev/mmcblk0
DISKP=${DISK}p

zpool online -e rpool ${DISKP}2
  1. ubuntu 계정을 제거합니다.
deluser --remove-home ubuntu

full software installation

  1. cloud-init을 제거합니다.
    하지 마세요.
    무선 인터넷 안됩니다.ㅎㅎ

  2. 스토리지 packge를 제거합니다.
    저거 있다고 cpu나 램 더 사용하는것 아닙니다.
    나중에 다른 linux file system 디스크가 연결되었을 때 마운트가 안되는 문제가 발생합니다.
    저는 그냥 두었습니다.

  3. upgrade

dependency를 포함해서 모두 업데이트 합니다.

apt dist-upgrade --yes
  1. log 압축 끄기
    zfs는 자체로 압축을 제공합니다.

    for file in /etc/logrotate.d/* ; do
    if grep -Eq "(^|[^#y])compress" "$file" ; then
        sed -i -r "s/(^|[^#y])(compress)/\1#\2/" "$file"
    fi
    done
  2. reboot

reboot

설치 완료!

하고 나니까 zfs를 매달 빌드 하는 한이 있더라도 RHEL을 할걸 그랬나 싶네요.
뭔가 부족한 느낌..

답글 남기기

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


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

닫기를 누르면 이용하실 수 있지만, 광고 차단은 해제해주시면 좋겠습니다.
Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock