web-dev-qa-db-ja.com

再起動せずにchroot後にsys / fs / cgroup / systemdをアンマウントする

背景:通常のLVM-on-LUKS Debian 9( "Stretch")インストールをコピーする方法を模索していますZFS-on-LUKSインストールを実現するために、サムドライブ(「ソースドライブ」)をZFSでフォーマットされたドライブ(「ターゲットドライブ」)に書き込みます。私のプロセスは this HOWTO に基づいています。* ZFSの側面は、サポートしたい問題とは無関係であると思いますが、重要な場合に備えて言及します。

プロセスの一部として、Stretchがソースドライブから実行されている間に、ターゲットZFSルート(_/_)ファイルシステムを_/mnt_にマウントします。次に、再帰的にバインドします。

  • _/dev_から_/mnt/dev_
  • _/proc_から_/mnt/proc_
  • _/sys_から_/mnt/sys_へ。

次に、_/mnt_にchrootします。

(将来、_/mnt_にchrootされたときに、_update-initramfs_、_update-grub_などを実行して、_/boot_パーティションのコンテンツを構成する予定です。)

次にchrootを終了すると、問題が発生します。 _/mnt/dev_および_/mnt/proc_をアンマウントできることがわかりましたただし_/mnt/sys_はできません。後者は_/mnt/sys/fs/cgroup/systemd_を含んでいるため、アンマウントを拒否します。これは、何らかの理由でシステムが「使用中」と見なしているためです。 ZFSドライブを再フォーマットして再起動すると問題は解決しますが、学習と文書化のプロセスの反復が大幅に遅くなります。

私の質問は:

-再起動せずにchroot後に_/mnt/sys_をアンマウントするにはどうすればよいですか?

-失敗(_umount: /mnt/sys/fs/cgroup/systemd: target is busy_)は予想されますか?そうでない場合、どのソフトウェアに対してバグレポートを提出する必要がありますか: mountcgroupssystemdLinux kernel 、または何か他の?

これが(私が思う)a 最小限の実例 です。 (これを再現するのが困難で、ステップを逃したと思われる場合は、お知らせください。)最初に、ボイラープレート:

_# Activate the ZFS kernel module
/sbin/modprobe zfs

# Set variables
BOOT_POOL=bpool
ROOT_POOL=rpool
DIRS_TO_COPY=(boot bin etc home lib lib64 opt root sbin srv usr var)
FILES_TO_COPY=(initrd.img initrd.img.old vmlinuz vmlinuz.old)
VIRTUAL_FILESYSTEM_DIRS=(dev proc sys)

## Partition target drive
# 1MB BIOS boot partition
sgdisk -a2048 -n1:2048:4095     -t1:EF02 $1 -c 1:"bios_boot_partition"
wait
# 510MB partition for /boot ZFS filesystem
sgdisk -a2048 -n2:4096:1052671  -t2:BF07 $1 -c 2:"zfs_boot_partition"
wait
# Remaining drive space, except the last 510MiB in case of future need:
# partition to hold the LUKS container and the root ZFS filesystem
sgdisk -a2048 -n3:1052672:-510M -t3:8300 $1 -c 3:"luks_zfs_root_partition"
wait

# Before proceeding, ensure /dev/disk/by-id/ knows of these new partitions
partprobe
wait

# Create the /boot pool
zpool create -o ashift=12            \
             -O atime=off            \
             -O canmount=off         \
         -O compression=lz4      \
         -O normalization=formD  \
             -O mountpoint=/boot     \
             -R /mnt                 \
             $BOOT_POOL "$1"-part2
wait

# Create the LUKS container for the root pool
cryptsetup luksFormat "$1"-part3               \
                      --hash sha512            \
                      --cipher aes-xts-plain64 \
              --key-size 512
wait

# Open LUKS container that will contain the root pool
cryptsetup luksOpen "$1"-part3 "$DRIVE_SHORTNAME"3_crypt
wait

