「ZFS に Arch Linux をインストール」の版間の差分
(同期) |
|||
| 3行目: | 3行目: | ||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|ZFS}} |
{{Related|ZFS}} |
||
| + | {{Related|ZFS/仮想ディスク}} |
||
| − | {{Related3|Experimenting with ZFS|ZFS の実験}} |
||
| − | {{Related4|ZFS on FUSE}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
| − | この記事では |
+ | この記事では ZFS のルートファイルシステムに Arch Linux をインストールするのに必要な手順を解説しています。 |
== インストール == |
== インストール == |
||
| − | ZFS パッケージのインストールについては [[ZFS#インストール]] を見て下さい。archiso から ZFS に Arch Linux をインストールする場合、[[非公式ユーザーリポジトリ# |
+ | ZFS パッケージのインストールについては [[ZFS#インストール]] を見て下さい。archiso から ZFS に Arch Linux をインストールする場合、[[非公式ユーザーリポジトリ#archzfs|archzfs]] リポジトリを使用するのが楽です。 |
=== archzfs を archiso に埋め込む === |
=== archzfs を archiso に埋め込む === |
||
[[ZFS#archzfs パッケージを archiso に埋め込む|ZFS]] の記事を見て下さい。 |
[[ZFS#archzfs パッケージを archiso に埋め込む|ZFS]] の記事を見て下さい。 |
||
| + | |||
| + | === Arch ZFS インストールスクリプト === |
||
| + | |||
| + | 手動で ZFS を使って Arch をインストールするのは手間ですが、簡単にインストールができるスクリプトとして [https://github.com/danboid/ALEZ ALEZ] や [https://bitbucket.org/avi9526/install-raidz/src install-raidz] が存在します。 |
||
== ドライブのパーティション == |
== ドライブのパーティション == |
||
| − | ZFS で使用するパーティションテーブルのタイプの選択に関する情報は[[ |
+ | ZFS で使用するパーティションテーブルのタイプの選択に関する情報は[[パーティショニング]]を見て下さい。ZFS は GPT と MBR パーティションテーブルをサポートしています。 |
ZFS は自分でパーティションを管理するので、基本的なパーティションテーブルスキームだけが必要になります。ZFS ファイルシステムを含めるパーティションのタイプは {{ic|bf00}} か "Solaris Root" である必要があります。 |
ZFS は自分でパーティションを管理するので、基本的なパーティションテーブルスキームだけが必要になります。ZFS ファイルシステムを含めるパーティションのタイプは {{ic|bf00}} か "Solaris Root" である必要があります。 |
||
| 29行目: | 32行目: | ||
Part Size Type |
Part Size Type |
||
---- ---- ------------------------- |
---- ---- ------------------------- |
||
| − | 1 |
+ | 1 XXXG Solaris Root (bf00)</nowiki> |
| − | 2 XXXG Solaris Root (bf00)</nowiki> |
||
}} |
}} |
||
| 43行目: | 45行目: | ||
}} |
}} |
||
| − | ハードウェアやブートローダーによっては他のパーティションが必要になることがあります。詳しくは[[ |
+ | ハードウェアやブートローダーによっては他のパーティションが必要になることがあります。詳しくは[[ブートローダー]]を見て下さい。 |
{{Tip|ZFS をサポートしているブートローダーは [[#ブートローダーのインストールと設定]] で説明しています。}} |
{{Tip|ZFS をサポートしているブートローダーは [[#ブートローダーのインストールと設定]] で説明しています。}} |
||
| 121行目: | 123行目: | ||
# zpool import -d /dev/disk/by-id -R /mnt zroot |
# zpool import -d /dev/disk/by-id -R /mnt zroot |
||
| + | {{Note|{{ic|-d}} は実際のデバイス ID ではありませんが、{{ic|/dev/by-id}} ディレクトリにはシンボリックリンクが含まれています。上記のコマンドが失敗して数字の ID を使ってプールをインポートするように要求される場合、{{ic|zpool import}} を実行してプールの ID を確認してからコマンドを実行してください: {{ic|zpool import 9876543212345678910 -R /mnt zroot}}。}} |
||
| − | {{Note|{{ic|-d}} is not the actual device id, but the {{ic|/dev/by-id}} directory containing the symbolic links.}} |
||
上記のコマンドでエラーが表示される場合、プールをエクスポートしてコマンドを再実行してください。それで ZFS ファイルシステムを使用する準備が整います。 |
上記のコマンドでエラーが表示される場合、プールをエクスポートしてコマンドを再実行してください。それで ZFS ファイルシステムを使用する準備が整います。 |
||
| 135行目: | 137行目: | ||
== Arch Linux のインストールと設定 == |
== Arch Linux のインストールと設定 == |
||
| − | [[ |
+ | [[インストールガイド]]の手順に従ってください。ZFSonLinux を使うにあたって特別に注意が必要なことを記します。 |
* まず mount コマンドを使って boot やシステムパーティションをマウント。 |
* まず mount コマンドを使って boot やシステムパーティションをマウント。 |
||
| 141行目: | 143行目: | ||
* ベースシステムのインストール。 |
* ベースシステムのインストール。 |
||
| − | * |
+ | * ZFS は基本的にパーティションを自動的にマウントするので、システムディレクトリのデータセットを作成したりしないかぎり、{{ic|fstab}} ファイルに ZFS パーティションを記述する必要はありません。ファイルシステムの {{ic|fstab}} を生成するときは、次のコマンドを使ってください: |
| − | # genfstab -U -p /mnt |
+ | # genfstab -U -p /mnt >> /mnt/etc/fstab |
* {{ic|/etc/fstab}} を編集: |
* {{ic|/etc/fstab}} を編集: |
||
{{Note| |
{{Note| |
||
| − | * If you chose to create datasets for system directories, keep them in this {{ic|fstab}}! |
+ | * If you chose to create legacy datasets for system directories, keep them in this {{ic|fstab}}! |
| − | * |
+ | * Comment out all non-legacy datasets apart from the root dataset, the swap file and the boot/EFI partition. It is a convention to replace the swap's uuid with {{ic|/dev/zvol/zroot/swap}}. |
}} |
}} |
||
| 186行目: | 188行目: | ||
=== UEFI マザーボードの場合 === |
=== UEFI マザーボードの場合 === |
||
| − | UEFI ブートローダーには {{ic|EFISTUB}} や {{ic|rEFInd}} を使ってください |
+ | UEFI ブートローダーには {{ic|EFISTUB}} や {{ic|rEFInd}} を使ってください。ZFS では {{ic|refind_linux.conf}} のカーネルパラメータには {{ic|1=zfs=bootfs}} か {{ic|1=zfs=zroot}} を含める必要があります。そうしないと ZFS からシステムが起動しません。{{ic|root}} と {{ic|rootfstype}} パラメータは不要です。 |
== アンマウントと再起動 == |
== アンマウントと再起動 == |
||
| 210行目: | 212行目: | ||
root で ZFS を使う場合、root ファイルシステムのマウント時にマシンの hostid を使うことはできなくなります。2つの解決方法があります。1つは spl の hostid をブートローダーの[[カーネルパラメータ]]に記述する方法です。例えば {{ic|<nowiki>spl.spl_hostid=0x00bab10c</nowiki>}} を追加します。{{ic|hostid}} コマンドを使うことで数字を確認できます。 |
root で ZFS を使う場合、root ファイルシステムのマウント時にマシンの hostid を使うことはできなくなります。2つの解決方法があります。1つは spl の hostid をブートローダーの[[カーネルパラメータ]]に記述する方法です。例えば {{ic|<nowiki>spl.spl_hostid=0x00bab10c</nowiki>}} を追加します。{{ic|hostid}} コマンドを使うことで数字を確認できます。 |
||
| + | もしくは {{ic|/etc/hostid}} に hostid を書き出してから initramfs イメージを再生成する方法もあります。hostid は initramfs イメージにコピーされます。hostid ファイルを安全に作成するには以下の C プログラムを使う必要があります: |
||
| − | The other, and suggested, solution is to make sure that there is a hostid in {{ic|/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 <stdio.h> |
||
| 239行目: | 241行目: | ||
} |
} |
||
| − | + | {{ic|writehostid.c}} として保存してから {{ic|gcc -o writehostid writehostid.c}} でコンパイルして実行してください: |
|
# ./writehostid |
# ./writehostid |
||
# mkinitcpio -p linux |
# mkinitcpio -p linux |
||
| − | + | 上記のコマンドを実行した後は {{ic|writehostid.c}} と {{ic|writehostid}} は削除してかまいません。 |
|
== 参照 == |
== 参照 == |
||
2016年10月7日 (金) 23:19時点における版
関連記事
この記事では ZFS のルートファイルシステムに Arch Linux をインストールするのに必要な手順を解説しています。
目次
インストール
ZFS パッケージのインストールについては ZFS#インストール を見て下さい。archiso から ZFS に Arch Linux をインストールする場合、archzfs リポジトリを使用するのが楽です。
archzfs を archiso に埋め込む
ZFS の記事を見て下さい。
Arch ZFS インストールスクリプト
手動で ZFS を使って Arch をインストールするのは手間ですが、簡単にインストールができるスクリプトとして ALEZ や install-raidz が存在します。
ドライブのパーティション
ZFS で使用するパーティションテーブルのタイプの選択に関する情報はパーティショニングを見て下さい。ZFS は GPT と MBR パーティションテーブルをサポートしています。
ZFS は自分でパーティションを管理するので、基本的なパーティションテーブルスキームだけが必要になります。ZFS ファイルシステムを含めるパーティションのタイプは bf00 か "Solaris Root" である必要があります。
パーティションスキーム
以下は MBR を使用する場合の、ZFS root セットアップの基本的なパーティションスキームの例です:
Part Size Type ---- ---- ------------------------- 1 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)
ハードウェアやブートローダーによっては他のパーティションが必要になることがあります。詳しくはブートローダーを見て下さい。
ディスクのフォーマット
他のシステムパーティションと同じようにブートパーティションをフォーマットしてください。Solaris パーティションや BIOS ブートパーティションには何もしないでください。Solaris パーティションは ZFS が、BIOS ブートパーティションはブートローダーが処理します。
ZFS ファイルシステムのセットアップ
まず、ZFS モジュールがロードされていることを確認してください:
# modprobe zfs
root zpool の作成
# zpool create zroot /dev/disk/by-id/id-to-partition
必要なファイルシステムの作成
必要であれば、/home や /root などのサブファイルシステムのマウントポイントを以下のコマンドで作成できます:
# zfs create zroot/home -o mountpoint=/home # zfs create zroot/root -o mountpoint=/root
システムディレクトリ (/var や /etc など) で別のデータセットを使いたい場合、/etc/fstab にデータセットを記述しないとシステムが起動しなくなります。以下でまた触れます。
スワップパーティション
ZFS#スワップボリューム を見て下さい。
root ファイルシステムの設定
まず、ルートファイルシステムのマウントポイントを設定:
# zfs set mountpoint=/ zroot
そして、任意のサブファイルシステムを設定:
# zfs set mountpoint=/home zroot/home # zfs set mountpoint=/root zroot/root
システムディレクトリで別のデータセットを使用する場合 (/var や /usr):
# zfs set mountpoint=legacy zroot/usr # zfs set mountpoint=legacy zroot/var
/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,acl 0 0
/var ファイルシステムはアクセス制御リスト (acl) が有効であることを必要としますが、zfs ではデフォルトで無効になっています。有効にするには zfs set を使います:
# zfs set xattr=sa zroot/var # zfs set acltype=posixacl zroot/var
xattr=sa プロパティは必須ではありませんが、推奨されています。詳しくは man zfs を参照。
ルートファイルシステムに bootfs プロパティを設定してブートローダーがオペレーティングシステムの場所を認識できるようにします:
# zpool set bootfs=zroot zroot
プールをエクスポート:
# zpool export zroot
最後に、プールを再インポートしてください:
# zpool import -d /dev/disk/by-id -R /mnt zroot
上記のコマンドでエラーが表示される場合、プールをエクスポートしてコマンドを再実行してください。それで ZFS ファイルシステムを使用する準備が整います。
新しいシステムに zpool.cache ファイルをコピーします。後で ZFS デーモンを起動するのに必要になります。
# cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache
/etc/zfs/zpool.cache が存在しない場合は作成してください:
# zpool set cachefile=/etc/zfs/zpool.cache zroot
Arch Linux のインストールと設定
インストールガイドの手順に従ってください。ZFSonLinux を使うにあたって特別に注意が必要なことを記します。
- まず mount コマンドを使って boot やシステムパーティションをマウント。
- ベースシステムのインストール。
- ZFS は基本的にパーティションを自動的にマウントするので、システムディレクトリのデータセットを作成したりしないかぎり、
fstabファイルに ZFS パーティションを記述する必要はありません。ファイルシステムのfstabを生成するときは、次のコマンドを使ってください:
# genfstab -U -p /mnt >> /mnt/etc/fstab
/etc/fstabを編集:
- 初期 RAM ディスクを作成するときは、まず
/etc/mkinitcpio.confを編集してfilesystemsの前にzfsを追加してください。また、keyboardフックはzfsの前に移動して、何か問題が起こったときにコンソールにキーボードで入力できるようにしてください。また、fsckは削除できます (Ext3 や Ext4 を使わない場合)。HOOKS行は以下のようになるはずです:
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" {
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 ブートローダーには EFISTUB や rEFInd を使ってください。ZFS では refind_linux.conf のカーネルパラメータには zfs=bootfs か zfs=zroot を含める必要があります。そうしないと ZFS からシステムが起動しません。root と rootfstype パラメータは不要です。
アンマウントと再起動
あと少しです。
# exit # umount /mnt/boot # zfs umount -a # zpool export zroot
そして再起動してください。
最初に起動した後
ここまで何も問題がなければ、システムが起動するはずです。これ以降も問題なくシステムが再起動できるように、zfs.target を有効化してください。プールが自動マウントされ hostid が設定されます。
自動でマウントさせたいプールごとに以下のコマンドを実行:
# zpool set cachefile=/etc/zfs/zpool.cache <pool>
systemd でターゲットを有効化:
# systemctl enable zfs.target
root で ZFS を使う場合、root ファイルシステムのマウント時にマシンの hostid を使うことはできなくなります。2つの解決方法があります。1つは spl の hostid をブートローダーのカーネルパラメータに記述する方法です。例えば spl.spl_hostid=0x00bab10c を追加します。hostid コマンドを使うことで数字を確認できます。
もしくは /etc/hostid に hostid を書き出してから initramfs イメージを再生成する方法もあります。hostid は initramfs イメージにコピーされます。hostid ファイルを安全に作成するには以下の C プログラムを使う必要があります:
#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;
}
writehostid.c として保存してから gcc -o writehostid writehostid.c でコンパイルして実行してください:
# ./writehostid # mkinitcpio -p linux
上記のコマンドを実行した後は writehostid.c と writehostid は削除してかまいません。