RancherOSをEFI,raid,lvm上にインストールするためのメモ

## RancherOSをEFI,raid,lvm上にインストールするためのメモ

* 参考記事

https://blog.hugopoi.net/2020/03/01/install-rancheros-on-freenas-11-3/

https://pyopyopyo.hatenablog.com/entry/20160604/p1

https://kitkatayama.hatenablog.com/entry/2019/04/09/230012

* 本稿で作成したスクリプトのリポジトリ

https://github.com/Yougain/rancher_os_efi

* まず、RancherOSのisoにEFIを載せる。UbuntuのisoからEFIを流用する。

　\# wget https://releases.rancher.com/os/v1.5.8/rancheros.iso
　\# wget https://releases.ubuntu.com/jammy/ubuntu-22.04.1-live-server-amd64.iso
　\# mkdir tmpubuntu tmprancheros tmprancheros_dest
　\# mount ubuntuserverlive.iso tmpubuntu
　\# mount rancheros.iso tmprancheros
　\# fallocate -l 250M rancheros.img
　\# gdisk rancheros.img
　　　o,y,n,enter,enter,ef00,w,Y
　\# losetup --partscan --show --find rancheros.img
　\# mkfs.fat /dev/loop2p1
　\# mount /dev/loop2p1 rancheros_dest
　\# cp -ar tmprancheros/* tmprancheros_dest/
　\# cp -ar tmpubuntu/boot/grub tmprancheros_dest/boot/
　\# cp -ar tmpubuntu/EFI tmprancheros_dest/
　\# vi tmprancheros_dest/boot/grub/grub.cfg
```
set timeout=30
set default=1

loadfont unicode

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry "Install Rancher" {
    linux   /boot/vmlinuz-$KERNEL_VER-rancher nomodeset vga=775 video=1280x1024 rancher.autologin=tty1 rancher.autologin=ttyS0 rancher.autologin=ttyS1 console=tty1 console=ttyS0 console=ttyS1 printk.devkmsg=on panic=10 ---
    initrd  /boot/initrd-$RANCHEROS_VER
}
grub_platform
if [ "$grub_platform" = "efi" ]; then
menuentry 'Boot from next volume' {
    exit 1
}
menuentry 'UEFI Firmware Settings' {
    fwsetup
}
else
menuentry 'Test memory' {
    linux16 /boot/memtest86+.bin
}
```
　\# mkisofs -r -V "rancheros" -cache-inodes -J -l -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table  -o rancheros.efi.iso tmprancheros_dest
　\# umount tmprancheros_dest
　\# losetup -d /dev/loop2
　\# umount tmpubuntu tmprancheros
　\# cp rancheros.efi.iso /mnt/c/Users/.../Downloads (WSLの場合)

* rancheros.efi.isoをWindowsのRufusなどでUSBメモリに焼く。
* このUSBメモリでサーバーを起動する。
* 自動ログインするので、コンソールに以下を打ち込む。

　\$ sudo ros console switch ubuntu -f
　\$ sudo passwd rancher
　　rancher↵
　　rancher↵
* あとは適当なリモート端末からログインして作業(DHCPで取得したIPを記録しておく)

