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 /apachehttpdを実行できます。 これにより、 / home /apacheがそのプロセスのルートディレクトリ/として効果的に作成されます。 したがって、たとえば、ディレクトリ / home / apache /www/wwwになります。 このように、 httpd プロセスは、 / home /apache以外のファイルにアクセスできなくなります。 これで、chroot環境で実行されたプロセスが外部のファイルにアクセスするにはどうすればよいですか?たとえば、プロセスは / lib64 のライブラリ、および/のバイナリにアクセスする必要があります。 bin。 これを解決するために、バインドマウントを使用して、chrootディレクトリからこれらのディレクトリにアクセスできるようにすることができます。 chroot コマンドを使用するために、ディレクトリ / home /chrootを準備しましょう。 まず、ディレクトリ / home / chroot を作成し、その中にbinlib64の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つの例を見ました。