Web更新

UbuntuでZFSを使ってみよう 第7回 Ubuntu 20.04 LTS でZFS bootが可能になりました(宮崎悟氏)

2020年4月23日、Ubuntu 20.04 LTS (Focal Fossa) がリリースされました。この20.04 LTS のDesktop版イメージでは、ZFS bootが実験的機能として組み込まれています。Server 版ではまだ使用できないので注意してください。これを機に、「UbuntuでZFSを使ってみよう」の連載も再開します。

ZFS boot でインストールする方法

まず、Ubuntu 20.04 LTS のisoイメージをダウンロードします。実験するためには、VirtualBox/Hyper-V/KVMなどの仮想マシンを使うほうが良いでしょう。適当な仮想マシンを用意し、ダウンロードしたisoイメージからブートします。

1. grubメニューで先頭のインストールを選び、しばらくするとインストール画面が表示されます。ここで言語を選び、「Ubuntuをインストール」を選択します。

2.キーボードレイアウトを設定し、「続ける」ボタンを押します。

3.インストールの種類で、「高度な機能」を選択します。

4.「実験的機能:ディスクを全消去してZFSを使用する」を選択し、「OK」ボタンを押します。

5.ディスクに変更を書き込みます。パーティションがESP、swap、bpool、rpool の4つに分けられることがわかります。

6.タイムゾーンを選択します。インストール言語に「日本語」を設定していると、あらかじめ「Tokyo」が選択されます。

7.ユーザリアルネーム、マシン名、ユーザ名、パスワードを入力します。

8.以下続けると、インストールが完了します。再起動を行います。

インストールされたZFSの内容

まず、マウントされたディレクトリを確認します。ファイルシステムが vfat もしくは ZFS のファイルシステムを抜き出したものが、以下になります。