# Create the root pool
zpool create -o ashift=12           \
             -O atime=off           \
             -O canmount=off        \
             -O compression=lz4     \
             -O normalization=formD \
             -O mountpoint=/        \
             -R /mnt                \
             $ROOT_POOL /dev/mapper/"$DRIVE_SHORTNAME"3_crypt
wait

# Create ZFS datasets for the root ("/") and /boot filesystems
zfs create -o canmount=noauto -o mountpoint=/      "$ROOT_POOL"/debian
zfs create -o canmount=noauto -o mountpoint=/boot  "$BOOT_POOL"/debian

# Mount the root ("/") and /boot ZFS datasets
zfs mount "$ROOT_POOL"/debian
zfs mount "$BOOT_POOL"/debian

# Create datasets for subdirectories
zfs create                     -o setuid=off              "$ROOT_POOL"/home
zfs create -o mountpoint=/root                            "$ROOT_POOL"/home/root
zfs create -o canmount=off     -o setuid=off  -o exec=off "$ROOT_POOL"/var
zfs create -o com.Sun:auto-snapshot=false                 "$ROOT_POOL"/var/cache
zfs create                                                "$ROOT_POOL"/var/log
zfs create                                                "$ROOT_POOL"/var/mail
zfs create                                                "$ROOT_POOL"/var/spool
zfs create -o com.Sun:auto-snapshot=false     -o exec=on  "$ROOT_POOL"/var/tmp
zfs create                                                "$ROOT_POOL"/srv
zfs create -o com.Sun:auto-snapshot=false     -o exec=on  "$ROOT_POOL"/tmp

# Set the `bootfs` property. ***TODO: IS THIS CORRECT???***
zpool set bootfs="$ROOT_POOL"/debian "$ROOT_POOL"

# Set correct permission for tmp directories
chmod 1777 /mnt/tmp
chmod 1777 /mnt/var/tmp
_

そして、これが問題の核心部分です:

_# Copy Debian install from source drive to target drive
for i in "${DIRS_TO_COPY[@]}"; do 
    rsync --archive --quiet --delete /"$i"/ /mnt/"$i"
done
for i in "${FILES_TO_COPY[@]}"; do
    cp -a /"$i" /mnt/
done
for i in "${VIRTUAL_FILESYSTEM_DIRS[@]}"; do
    # Make mountpoints for virtual filesystems on target drive
    mkdir /mnt/"$i"
    # Recursively bind the virtual filesystems from source environment to the
    # target. N.B. This is using `--rbind`, not `--bind`.
    mount --rbind /"$i"  /mnt/"$i"
done

# `chroot` into the target environment
chroot /mnt /bin/bash --login

# (Manually exit from the chroot)

# Delete copied files
for i in "${DIRS_TO_COPY[@]}" "${FILES_TO_COPY[@]}"; do
    rm -r /mnt/"$i"
done

# Remove recursively bound virtual filesystems from target
for i in "${VIRTUAL_FILESYSTEM_DIRS[@]}"; do
    # First unmount them
    umount --recursive --verbose --force /mnt/"$i" || sleep 0
    wait
    # Then delete their mountpoints
    rmdir /mnt/"$i"
    wait
done
_

この最後のステップで、次のことがわかります。

_umount: /mnt/sys/fs/cgroup/systemd: target is busy
    (In some cases useful info about processes that
     use the device is found by lsof(8) or fuser(1).)
_

役立つ場合:findmntは、完全なsysツリーが2回マウントされていることを示します。1回は_/sys_で、もう1回は_/mnt/sys_でマウントされます。

*Debian Jessie Root on ZFS、 CC BY-SA 3. 、by Richard Laager and George Melikov

6
sampablokuper

追加する必要がありますmount --make-rslave /mnt/"$i"最初のマウントコマンドの後に、それらのマウントポイントの正しい伝播フラグを設定します。

これらは、chroot環境内で行われた変更からホストを保護し、あなたのようなブロック状況を防ぐのに役立ちます。

5
Mio Rin