SlideShare a Scribd company logo
2015年度の
自宅NAS環境
ROOT ON DM-CACHE ON LVM ON DM-CRYPT
ON MD(RAID1)をNATIVE UEFI 環境でセットアップ
してみた
Hiroaki Mizuguchi
Twitter: @m_akihiro
AGENDA
初めに
UEFIネイティブなブート環境について
• Debian jessieを選んだ理由
• UEFI環境でのdm-cache/LVM/dm-crypt/RAID1なdebian install
bootloaderの冗長化について
• Gummibootと冗長化
Initramfs 回りについて
• Cryptsetup(DM-Crypt)のrootディスク暗号化
• /に対するdm-cacheの有効化
これから
初めに
自宅NASの構成変更をしたい。
• dm-cryptを使ってディスク全体を暗号化したい
• 生半可な破壊だとコロンビア号のHDDが復元された事例もあるし、
ディスク暗号化が正解。復号キーは「忘れる」 by @dankogai
• https://twitter.com/dankogai/status/545830557804802048
• 鍵の管理はどうするのか、起動時に手入力はつらい
• 復旧しやすく冗長性を確保したディスク構成にしたい
• Bootloaderも冗長化しよう
• Grub2でdm-cryptとmdを併用するとパーティション数が辛い
• UEFIならもう少し楽出来るはず
• Kernelのアップデートごとに手動で設定するのは辛い
初めに
- 構築したシステム概略図
UEFI System
sda:HDD sdb:HDD sdc:HDD Sdd:HDD
sde
SSD
sdf
USB
sda1
UEFI
sda2
RAID
sdb1
UEFI
sdb2
RAID
sdc1
UEFI
sdc2
RAID
sdd1
UEFI
sdd2
RAID
md0: RAID1 md1: RAID1
md0_crypt: dm-crypt md1_crypt: dm-crypt
sde1
crypt
sdf1
key
crypt
LVM:vg0
root
dm-cache
swap
ssd
archive
初めに
- 構築したシステム概略図
UEFI System
sda:HDD sdb:HDD sdc:HDD Sdd:HDD
sde
SSD
sdf
USB
sda1
UEFI
sda2
RAID
sdb1
UEFI
sdb2
RAID
sdc1
UEFI
sdc2
RAID
sdd1
UEFI
sdd2
RAID
md0: RAID1 md1: RAID1
md0_crypt: dm-crypt md1_crypt: dm-crypt
sde1
crypt
sdf1
key
crypt
LVM:vg0
root
dm-cache
swap
ssd
archive
UEFI bootの冗長化
Gummibootを利用し、/bootパーティションを用意しない
初めに
- 構築したシステム概略図
UEFI System
sda:HDD sdb:HDD sdc:HDD Sdd:HDD
sde
SSD
sdf
USB
sda1
UEFI
sda2
RAID
sdb1
UEFI
sdb2
RAID
sdc1
UEFI
sdc2
RAID
sdd1
UEFI
sdd2
RAID
md0: RAID1 md1: RAID1
md0_crypt: dm-crypt md1_crypt: dm-crypt
sde1
crypt
sdf1
key
crypt
LVM:vg0
root
dm-cache
swap
ssd
archive
Initramfs段階でのUSBメモリからの鍵情報取得
パスフレーズなしの起動を実装
初めに
- 構築したシステム概略図
UEFI System
sda:HDD sdb:HDD sdc:HDD Sdd:HDD
sde
SSD
sdf
USB
sda1
UEFI
sda2
RAID
sdb1
UEFI
sdb2
RAID
sdc1
UEFI
sdc2
RAID
sdd1
UEFI
sdd2
RAID
md0: RAID1 md1: RAID1
md0_crypt: dm-crypt md1_crypt: dm-crypt
sde1
crypt
sdf1
key
crypt
LVM:vg0
root
dm-cache
swap
ssd
archive
dm-cacheが有効なルート領域
DEBIAN JESSIEを選んだ理由
元々LVM on dm-crypt on MDが出来るインストーラーを持ってる
UEFIブートのGummibootがDebian jessieからパッケージ入り
• Grub2でbootloader冗長化は難しい
Linux Kernel version
• Jessieだとlinux 3.16が使用できる。
• 今後backportsで3.18以上も使えるようになるかも
• OverlayFSやearth-pt3ドライバなどが使いたい
• Wheezy: Linux 3.2、CentOS7: linux-3.10
mdadm version
• bad block management対応してほしい
• mdadm-3.3以上が必要
• wheezy: mdadm-3.2、CentOS7: mdadm-3.3
INSTALL DEBIAN JESSIE
テスト環境
• Virtualbox 4.3.20 on windows7 64bits
• Debian iso: debian-jessie-DI-rc1-amd64-netinst
• Disk構成
• HDD: sd[abcd] 8GB
• SSD: sde
• USBメモリ: sdf 256MB
インストーラーに従い手動でディスク構成を指定する
• パーティションを切り
• MDを組み
• 暗号化ディスクを作り
• LVMを組む
HDD4本
SSD
USB
MD 2組
LVM
LUKS
Grub2をどこにインストールすればいいのか分からないエラー
DEBIAN INSTALL BATTLEの始まり
• 金庫(暗号化されたLVM上のLV)の中に
• 鍵(vmlinuzとinitrdがいる/boot)が入っている状況
• インストーラーの範囲外
• 手動インストールしかない
Debian Install Battleの始まり
• インストーラーを再起動させ、resucure modeに入る
• MDも自動的に組ませることが出来る
• Mdとdm-cryptの組み合わせは非対応なので手動対応
DEBIAN INSTALL BATTLE
手動でGUMMIBOOTをインストールする
Installerのrescure modeからシェルを握る
暗号化ディスクをOpenする
• cryptsetup luksOpen /dev/md0 md0_crypt
• cryptsetup luksOpen /dev/md1 md1_crupt
• cryptsetup luksOpen /dev/sde1 sde1_crupt
LVMのVGを有効化する
• vgchange -ay
システム環境に入り、Gummibootをセットアップ
• apt-get install gummiboot # install gummiboot
• gummiboot [--path=/boot/efi] install # install bootloaer to esp
• update-gummiboot [$(uname –r)] # ブートの設定
GUMMIBOOTによる
UEFIブート
gummiboot [--path=/boot/efi] install/status/remove/update
• gummibootx64.efi やディレクトリを追加する
GUMMIBOOT
UEFI BOOT PARTITIONの構造
Gummiboot
• Only EFIStub kernel
• UEFIパーティションで完結
• ファイルコピーのみで実現
構造
• /$(cat /etc/machine-id)/$(uname –r)/
• vmlinuz, initrdの格納場所
• /EFI/
• Bootloader 本体
• UEFIアプリケーション
• /loader
• loader.conf : config file
• entries : boot設定
Bootloader本体
Kernel一式
設定ファイル一式
Arch wiki Gummiboot https://wiki.archlinux.org/index.php/Gummiboot
Debian wiki EFIStub https://wiki.debian.org/EFIStub
GUMMIBOOT
BOOTLOADERの冗長化
vmlinuzやinitramfsのインストールについて
• /usr/sbin/update-gummibootがhookされている
• /etc/kernel/post{inst,rm}.dや/etc/initramfs/post-update.dから
• /bootからvmlinuzやinitramfsをコピー&boot entry file 生成
• 設定ファイル: /etc/defaut/gummiboot
• GUMIBOOT_EFI=“/boot/efi”
• EFI Boot Partionのマウントポイント
• 複数指定できない
• GUMIBOOT_ROOT=“”
• Kernel parameterのROOTオプションに渡される
• GUMIBOOT_OPTIONS=“ro quiet”
• Kernel parameterとしてそのまま渡される
GUMMIBOOT
BOOTLOADERの冗長化
update-gummibootの複数パーティション対応
• Patch書きました。
• 同様の提案はDebian Bug Reportに上がってたがrejectされた
cd /usr/sbin
wget -O - https://gist.github.com/akihiro/cb7af7ec6865da577a68/raw/ | patch –p0
• /etc/default/gummibootのGUMMIBOOT_EFIを拡張
• ”:”区切りによる複数のパスを指定可能に
GUMMIBOOT_EFI=“/boot/efi-sda1:/boot/efi-sdb1:/boot-sdc1:/boot/efi-sdd1”
update-gummiboot-multiesp.patch https://gist.github.com/akihiro/cb7af7ec6865da577a68
Debian Bug report logs - #755978 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755978
CRYPTSETUP
- PASSPHRASEレスなBOOT
• Cryptsetupは/etc/crypttabによりboot時にマウント可能
• ただしrootのマウントに対してはハックを必要とする。
• keyfileを単に設定だけでは機能しない
• 必要な事
• cryptsetup luksAddKey /dev/md0 md0.key
• USBメモリをマウントする為のモジュール組み込み(initramfs)
• /etc/initramfs-tools/moduleへの必要モジュールの追記
• /etc/crypttabへのkeyscriptオプション追加
• Keyscriptのinitramfsへの組み込み
• update-initramfs -u
Encrypted root filesystem on Debian Wheezy https://gist.github.com/martijnvermaat/2726386
DM-CACHE
ROOTへのDM-CACHE適用
Debian jessieではLVMからdm-cacheを扱える
• man 7 lvmcache 参照
• Cache用にSSDからLVを用意し、cachepoolを作成
• lvcreate --L 1G --n cache0meta vg /dev/mapper/sde1_crypt
• lvcreate --L 6G --n cache0 vg /dev/mapper/sde1_crypt
• lvconvert --type cachepool --poolmetadata vg/cache0meta
vg/cache0
• Root用LVにcacheを有効化する
• lvconvert --type cache --cachepool vg/cache0 vg/root
• オンラインでcache化、非cache化が可能
• 戻す場合はlvremove vg/cache0で可能
ただしこのまま再起動するとrootを認識できず死ぬ
DM-CACHE
INITRAMFS再構成
initramfsにdm-cacheマウントに必要なファイル一式を入れる
• apt-get install thin-provisioning-tools
• cd /etc/initramfs-tools/hooks
• wget –O lvmcache
https://gist.github.com/akihiro/2b5ae2c55b7569f3935e/raw/
• chmod +x lvmcache
• update-initramfs –u
オリジナルからの変更点
• PREREQ変数の変更
• 前:PREREQ=“lvm2”
• 後:PREREQ=“mdadm cryptroot lvm2”
Debian User Forums: Booting Debian Jessie from an lvmcache
http://forums.debian.net/viewtopic.php?f=5&t=119644
FUTURE WORK
UEFI ネイティブな環境下での検証が出来たが
実機でうまくいくのだろうか?
• UEFIのファームウェアの出来に左右される
• $esp/EFI/boot/bootx64.efiからブートしてくれるなら問題ない
• UEFIのbootentryの登録が上手くいくなら問題ない

More Related Content

2015年度の自宅NAS環境