$ mount | grep -e vfat -e zfs | sort
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
/dev/sda1 on /boot/grub type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
bpool/BOOT/ubuntu_f1xlv2 on /boot type zfs (rw,nodev,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2 on / type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/srv on /srv type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/usr/local on /usr/local type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/games on /var/games type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/lib on /var/lib type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/lib/AccountsService on /var/lib/AccountsService type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/lib/NetworkManager on /var/lib/NetworkManager type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/lib/apt on /var/lib/apt type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/lib/dpkg on /var/lib/dpkg type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/log on /var/log type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/mail on /var/mail type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/snap on /var/snap type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/spool on /var/spool type zfs (rw,relatime,xattr,posixacl)
rpool/ROOT/ubuntu_f1xlv2/var/www on /var/www type zfs (rw,relatime,xattr,posixacl)
rpool/USERDATA/root_z0ox2d on /root type zfs (rw,relatime,xattr,posixacl)
rpool/USERDATA/s-miyaza_z0ox2d on /home/s-miyaza type zfs (rw,relatime,xattr,posixacl)

最初の/boot/efi はUEFIブート時に、 /boot/grub はGrub使用時の領域です。/boot が bpool、それ以外の 領域が rpool という zpoolに分けられています。

/etc/fstab を確認すると、以下のようになっています。ZFSはファイルシステム自体にマウントポイントが設定されているので、fstabに書いていなくても問題ありません。

# /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>
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=BD28-5382  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1
/boot/efi/grub  /boot/grub      none    defaults,bind   0       0
UUID=4ff87ebd-fdd6-48a0-bed1-bb2a531d6d26       none    swap    discard 0       0

bpoolは以下のような構成になっています。御存知のように、boot領域にはinitrdvmlinuz-*が配置されています。bpool/bootをマウントしているように見えますが、実際にはマウントされていません。/bootbpool/BOOT/ubuntu_f1xlv2 をマウントしています。

$ zpool status bpool
  pool: bpool
 state: ONLINE
  scan: none requested
config:

        NAME         STATE     READ WRITE CKSUM
        bpool        ONLINE       0     0     0
          sda3       ONLINE       0     0     0

errors: No known data errors
$ zfs list -r bpool
NAME                       USED  AVAIL     REFER  MOUNTPOINT
bpool                      360M  1.40G       96K  /boot
bpool/BOOT                 353M  1.40G       96K  none
bpool/BOOT/ubuntu_f1xlv2   353M  1.40G      185M  /boot
$ zfs get mountpoint,mounted bpool
NAME   PROPERTY    VALUE       SOURCE
bpool  mountpoint  /boot       local
bpool  mounted     no          -
$ zfs get mountpoint,mounted bpool/BOOT/ubuntu_f1xlv2
NAME                      PROPERTY    VALUE       SOURCE
bpool/BOOT/ubuntu_f1xlv2  mountpoint  /boot       local
bpool/BOOT/ubuntu_f1xlv2  mounted     yes         -

rpoolは以下のような構成になっています。rpool/ROOT/以下の主要領域が、rpool/USERDATA 以下にユーザのデータが配置されます。

$ zpool status rpool
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME         STATE     READ WRITE CKSUM
        rpool        ONLINE       0     0     0
          sda4       ONLINE       0     0     0

errors: No known data errors
$ zfs list -r rpool
NAME                                               USED  AVAIL     REFER  MOUNTPOINT
rpool                                             17.4G   879G       96K  /
rpool/ROOT                                        12.3G   879G       96K  none
rpool/ROOT/ubuntu_f1xlv2                          12.3G   879G     3.27G  /
rpool/ROOT/ubuntu_f1xlv2/srv                        96K   879G       96K  /srv
rpool/ROOT/ubuntu_f1xlv2/usr                      15.0M   879G       96K  /usr
rpool/ROOT/ubuntu_f1xlv2/var/games                  96K   879G       96K  /var/games
rpool/ROOT/ubuntu_f1xlv2/var/lib                  6.36G   879G     1010M  /var/lib
rpool/ROOT/ubuntu_f1xlv2/var/lib/AccountsService   656K   879G      112K  /var/lib/AccountsService
rpool/ROOT/ubuntu_f1xlv2/var/lib/NetworkManager   5.30M   879G      160K  /var/lib/NetworkManager
rpool/ROOT/ubuntu_f1xlv2/var/lib/apt              69.0M   879G     56.4M  /var/lib/apt
rpool/ROOT/ubuntu_f1xlv2/var/lib/dpkg             91.8M   879G     37.2M  /var/lib/dpkg
rpool/ROOT/ubuntu_f1xlv2/var/log                   499M   879G      133M  /var/log
rpool/ROOT/ubuntu_f1xlv2/var/mail                   96K   879G       96K  /var/mail
rpool/ROOT/ubuntu_f1xlv2/var/snap                  384K   879G      144K  /var/snap
rpool/ROOT/ubuntu_f1xlv2/var/spool                2.34M   879G      120K  /var/spool
rpool/ROOT/ubuntu_f1xlv2/var/www                    96K   879G       96K  /var/www
rpool/USERDATA                                    4.55G   879G       96K  /
rpool/USERDATA/root_z0ox2d                         476K   879G      168K  /root
rpool/USERDATA/s-miyaza_z0ox2d                    4.55G   879G     4.03G  /home/s-miyaza

ZFS boot 構成にすると、rpool/ROOT/ubuntuやユーザ名の末尾に6文字のランダム文字列が付いています。これは、外部からファイルシステムへのアクセスを容易にさせない意図があると思われます。

インストール直後にしておいたほうが良いこと

インストール直後のZFSは、初期状態のままです。最初のうちからファイルシステムに対して、重複排除(dedup) オプションを on にしておくことをお勧めします。必要に応じて圧縮や暗号化を行うなら、ファイルを書き込み始める前に行っていたほうが良いでしょう。

重複排除を有効にするには、以下のように実施します。対象ファイルシステムとして rpool を指定すると、zpool以下のすべてのZFSファイルシステムに対して設定が継承されます。dedup オプションについては後日説明します。

$ sudo zfs set dedup=on bpool rpool  

圧縮を有効にするには、以下のように実施します。圧縮オプションはgzip以外も存在します。以下のように /root のみを圧縮することも可能です。

$ sudo zfs set compression=gzip rpool/USERDATA/root_z0ox2d  

暗号化を有効にするには、以下のように実施します。暗号化方式はaes-256-gcm 以外も存在します。

$ sudo zfs set encryption=aes-256-gcm rpool/USERDATA

終わりに

今回は、Ubuntu 20.04 LTSをZFS boot状態でインストールして、ZFSの状態を確認しました。次回は、ZFS bootの採用で、どのような利点があるかを説明します。次回をお楽しみに。

さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス

関連記事一覧