バインドマウントについて
1. 概要
Linuxでデバイスをマウントするプロセスでは、コマンドmountおよびumountを使用します。 ただし、バインドマウントと呼ばれる別のマウントポイントタイプがあります。 このチュートリアルでは、バインドマウントとは何かを学習し、それを使用できる場合の例もいくつか示します。
2. マウントの概要
まず、mountコマンドについて簡単に要約してみましょう。 Linuxシステムでは、mountコマンドを使用してディレクトリにデバイスをマウントできます。 これにより、デバイスのファイルシステムにアクセスできます。 デバイス/dev /sdc1で表されるUSBスティックを/mnt / usb にマウントし、その内容を一覧表示してみましょう。
$ mkdir /mnt/usb
$ mount /dev/sdc1 /mnt/usb
$ ls /mnt/usb
appendix.pdf pictures/
マウントしたばかりのUSBスティックにファイルとフォルダがあることがわかります。 これで、 findmnt –real を使用して、マウントされているすべてのデバイスを一覧表示できます。
$ findmnt --real
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda2 ext4 rw,relatime
├─/home /dev/sdb1 ext4 rw,relatime
├─/mnt/usb /dev/sdc1 vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,errors=remount-ro
└─/boot/efi /dev/sda1 vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,errors=remount-ro
ご覧のとおり、システムにはUSBスティックを含む4つのデバイスがマウントされています。 各デバイスには、デバイスのファイルシステムにアクセスできるターゲットディレクトリがあります。 最後に、USBスティックをアンマウントできます。
$ umount /dev/sdc1
3. バインドマウント
前のセクションで見たように、通常、デバイスをディレクトリにマウントします。 ただし、別のディレクトリにディレクトリをマウントすることもできます。 これを行うには、 mountコマンドを–bindパラメーターとともに使用します。 バインドマウントはエイリアスと考えることができます。 たとえば、ディレクトリ / tmp /fooを/tmp / bar にバインドマウントすると、両方が同じコンテンツを参照します。 / tmp /barから/tmp / foo 内のファイルにアクセスでき、その逆も可能です。 バインドマウントソースとして任意のディレクトリを使用できます。 ソースディレクトリがデバイスのマウントポイントである場合、デバイス全体が宛先ディレクトリにバインドマウントされます。 代わりに、ソースがデバイスのサブディレクトリである場合、デバイスはそのサブディレクトリからバインドマウントされます。 –bind パラメーターを使用すると、ソースディレクトリ内のマウントポイントは再マウントされません。 したがって、ディレクトリとそのディレクトリ内のすべてのサブマウントをバインドマウントする場合は、代わりに –rbindパラメータを使用する必要があります。 バインドマウントを実行した後、ターゲットディレクトリの元のコンテンツにアクセスできなくなります。 デバイスをマウントするときにも同じことが起こります。 いくつかのファイルを含むディレクトリ/tmp /fooを作成しましょう。
$ mkdir /tmp/foo
$ touch /tmp/foo/bind_mount_example
$ touch /tmp/foo/baeldung
次に、 / tmp / bar ディレクトリを作成し、 / tmp /fooディレクトリをバインドマウントします。
$ mkdir /tmp/bar
$ mount --bind /tmp/foo /tmp/bar
それでは、両方のフォルダのコンテンツを見てみましょう。
$ ls -l /tmp/foo
total 0
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 baeldung
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 bind_mount_example
$ ls -l /tmp/bar
total 0
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 baeldung
-rw-r--r-- 1 baeldung users 0 Oct 30 19:26 bind_mount_example
両方のフォルダのコンテンツが同じであることがわかります。 / tmp / barに新しいファイルを作成してみましょう。コンテンツには、/ tmp /fooからもアクセスできることがわかります。
$ echo "new file" > /tmp/bar/new_file
$ cat /tmp/foo/new_file
new file
findmnt –real を使用して、バインドマウントを含むすべてのマウントポイントを一覧表示できます。
$ findmnt --real
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda2 ext4 rw,relatime
├─/home /dev/sdb1 ext4 rw,relatime
├─/boot/efi /dev/sda1 vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,errors=remount-ro
└─/tmp/bar /dev/sda2[/tmp/foo] ext4 rw,relatime
最後に、 / tmp /barのマウントを解除しましょう。
$ umount /tmp/bar
4. ユースケース
このセクションでは、バインドマウントを使用する場合の2つの例を示します。 1つは、マウントポイントによって隠されたファイルにアクセスする方法を提供します。 もう1つは、 chroot 環境で作業するときに便利で、外部のファイルにアクセスできます。
4.1. マウントポイントによって隠されたファイルへのアクセス
デバイスをディレクトリにマウントすると、そのディレクトリの以前のコンテンツがマウントポイントによって非表示になります。 したがって、従来の方法では元のコンテンツにアクセスできなくなります。 ただし、前のセクションから、 –bind パラメータを使用すると、mountはソースディレクトリのサブマウントをバインドしないことを学びました。 したがって、この機能を使用して非表示のファイルにアクセスできます。 / mnt / usb ディレクトリがあり、USBスティックをまだマウントしていないとします。 その上にいくつかのファイルを書いてみましょう:
$ echo baeldung > /mnt/usb/hidden_file_example
$ ls /mnt/usb
hidden_file_example
次に、USBスティックをマウントすると、hidden_file_exampleファイルがリストされていないことがわかります。
$ mount /dev/sdc1 /mnt/usb
$ ls /mnt/usb
appendix.pdf pictures/
これで、バインドマウントを使用してhidden_file_exampleファイルにアクセスできます。 最初に/tmp / oldmnt ディレクトリを作成してから、新しいディレクトリに /mntのバインドマウントを実行します。
$ mkdir /tmp/oldmnt
$ mount --bind /mnt /tmp/oldmnt
次に、 / tmp / oldmnt /usbに元の/mnt /usbのコンテンツが表示されます。
$ ls /tmp/oldmnt/usb
hidden_file_example
$ cat /tmp/oldmnt/usb/hidden_file_example
baeldung
お気づきのとおり、バインドマウントを実行するときは、ソースディレクトリとして /mntを使用しました。 これは、 –bindパラメーターがサブマウントのみを無視するためです。 / mnt / usb を使用した場合、USBスティックを / tmp /oldmntにバインドマウントします。 最後に、 / mnt /usbと/tmp /oldmntの両方のマウントポイントをアンマウントしましょう。
$ umount /mnt/usb /tmp/oldmnt
4.2. chroot環境外でのファイルへのアクセス
バインドマウントを使用する場合のもう1つの例は、chroot環境内にディレクトリをマウントすることです。 chroot は、がプロセスに限定的な分離を提供するプログラムです。 chroot を使用すると、プログラムの実行時にルートディレクトリを設定できます。 たとえば、 chroot を使用して、ルートディレクトリ / home /apacheでhttpdを実行できます。 これにより、 / home /apacheがそのプロセスのルートディレクトリ/として効果的に作成されます。 したがって、たとえば、ディレクトリ / home / apache /wwwは/wwwになります。 このように、 httpd プロセスは、 / home /apache以外のファイルにアクセスできなくなります。 これで、chroot環境で実行されたプロセスが外部のファイルにアクセスするにはどうすればよいですか?たとえば、プロセスは / lib64 のライブラリ、および/のバイナリにアクセスする必要があります。 bin。 これを解決するために、バインドマウントを使用して、chrootディレクトリからこれらのディレクトリにアクセスできるようにすることができます。 chroot コマンドを使用するために、ディレクトリ / home /chrootを準備しましょう。 まず、ディレクトリ / home / chroot を作成し、その中にbinとlib64の2つのディレクトリを作成します。
$ mkdir /home/chroot
$ mkdir /home/chroot/bin
$ mkdir /home/chroot/lib64
次に、マウント /binを/home / chroot / bin にバインドし、 /lib64を/home / chroot /lib64にバインドします。
$ mount --bind /bin /home/chroot/bin
$ mount --bind /lib64 /home/chroot/lib64
最後に、 chroot を使用して、ルートディレクトリを / home /chrootに変更できます。
$ chroot /home/chroot
これで、ルートディレクトリとして / home /chrootを持つシェルができました。 ls を使用して、ルートのコンテンツを一覧表示してみましょう。
$ ls -l /
total 16
drwxr-xr-x 2 0 0 4096 Oct 29 21:47 bin
drwxr-xr-x 8 0 0 12288 Oct 29 17:02 lib64
$ ls -l /bin/bash
-rwxr-xr-x 1 0 0 1218032 May 5 16:37 /bin/bash
$ ls -l /lib64/libc-*.so
-rwxr-xr-x 1 0 0 2173576 Aug 17 20:03 /lib64/libc-2.33.so
ご覧のとおり、 chroot 環境内にあり、 /binと/lib64にのみアクセスできます。 また、ファイルの内部からファイルを一覧表示することもできます。
5. 結論
この記事では、mountコマンドの簡単な紹介から始めました。 次に、バインドマウントとその使用方法について学習しました。 最後に、バインドマウントを使用すると便利な場合の2つの例を見ました。