春雨日記 about me tags

我が家の録画サーバーことProLiant DL160はOSごとRAID5のアレイ上に置くという運用をしていたのですが,あまりにもランダムアクセス性能が低く,加えてチェックや同期が入ると頻繁にハングアップするという致命的な不具合(?)も持ち合わせていたため,コンテナやコンテンツはそのままOSのみHDDシングル運用とする事にしました.

現在の状態

Mount Point Disk
/ /dev/md0p1
/boot /dev/sdb2
/boot/efi /dev/sdb1
/var/rec /dev/sda1
/var/lib/machines/jellyfin /var/sdf1

ちょっと複雑ですが,要はRAIDアレイがrootfs,/boot周りはUSBメモリ,Jellyfinコンテナと録画置き場には専用のHDDを付与という状態になってます.

RAIDアレイから起動するにはベーシックなメディアが必要なのでこの時点でもうめんどくさいという…

理想の状態

新しいディスクを追加するお金もないのでJellyfin専用のディスクをrootfsにしてコンテナは直置きという風に変更しようと思います.

また,この際ブート用USBメモリを取り払ってrootと同じディスクに置くことにします.

図にするとこんな感じ

Mount Point Disk
/ /dev/sdf3
/boot /dev/sdf2
/boot/efi /dev/sdf1
/oldroot /dev/md0p1
/var/rec /dev/sda1
/var/lib/machines/epgstation /oldroot/var/lib/machines/epgstation
/var/lib/machines/gitea /oldroot/var/lib/machines/gitea
/var/data /oldroot/var/data

下3つはどういう事かというと,bindでoldrootから持ってきます.これによって大きな変更なくRAIDと共存できるという寸法です.

ではこの状態に持っていくのを目標に作業を行いましょう.

今更ですがOSはUbuntu Server 20.04 LTSです.

1. 新しいディスクを用意

先にjellyfinはアーカイブにして退避しときます.

1
2
cd /var/lib/machines
tar cvzf /var/data/jellyfin.tar.gz jellyfin

パーティショニングを行います. ディスクをsdfとすると,

パーティション サイズ フォーマット 用途
sdf1 512M vfat ESP
sdf2 2G ext4 boot
sdf3 残り全部 ext4 root

こんな感じに.まあお好みで.

2. コピー

フォーマットが完了したら,いい感じにコピーしていきます.

コピーといえばcpを思い浮かべるかもしれませんが,特定のディレクトリを除外するのが面倒らしいのでrsyncを使います.

1
2
3
4
5
6
7
8
9
mount /dev/sdf3 /mnt
rsync -a / /mnt/ --exclude '/tmp/' --exclude '/mnt/' --exclude '/proc/' --exclude '/run/' --exclude '/sys/' --exclude '/dev/' --exclude '/var/data/'  --exclude '/var/lib/machines/' --exclude '/var/rec/' --exclude '/boot/'
cd /mnt
mkdir -p dev sys proc run tmp boot oldroot var/lib/machines var/data var/rec
mount /dev/sdf2 ./boot
cp -ar /boot/* ./boot
rm -rf ./boot/efi/*
mount /dev/sdf1 ./boot/efi
cp -ar /boot/efi/* ./boot/efi/ #横着

3. 各種設定

新rootfsができたので合わせて設定していきます.

3.1 fstab

ここは各自で完全に違うと思うのであれですが,/と/bootと/boot/efiを新しい物のUUIDに変えます.

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/md0p1 during curtin installation
PARTUUID=""         / ext4 defaults 0 1
# /boot was on /dev/sdb2 during curtin installation
PARTUUID=""         /boot ext4 defaults 0 1
# /boot/efi was on /dev/sdb1 during curtin installation
PARTUUID=""         /boot/efi vfat defaults 0 1
#/swap.img      none    swap    sw      0       0

/dev/disk/by-id/md-uuid--part1 /oldroot/ ext4 defaults 0 1

#binds
/oldroot/var/data                                       /var/data                               none    rw,bind  0 0
/oldroot/var/lib/machines/gitea                    /var/lib/machines/gitea            none    rw,bind  0 0
/oldroot/var/lib/machines/epgstation               /var/lib/machines/epgstation       none    rw,bind  0 0

#rec
PARTUUID=""       /var/rec  ext4            rw,relatime     0 2

3.2 GRUB

grubのエントリがすべて古い物を向いているので変えます.

1
2
3
4
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
chroot /mnt
update-grub
exit

ありがとう: https://superuser.com/questions/615956/how-can-i-specify-a-different-disk-to-be-root-in-grub-cfg-when-running-grub-mkco

md上のUbuntuが登録されてしまいますが実害は無いのでスルー.

あとはアーカイブにしたJellyfinを書き戻すとか.(省略)

いざ再起動

1
2
umount -R /mnt
reboot

どうなるかはお楽しみです.

私の場合マウントポイント作り忘れとかでエラー出ました.

しかしEFIになってからブートローダーがコピーだけで入って助かりますね.しかもたくさんのエントリを持てるという.

初期の頃は難しくてだめだわとか思ってましたがもう今では逆にBIOS-BOOTをやりたくない笑

ちなみに,現在のrootfsのディスクがこちら

留め方適当すぎてウケる(ウケない)

しかもAppleの取り外し品という.まあHGSTなら大丈夫だろう…