ZFS に Arch Linux をインストール

提供: ArchWiki
2015年2月14日 (土) 20:59時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

この記事では root の ZFS ファイルシステムに Arch Linux をインストールするのに必要な手順を解説しています。この記事はビギナーズガイドの補足です。

インストール

ZFS パッケージのインストールについては ZFS#インストール を見て下さい。archiso から ZFS に Arch Linux をインストールする場合、demz-repo-archiso リポジトリを使用するのが楽です。

archzfs を archiso に埋め込む

ZFS の記事を見て下さい。

ドライブのパーティション

ZFS で使用するパーティションテーブルのタイプの選択に関する情報はビギナーズガイド#ドライブの準備を見て下さい。ZFS は GPT と MBR パーティションテーブルをサポートしています。

ZFS は自分でパーティションを管理するので、基本的なパーティションテーブルスキームだけが必要になります。ZFS ファイルシステムを含めるパーティションのタイプは bf00 か "Solaris Root" である必要があります。

パーティションスキーム

以下は MBR を使用する場合の、ZFS root セットアップの基本的なパーティションスキームの例です:

Part     Size   Type
----     ----   -------------------------
   1     512M   Ext boot partition (8300)
   2     XXXG   Solaris Root (bf00)

以下は GPT を使用する場合の例です。BIOS ブートパーティションにブートローダーが含まれます:

Part     Size   Type
----     ----   -------------------------
   1       2M   BIOS boot partition (ef02)
   1     512M   Ext boot partition (8300)
   2     XXXG   Solaris Root (bf00)

ハードウェアやブートローダーによっては他のパーティションが必要になることがあります。詳しくはビギナーズガイド#ブートローダのインストールと設定を見て下さい。