　\$ ssh x.x.x.x -l rancher
　　Password: rancher↵
　\$ sudo bash
　\# apt-get update; apt-get install -y gdisk lvm2 dosfstools mdadm
　\# gdisk /dev/sda
　　x↵ l↵ 1↵ m↵ (コマンド入力、アライメントの変更)
　　n↵ 1↵ ↵ 2047↵ ef02↵ (MBR領域, /dev/sda1)
　　x↵ l↵ 2048↵ m↵ （アライメントを元に戻す)
　　n↵ 2↵ ↵ +256M↵ ef00↵ (EFI領域, /dev/sda2)
　　n↵ 3↵ ↵ +8G↵ 8200↵ (swap領域, /dev/sda3)
　　n↵ 4↵ ↵ +1G↵ fd00↵ (boot領域, /dev/sda4)
　　n↵ 5↵ ↵ +1280G↵ fd00↵ （root領域, /dev/sda5）
　　n↵ 6↵ ↵ ↵ fd00↵ （データ用, /dev/sda6）
　　w↵ y↵
* raid1をまず1個だけで構成する（後でドライブを追加すればいい）。
　\# mdadm --create /dev/md125 --level=1 --metadata=1.0 --raid-devices=2 /dev/sda4 missing
　\# mdadm --create /dev/md126 --level=1 --metadata=1.2 --raid-devices=2 /dev/sda5 missing
　\# mdadm --create /dev/md127 --level=1 --metadata=1.2 --raid-devices=2 /dev/sda6 missing
* フォーマットとLVMの構成
　\# mkfs.ext4 -L RANCHER_BOOT /dev/md125
　\# mkswap -L RANCHER_SWAP /dev/sda3
　\# mkfs.vfat -F32 -n EFI /dev/sda2
* udevを立ち上げてにシェルに入ってlvmの作業をする
　\# system-docker exec -it udev bash
　\# vgcreate vg0 /dev/md126
　\# lvcreate -n lv0 --size=1T vg0（サイズは全体の8割程度,snap領域を残す）
　\# exit (udevを抜ける)
* この後、/dev/vg0/lv0の実体としての/dev/mapper/vg0-lv0と/dev/dm-0が同じデバイス番号であることを確認しておく
　\# ls -l /dev/mapper/vg0-lv0
　brw-rw---- 1 root disk 252, 0 Jan 16 05:11 /dev/mapper/vg0-lv0
　\# ls -l /dev/dm-0
　brw-rw---- 1 root disk 252, 0 Jan 16 05:00 /dev/dm-0
* 公開鍵の登録
　\# echo -n -e "#cloud-config\nssh_authorized_keys:\n  - " > cloud-config.yml
　\# echo "[公開鍵]" >> cloud-config.yml
* インストール（終了時にrebootするか聞かれるので、noを入力）
　\# ros install -t  gptsyslinux -c cloud-config.yml -a rancher.state.mdadm_scan -a rancher.state.lvm_scan -d /dev/sda -p /dev/dm-0 (/dev/vg0/lv0を指定するとエラーが出る)
　Installing from rancher/os:v1.5.8
　Continue [y/N]: y↵
　...
　Continue with reboot [y/N]: n↵
* インストール先に作成されたbootディレクトリをboot領域にコピー
　\# mount /dev/dm-0 /opt
　\# mount /dev/md125 /mnt
　\# cp -ra /opt/boot/* /mnt
　\# mkdir /mnt/efi
　\# umount /opt
　\# umount /mnt
* EFIのコピーとgrubメニューの追加（インストーラUSBがsdbの場合）
　\# mkdir /mnt/efipart && mount /dev/sda2 /mnt/efipart
　\# mkdir /mnt/installer && mount /dev/sdb1 /mnt/installer
　\# cp -r /mnt/installer/EFI /mnt/efipart
　\# vi /mnt/efipart/EFI/BOOT/grub.cfg
```
set timeout=1
set gfxmode=1280x1024x16
set gfxpayload=keep
menuentry "Rancher from GPT" {
    search --no-floppy --set=root --label RANCHER_BOOT
    linux    /vmlinuz-4.14.138-rancher nomodeset vga=775 video=1280x1024 printk.devkmsg=on rancher.state.mdadm_scan rancher.state.lvm_scan rancher.state.dev=LABEL=RANCHER_STATE rancher.state.wait panic=10 console=tty1 console=ttyS0
    initrd    /initrd-v1.5.8
}
```
　\# reboot
* rancherOSをインストールした/dev/sdaから起動する
* ログイン後fstabに/bootと/boot/efiを登録する
　\# ros config set mounts '[["/dev/md125","/boot","ext4",""],["/dev/sda2","/boot/efi","vfat",""]]'

* 失敗したら、USBインストーラーで立ち上げて、ディスク先頭をゼロクリアしてやりなおす
　\$ sudo bash
　\# dd if=/dev/zero of=/dev/sda bs=1G count=10 &
　\[1] xxxx（プロセス番号）
　\# kill -s SIGUSR1 xxxx （SIGUSR1で実行経過を表示）
　\# reboot
* gdiskのところで、"Found invalid MBR and corrupt GPT. What do you want to do?"と聞かれたら、2を選択する（Create blank GPT）

* lvmのsnapshot機能を使うには、以下のコマンドを実行する
　\# system-docker exec -it udev bash
　\# ros service enable kernel-extras
　\# ros service up kernel-extras
　\# modprobe dm-snapshot
　\# lvcreate -s -L 100G -n snap /dev/mapper/vg0-lv0
　\# exit (udevを抜ける)
　\# mount /dev/vg0/snap /mnt

* snapshotを削除する
　\# umount /mnt
　\# system-docker exec -it udev bash
　\# lvremove /dev/vg0/snap
　\# exit