
まえがき
別の都市で働く必要があるため、ラップトップを購入する必要がありました。
徐々に、それを静止した車と同期させる問題は成熟しました。
私のプロジェクトはすべてギタで実行されますが、すべてのコードが完全に私のものではないため、githubにアップロードしたくありません。
この問題を解決するために、NASの構築を開始しました。これにより、特に追加機能が提供されます。
この問題を解決するために現在利用可能なオペレーティングシステムを調査した結果、FreeNAS開発者の1人によって作成された、FreeBSDベースのFreeNASおよびDebianベースのOpenMediaVaultが最も多様であり、広く使用され、したがって開発されたという結論に至りました。
FreeNASは安定しており、便利で、柔軟性があり、一般的に優れていますが、インストールしようとしたときに、FreeBSD bsdinstallの代わりに、ディスクを選択してルートパスワードを入力するだけの完全に削除されたインストーラーを見ました:ディスクをパーティション分割することさえできません。
GELI LinuxのcryptsetupとBSD partnyが好きでした。
暗号化されたパーティションにrootを作成しようとすると、ZFSですでにrootを使用しているという事実にもかかわらず、このタスクは簡単ではないことに気付きました。
次に、FreeNASがOSではなくアプリケーションであることを証明し始めたFreeNASコミュニティと話し合った後、OMVをインストールすることにしました。
さらに、Debianは私のメインOSであり、Linuxを使用することでより簡単になると約束されました...
まったくそうではないことが判明しました。 私のような構成を作成するタスクは決して簡単ではありません。 したがって、私はこの記事を書くことにしました。
既存のリソース
ZFS for Linuxプロジェクトガイドがメインドキュメントであり、これがなければ、さらに長い時間をかける必要があります。
少なくとも簡単に見る必要があります。
ほとんどの作業を手動で行ったところ、ミラーを整理することなく、同様のタスクを実行するスクリプトに出会いました。
さて、私はまだここでcryptsetup man 、Debian暗号化ガイド 、 記事、ZFSドキュメントについて言及します (元のドキュメントへのリンクがあります)。
ZFSに関する多くの情報がFreeNASフォーラムにあります。
そして、すでにこの記事を書いている過程で、月の下では何も新しいものではないことが判明しました。
ただし、私のスキームは多少異なり、欠点と利点の両方があります。
ディスク構成スキーム
システムは、MicronとSamsung PROの2つのSSDにインストールされます(将来、それらを参照します)。
各SSDには次のパーティションスキームがあります。
part_boot
ブートローダーを含むセクション。 サイズ= 1 GB。part_system
システムのパーティション。 サイズ= 32 GB(推奨サイズ:16 GB * 2)。part_slog
-SLOGを含むセクション。 サイズ= 5 GB。
part_system
およびpart_slog
XTSモードで暗号化されます。
一般的に、次のようになります。
SSD1: [part_boot] -> [ext4] <---> SSD2 SSD1: [part_system] -> [crypto_xts] -> [zfs_mirror] <---> SSD2 SSD1: [part_slog] -> [crypto_xts] -> [zfs_zil_mirror] <---> SSD2
ZILとシステムルートは、ZFSを使用して2番目のSSDに複製されます。
準備する
- ISO Debianをダウンロードします 。
- USBフラッシュにイメージをインストールします。
設置
さらなる行動は、主にマニュアルから借用されており、私の説明の一部とともに提供されています。
すべてのコマンドがルートとして実行されることを前提としています。
ZFSのインストールに必要なcontribをsources.listに追加します
echo "deb http://ftp.debian.org/debian stretch main contrib" > /etc/apt/sources.list && apt-get update
debootstrapおよびzfs-dkmsをインストールします
apt-get install debootstrap linux-headers-$(uname -r) zfs-dkms
cryptsetupをインストールする
apt-get install cryptsetup
ランダムデータでSSDをドライブする
dd if=/dev/urandom bs=4M oflag=direct of=/dev/disk/by-id/ata-Samsung_SSD_850_PRO && blkdiscard /dev/disk/by-id/ata-Samsung_SSD_850_PRO
dd if=/dev/urandom bs=4M oflag=direct of=/dev/disk/by-id/ata-Micron_1100 && blkdiscard /dev/disk/by-id/ata-Micron_1100
250 GB SSDの場合、これには約30分かかります。
blkdiscard呼び出しは、SSD上のすべてのブロックを未使用としてマークします。
ダウンロード用のセクションを作成する
sgdisk -a1 -n1:34:2047 -t1:EF02 -n2:0:+1G -t2:8300 /dev/disk/by-id/ata-Samsung_SSD_850_PRO
sgdisk -a1 -n1:34:2047 -t1:EF02 -n2:0:+1G -t2:8300 /dev/disk/by-id/ata-Micron_1100
ここで、その後GRUBがインストールされます。
最初の小さなセクションの作成は必須です。これがないと起動しません。
システムパーティションを作成する
sgdisk -n3::+32G -t3:8300 -c3:part_system1 /dev/disk/by-id/ata-Samsung_SSD_850_PRO
sgdisk -n3::+32G -t3:8300 -c3:part_system2 /dev/disk/by-id/ata-Micron_1100
SLOGセクションを作成する
sgdisk -n4::+5G -t4:8300 -c4:part_slog1 /dev/disk/by-id/ata-Samsung_SSD_850_PRO && sgdisk -n4::+5G -t4:8300 -c4:part_slog2 /dev/disk/by-id/ata-Micron_1100
この記事では、それらは決して使用されません。
暗号化されたルートパーティションを作成する
cryptsetupにあまり精通していない場合は、Debianのドキュメントを参考にしてください。
LUKSを使用します。これにより、暗号化の作業が多少簡単になります。
cryptsetup --cipher aes-xts-plain64 --key-size 512 --verify-passphrase --hash sha512 --use-random -v luksFormat /dev/disk/by-id/ata-Samsung_SSD_850_PRO-part3
cryptsetup --cipher aes-xts-plain64 --key-size 512 --verify-passphrase --hash sha512 --use-random -v luksFormat /dev/disk/by-id/ata-Micron_1100-part3
次に、セクションを開く必要があります。
cryptsetup luksOpen /dev/disk/by-id/ata-Samsung_SSD_850_PRO-part3 root_crypt1
cryptsetup luksOpen /dev/disk/by-id/ata-Micron_1100-part3 root_crypt2
正しいパスワードを入力すると、暗号化に使用される新しいブロックデバイスが作成されます。
ZFSルートプールをホストします。
ルートZFSプールを作成する
modprobe zfs zpool create -o ashift=12 \ -O atime=off -O canmount=off -O compression=lz4 -O normalization=formD \ -O mountpoint=/ -R /mnt \ rpool mirror /dev/disk/by-id/dm-name-root_crypt*
現在、ミラー化された両方の暗号化されたパーティションを含むプールがあります。
ashiftパラメーターに関する注意ashift
指定したブロックサイズを取得するためにデュースを上げる必要がある度合い。
12は4Kブロックです。
blockdev --getbsz /dev/<disk>
コマンドblockdev --getbsz /dev/<disk>
を使用するか、デバイスの技術仕様からブロックサイズを取得できます。
ブロックサイズがディスクのセクターサイズと一致しない場合、パフォーマンスが低下します。
最新のハードドライブのセクターサイズは4Kで、セクターエミュレーションは512バイトです。
高速で低容量のSASディスク(数百GB程度)を除き、セクターサイズは512バイトのままです。
ルートFSのデータセットを作成する
zfs create -o canmount=off -o mountpoint=none rpool/ROOT
zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/debian
ルートをブート可能にする
zfs mount rpool/ROOT/debian
zpool set bootfs=rpool/ROOT/debian rpool
他のデータセットを作成する
zfs create -o setuid=off rpool/home
zfs create -o mountpoint=/root rpool/home/root
zfs create -o canmount=off -o setuid=off -o exec=off rpool/var
zfs create -o com.sun:auto-snapshot=false rpool/var/cache
zfs create rpool/var/log
zfs create rpool/var/spool
zfs create -o com.sun:auto-snapshot=false -o exec=on rpool/var/tmp
この段階で、FS構造の準備ができました。
最小システムを設定する
chmod 1777 /mnt/var/tmp
debootstrap stretch /mnt && zfs set devices=off rpool
システムを構成する
echo nas > /mnt/etc/hostname
echo "rpool/ROOT/debian / zfs defaults,noatime 0 0" > /mnt/etc/fstab
echo "tmpfs /tmp tmpfs nosuid,nodev 0 0" >> /mnt/etc/fstab
ここで/ tmpはtmpfsとしてマウントされ、/はZFS上にあります。
次に、 /mnt/etc/hosts
を修正する必要があり/mnt/etc/hosts
。 ホスト名「nas」を追加する必要があります。
そして、ネットワークインターフェース設定を/mnt/etc/network/interfaces.d
追加します(必須):
- iface_nameは、
ip addr show
アクティブなインターフェイスの名前です。 echo "auto $iface_name" > /mnt/etc/network/interfaces.d/$iface_name
echo "iface $iface_name inet dhcp" >> /mnt/etc/network/interfaces.d/$iface_name
これは重要なポイントです! これを行わないと、再起動後にネットワークやインストールされたパッケージなしで自分自身が見つかります。 しないでください-ネットワークはまだ手動で解除する必要があります。
インストール済みシステムに切り替える
mount --rbind /dev /mnt/dev && mount --rbind /proc /mnt/proc && mount --rbind /sys /mnt/sys
chroot /mnt /bin/bash --login
mount /tmp
さらに、インストールされたシステムですべての作業が行われます 。
APTを構成し、必要なパッケージをインストールする
- HTTPSトランスポートパッケージをインストールします
apt-get install apt-transport-https
オプションですが、HTTPSを使用することを好みます。 - contribリポジトリを追加します。
cat> /etc/apt/sources.list << EOF
deb https://deb.debian.org/debian stretch main contrib
deb-src https://deb.debian.org/debian stretch main contrib
Eof apt-get update
。- 必要なパッケージをインストールします。
apt-get install locales && dpkg-reconfigure locales
dpkg-reconfigure tzdata
apt-get install bash-completion man gdisk linux-headers-$(uname -r) linux-image-amd64
apt-get install cryptsetup zfs-dkms zfs-initramfs
ZFSモジュールの組み立てには、具体的な時間がかかります。
cryptsetupを構成する
必ずinitramfsに含めてください:
sed -i 's/#CRYPTSETUP=/CRYPTSETUP=y/' /etc/cryptsetup-initramfs/conf-hook
次に、/ usr / share / initramfs-tools / hooks / cryptrootのcryptrootフックを修正し、/ etc / initrmafs-tools / scripts / local-top / cryptrootのスクリプトを置き換える必要があります。
Debian Stretchのcryptsetupパッケージには2つの問題があります。
- ZFSでは機能しません。
- ロード時に、入力されたパスワードはキャッシュされません。
ZFSのバグは長い間巻き上げられており、そこに私の改善が送られてきました。
パスワードキャッシングのバグを開始して修正を送信したため、すでに修正されている可能性があります。
ただし、完全なスクリプトと差分を提供します。
/ usr / share / initramfs-tools / hooks / cryptroot diff / usr / share / initramfs-tools / hooks / cryptroot cryptroot 45a46,51 > elif [ "$type" = "zfs" ]; then > zpool="$(echo "$device"|sed 's#^/dev/zvol/##;s#\([^/]*\).*#\1#')" > for ss in $(zpool list -Pv "$zpool"); do > cdev=$(canonical_device "$ss" 2>/dev/null) || continue > devices="${devices:+$devices }$cdev" > done || return 0 375c381 < if [ "UUID=${source#UUID=}" = "$source" -a ! -b "/dev/disk/by-uuid/${source#UUID=}" ] || [ "UUID=${source#UUID=}" != "$source" -a ! -b "$source" ]; then --- > if [ "UUID=${source#UUID=}" = "$source" -a ! \( -b "/dev/disk/by-uuid/${source#UUID=}" -o -b "/dev/disk/by-partuuid/${source#UUID=}" \) ] || [ "UUID=${source#UUID=}" != "$source" -a ! -b "$source" ]; then
/ etc / initramfs-tools / scripts / local-top diff / usr / share / initramfs-tools / scripts / local-top / cryptroot cryptroot 35a36,37 > elif [ -p /dev/.initramfs/usplash_outfifo ] && [ -x /sbin/usplash_write ]; then > usplash_write "TEXT-URGENT $@" 101a104,105 > elif [ ${cryptsource#ID=} != $cryptsource ]; then > cryptsource="/dev/disk/by-id/${cryptsource#ID=}" 182c186 < local opts count cryptopen cryptremove NEWROOT --- > local opts count cryptopen cryptremove NEWROOT is_luks 183a188 > is_luks=0 199c204 < cryptkey="Please unlock disk $diskname: " --- > cryptkey="1Please unlock disk $diskname: " 244a250,252 > if [ -x /sbin/usplash_write ]; then > /sbin/usplash_write "TIMEOUT ${slumber}" || true > fi 262a271,273 > if [ -x /sbin/usplash_write ]; then > /sbin/usplash_write "TIMEOUT 15" || true > fi 291a303 > is_luks=1 304a317,337 > if [ $count -gt 1 ]; then > /bin/sleep 3 > fi > > if [ -z "$cryptkeyscript" -a "$is_luks" -eq "1" ]; then > cryptkey="Unlocking the disk $cryptsource ($crypttarget)\nEnter passphrase: " > if [ -x /bin/plymouth ] && plymouth --ping; then > cryptkeyscript="plymouth ask-for-password --prompt" > cryptkey=$(echo -e "$cryptkey") > else > cryptkeyscript="/lib/cryptsetup/askpass" > fi > fi > > if [ -n "$CACHED_PASSWORD" ]; then > if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \ > echo -n "$CACHED_PASSWORD" | $cryptopen 2>/dev/null; then > unset CACHED_PASSWORD > fi > fi > 307c340,341 < if [ ! -e "$NEWROOT" ]; then --- > if [ -z "$CACHED_PASSWORD" ]; then > CACHED_PASSWORD="`$cryptkeyscript \"$cryptkey\"`" 309,310c343,345 < $cryptkeyscript "$cryptkey" | $cryptopen; then < message "cryptsetup ($crypttarget): cryptsetup failed, bad password or options?" --- > echo -n "$CACHED_PASSWORD" | $cryptopen; then > message "cryptsetup: cryptsetup failed, bad password or options?" > unset CACHED_PASSWORD 355a391 > unset CACHED_PASSWORD 362a399,401 > > export CACHED_PASSWORD > 378a418,424 > exit_script() > { > CACHED_PASSWORD="`dd bs=512 if=/dev/random count=1 2>/dev/null `" > unset CACHED_PASSWORD > exit $1 > } > 425c471 < exit 0 --- > exit_script 0
crypttabに追加:
echo "root_crypt1 /dev/disk/by-id/ata-Samsung_SSD_850_PRO-part3 none luks,discard" >> /mnt/etc/crypttab
echo "root_crypt2 /dev/disk/by-id/ata-Micron_1100-part3 none luks,discard" >> /mnt/etc/crypttab
ここでは、ディスクはUUIDで示されていません。これは意図的に行われます。
cryptrootフック、または何らかの理由で私が修正したスクリプト(これについて)はUUIDで誤って機能し、セクションが表示されませんでした。
ブートローダーをインストールし、ルートFSを認識することを確認します
apt-get install grub-pc
grub-probe /
-「zfs」を出力する必要があります
ZFSミラーにブートローダーをインストールするための推奨オプションは、この記事で見ることができます
ブートローダーを構成し、ブートレコードにインストールする
echo GRUB_PRELOAD_MODULES=\"part_gpt zfs\" >> /etc/default/grub
echo GRUB_DISABLE_OS_PROBER=true >> /etc/default/grub
echo "export ZPOOL_VDEV_NAME_PATH=YES" > /etc/profile.d/grub2_zpool_fix.sh
ZPOOL_VDEV_NAME_PATH=YES update-grub
update-initramfs -u -k all
ブートセクションの初期化
cd && tar -C / -cf boot.tar /boot
mkfs.ext4 -L boot1 -m0 /dev/disk/by-id/ata-Samsung_SSD_850_PRO-part2
mkfs.ext4 -L boot2 -m0 /dev/disk/by-id/ata-Micron_1100-part2
ブートローダーをインストールする
mount /dev/disk/by-id/ata-Samsung_SSD_850_PRO-part2 /boot && tar -C / -xf boot.tar
update-initramfs -k all -u -t && update-grub
grub-install --bootloader-id=debian1 --recheck --no-floppy /dev/disk/by-id/ata-Samsung_SSD_850_PRO
umount /boot
mount /dev/disk/by-id/ata-Micron_1100-part2 /boot && tar -C / -xf boot.tar
update-initramfs -k all -u -t && update-grub
grub-install --bootloader-id=debian2 --recheck --no-floppy /dev/disk/by-id/ata-Micron_1100
umount /boot
ルートパスワードを設定する
passwd
スナップショットを作成する
zfs snapshot rpool/ROOT/debian@install
アンマウントして再起動する
umount /tmp
exit
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {}
zpool export rpool
reboot
インストールされたシステムを起動し、セットアップを実行します
( ONLINE):
zpool status -v
SSH .
:
zfs create rpool/home/user
adduser user
cp -a /etc/skel/.[!.]* /home/user
chown -R user:user /home/user
usermod -a -G audio,cdrom,dip,floppy,netdev,plugdev,sudo,video user
apt dist-upgrade --yes
Debian ZFS .
FAQ
?
.
:
- CPU ( ) AES-NI.
- , -.
- (preload, ).
, , , .
EFI ?
:
- , , EFI.
- /boot c grub ZFS, EFI .
ZFS ?
, , .
/boot ZFS?
, . grub .
?
Grub , (, , cryptroot).
, .
FreeBSD, ZFS " "?
, NAS WEB-. FreeBSD — , , FreeNAS.
OpenMediaVault — , Debian.
謝辞
, , Debian: , .
FreeNAS, ZFS.
, ZFS Linux.