ヒント: ZFS をサポートしているブートローダーは #ブートローダーのインストールと設定 で説明しています。
警告: Several GRUB bugs (bug #42861, zfsonlinux/grub/issues/5) prevent or complicate installing it on ZFS partitions, use of a separate boot partition is recommended

ディスクのフォーマット

Format the boot partition as well as any other system partitions. Do not do anything to the Solaris partition nor to the BIOS boot partition. ZFS will manage the first, and your bootloader the second.

ZFS ファイルシステムのセットアップ

まず、ZFS モジュールがロードされていることを確認してください:

# modprobe zfs

root zpool の作成

# zpool create zroot /dev/disk/by-id/id-to-partition
警告: Always use id names when working with ZFS, otherwise import errors will occur.

必要なファイルシステムの作成

If so desired, sub-filesystem mount points such as /home and /root can be created with the following commands:

# zfs create zroot/home -o mountpoint=/home
# zfs create zroot/root -o mountpoint=/root

Note that if you want to use other datasets for system directories (/var or /etc included) your system will not boot unless they are listed in /etc/fstab! We will address that at the appropriate time in this tutorial.

スワップパーティション

ZFS#スワップボリューム を見て下さい。

root ファイルシステムの設定

First, set the mount point of the root filesystem:

# zfs set mountpoint=/ zroot

and optionally, any sub-filesystems:

# zfs set mountpoint=/home zroot/home
# zfs set mountpoint=/root zroot/root

and if you have seperate datasets for system directories (ie /var or /usr)

# zfs set mountpoint=legacy zroot/usr
# zfs set mountpoint=legacy zroot/var

and put them in /etc/fstab

/etc/fstab
# <file system>        <dir>         <type>    <options>             <dump> <pass>
zroot/usr              /usr          zfs       defaults,noatime      0      0
zroot/var              /var          zfs       defaults,noatime      0      0

Set the bootfs property on the descendant root filesystem so the boot loader knows where to find the operating system.

# zpool set bootfs=zroot zroot

Export the pool,

# zpool export zroot
警告: Do not skip this, otherwise you will be required to use -f when importing your pools. This unloads the imported pool.
ノート: This might fail if you added a swap partition above. Need to turn it off with the swapoff command.

Finally, re-import the pool,

# zpool import -d /dev/disk/by-id -R /mnt zroot
ノート: -d is not the actual device id, but the /dev/by-id directory containing the symbolic links.

If there is an error in this step, you can export the pool to redo the command. The ZFS filesystem is now ready to use.

Be sure to bring the zpool.cache file into your new system. This is required later for the ZFS daemon to start.

# cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache

if you don't have /etc/zfs/zpool.cache, create it:

# zpool set cachefile=/etc/zfs/zpool.cache zroot

Arch Linux のインストールと設定

ビギナーズガイドの手順に従ってください。ZFSonLinux を使うにあたって特別に注意が必要なことを記します。

  • まず mount コマンドを使って boot やシステムパーティションをマウント。
  • ベースシステムのインストール。
  • ビギナーズガイド#fstab の生成 で書かれている方法は ZFS の場合オーバーキルです。ZFS は基本的にパーティションを自動的にマウントするので、システムディレクトリのデータセットを作成したりしないかぎり、fstab ファイルに ZFS パーティションを記述する必要はありません。ファイルシステムの fstab を生成するときは、次のコマンドを使ってください:
# genfstab -U -p /mnt | grep boot >> /mnt/etc/fstab
  • /etc/fstab を編集:
ノート:
  • If you chose to create datasets for system directories, keep them in this fstab! Comment out the lines for the '/, /root, and /home mountpoints, rather than deleting them. You may need those UUIDs later if something goes wrong.
  • Anyone who just stuck with the guide's directions can delete everything except for the swap file and the boot/EFI partition. It seems convention to replace the swap's uuid with /dev/zvol/zroot/swap.
  • When creating the initial ramdisk, first edit /etc/mkinitcpio.conf and add zfs before filesystems. Also, move keyboard hook before zfs so you can type in console if something goes wrong. You may also remove fsck (if you are not using Ext3 or Ext4). Your HOOKS line should look something like this:
HOOKS="base udev autodetect modconf block keyboard zfs filesystems"
  • 次のコマンドで initramfs を再生成:
# mkinitcpio -p linux

ブートローダーのインストールと設定

BIOS マザーボードの場合

GRUB#BIOS システム に従ってディスクに GRUB をインストールしてください。grub-mkconfig は ZFS ファイルシステムを正しく検出できないので、grub.cfg を手動で編集する必要があります:

/boot/grub/grub.cfg
set timeout=2
set default=0

# (0) Arch Linux
menuentry "Arch Linux" {
    set root=(hd0,msdos1)
    linux /vmlinuz-linux zfs=zroot rw
    initrd /initramfs-linux.img
}

/boot パーティションを別に作成していなかった場合は、カーネルと initrd のパスを以下のように記述する必要があります:

 /dataset/@/actual/path  

例:

   linux /@/boot/vmlinuz-linux zfs=zroot rw
   initrd /@/boot/initramfs-linux.img

UEFI マザーボードの場合

UEFI ブートローダーには EFISTUBrEFInd を使ってください。ビギナーズガイド#UEFI マザーボードの場合を参照。ZFS では refind_linux.conf のカーネルパラメータには zfs=bootfszfs=zroot を含める必要があります。そうしないと ZFS からシステムが起動しません。rootrootfstype パラメータは不要です。

アンマウントと再起動

We are almost done!

# exit
# umount /mnt/boot
# zfs umount -a
# zpool export zroot

Now reboot.

警告: If you do not properly export the zpool, the pool will refuse to import in the ramdisk environment and you will be stuck at the busybox terminal.

最初に起動した後

If everything went fine up to this point, your system will boot. Once. For your system to be able to reboot without issues, you need to enable the zfs.target to auto mount the pools and set the hostid.

For each pool you want automatically mounted execute:

# zpool set cachefile=/etc/zfs/zpool.cache <pool>

Enable the target with systemd:

# systemctl enable zfs.target

When running ZFS on root, the machine's hostid will not be available at the time of mounting the root filesystem. There are two solutions to this. You can either place your spl hostid in the kernel parameters in your boot loader. For example, adding spl.spl_hostid=0x00bab10c, to get your number use the hostid command.

The other, and suggested, solution is to make sure that there is a hostid in /etc/hostid, and then regenerate the initramfs image. Which will copy the hostid into the initramfs image. To do write the hostid file safely you need to use a small C program:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>

int main() {
    int res;
    res = sethostid(gethostid());
    if (res != 0) {
        switch (errno) {
            case EACCES:
            fprintf(stderr, "Error! No permission to write the"
                         " file used to store the host ID.\n"
                         "Are you root?\n");
            break;
            case EPERM:
            fprintf(stderr, "Error! The calling process's effective"
                            " user or group ID is not the same as"
                            " its corresponding real ID.\n");
            break;
            default:
            fprintf(stderr, "Unknown error.\n");
        }
        return 1;
    }
    return 0;
}

Copy it, save it as writehostid.c and compile it with gcc -o writehostid writehostid.c, finally execute it and regenerate the initramfs image:

# ./writehostid
# mkinitcpio -p linux

You can now delete the two files writehostid.c and writehostid. Your system should work and reboot properly now.

参照