debootstrapを使ってdebianをインストールする

Created on 2018-04-13


開発機のセットアップ方法。 久々にやったら、割とトラブったのでメモ。

改めて書き出してみると、TUIのインストーラをポチポチしながらやったほうが早いなって思った。 ubuntuのインストーラは/homeを暗号化するか聞いてくる場面があったような気がするけど、debianはどうなんだろう。

要件

Parition Layout

sda (ssd, OS用)
sda1: EF02 BIOS boot partition :
sda2: 8304 Linux x86-64 root   : /
sdb (ssd, データ用)
sdb1: 8300 Linux filesystem    : /var, /srv
sdc (hdd, データ用)
sdc1: 8300 Linux filesystem    : /home

手順

# 適当なlive usbでマシンを起動するか、既存のlinuxマシンにssdとhddを接続する。

# 鍵を生成
dd if=/dev/random bs=1 count=8192 of=/tmp/key

# ターゲットパーティションを初期化
# sd{a,b,c}をGPTで初期化。
# sdaの34~2047セクタにBIOS boot partionを作成しておくこと。
gdisk /dev/sda
gdisk /dev/sdb
gdisk /dev/sdc
# 暗号化しておく
cryptsetup luksFormat /dev/sdb1 /tmp/keys/sdb1
cryptsetup luksFormat /dev/sdc1 /tmp/keys/sdc1
cryptsetup open /dev/sdb1 sdb1luks --key-file /tmp/key
cryptsetup open /dev/sdc1 sdc1luks --key-file /tmp/key
# filesystemを作成
mkfs.btrfs /dev/sda2
mkfs.btrfs /dev/mapper/sdb1luks
mkfs.btrfs /dev/mapper/sdc1luks
# btrfs subvolumesを作成する。
mkdir /mnt/sd{a2,b1,c1}
mount /dev/sda2 /mnt/sda2
mount /dev/mapper/sdb1luks /mnt/sdb1luks
mount /dev/mapper/sdc1luks /mnt/sdc1luks
btrfs subvolume /mnt/sda2/root
btrfs subvolume /mnt/sdb1luks/var
btrfs subvolume /mnt/sdb1luks/srv
btrfs subvolume /mnt/sdc1luks/home
umount -r /mnt
rmdir /mnt/*

# /mnt に新しいシステムのディレクトリをマウントする。
mount /dev/sda2 /mnt -o noatime,nodiratime,subvol=root
mkdir /mnt/{var,srv,home}
mount /dev/sdb1 /mnt/var -o noatime,nodiratime,subvol=var
mount /dev/sdb1 /mnt/srv -o noatime,nodiratime,subvol=srv
mount /dev/sdc1 /mnt/home -o noatime,nodiratime,subvol=home

# 鍵を保存する
# これ忘れるとマウントできなくる....
mkdir /mnt/boot
cp -a /tmp/key /mnt/boot/key
chmod -w /mnt/boot/key
chattr +i /mnt/boot/key

# base packagesをインストールする。
# --arch引数を忘れずに。
debootstrap --arch amd64 /mnt sid http://debian-mirror.sakura.ne.jp/

# chrootする
mkdir -p /mnt/{dev,proc,sys}
mount -o bind /dev /mnt/dev
mount -t proc proc /mnt/proc
mount -t sysfs sysfs /mnt/sys
chroot /mnt /bin/bash

##############################
# これ以降は、chrootの内部
##############################

# rootユーザのパスワード設定
# これ設定しておかないと、再起動後、ログインできずに詰む。
passwd

# マウント出来るようにする
cat >/etc/fstab <<EOS
# <source device>   <mount point>   <type>   <options>
UUID=xxxx           /               btrfs     noatime,nodiratime,ssd,subvol=root   0 1
UUID=xxxx           /var            btrfs     noatime,nodiratime,ssd,subvol=var    0 2
UUID=xxxx           /srv            btrfs     noatime,nodiratime,ssd,subvol=srv    0 2
UUID=xxxx           /home           btrfs     noatime,nodiratime,subvol=home       0 2
EOS
cat >/etc/crypttab <<EOS
# <target name>   <source device>   <key file>   <options>
ssd-var           UUID=xxxx         /boot/key
hdd-home          UUID=xxxx         /boot/key
EOS

# ネットワーク周りの設定
echo -n hostname >/etc/hostname
hostname -F /etc/hostname
vi /etc/hosts
vi /etc/resolv.conf
vi /etc/network/interfaces

# contribとnon-freeを使えるようにしておく
vi /etc/apt/sources.list
apt update

# kernel, grub, firmware
apt install linux-image-amd64 grub-pc firmware-linux-nonfree

# グラボが刺さってる場合は、ドライバを入れておく。
# これ忘れると、画面が付かないからめんどくさい
apt install firmware-amd-graphics
apt install nvidia-detect

# 多分要らないと思うけど、念の為・・・
# 起動してくれないとめんどくさいし・・・
grub-install /dev/sda
update-grub
update-initramfs -u -k all

# 設定の不備がないことを祈りながら再起動。

##############################
# これ以降は、新規インストールしたOSにrootでログインした状態
##############################

# 異常がないか確認
lsblk
mount
ip a
journalctl -b0
systemctl list-units

# timezoneを変更
dpkg-reconfigure tzdata
# localsを変更
# 初めから en_US.UTF-8 になっていると思うので、これは要らないはず。
dpkg-reconfigure locales

# 最低限必要なパッケージをインストール
apt install rsync openssh-{client,server} xorg xutils i3 tmux zsh vim-gtk3 \
    git make python3-pip htop iotop snapper

# snapperの設定
vi /etc/snapper/configs/{root,var,home}

# ユーザを作る
# dotfilesを配置
# ~/.local/lib/ にいくつかのソフトウェアをインストール