Bind mount bukanlah tipe sistem file, atau parameter dari sistem file yang di-mount; mereka adalah parameter dari operasi pemasangan . Sejauh yang saya tahu, urutan perintah berikut mengarah ke status sistem yang pada dasarnya identik sejauh menyangkut kernel:
mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one
Jadi satu-satunya cara untuk mengingat mount mana yang bind mount adalah log dari mount
perintah yang tersisa di /etc/mtab
. Operasi bind mount ditunjukkan oleh bind
pasang opsi (yang menyebabkan tipe sistem file diabaikan). Tapi mount
tidak memiliki opsi untuk mencantumkan hanya sistem file yang dipasang dengan serangkaian opsi tertentu. Oleh karena itu, Anda perlu melakukan pemfilteran sendiri.
mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'
Perhatikan bahwa /etc/mtab
hanya berguna di sini jika berupa file teks yang dikelola oleh mount
. Beberapa distribusi menyiapkan /etc/mtab
sebagai tautan simbolis ke /proc/mounts
alih-alih; /proc/mounts
sebagian besar setara dengan /etc/mtab
tetapi memiliki beberapa perbedaan, salah satunya adalah tidak melacak bind mount.
Satu informasi yang disimpan oleh kernel, tetapi tidak ditampilkan di /proc/mounts
, adalah saat mount point hanya menampilkan bagian dari pohon direktori pada sistem file yang di-mount. Dalam praktiknya, ini sebagian besar terjadi dengan bind mount:
mount --bind /mnt/one/sub /mnt/partial
Di /proc/mounts
, entri untuk /mnt/one
dan /mnt/partial
memiliki perangkat yang sama, jenis sistem file yang sama, dan opsi yang sama. Informasi yang /mnt/partial
hanya menampilkan bagian sistem berkas yang di-root pada /sub
terlihat dalam informasi mount point per proses di /proc/$pid/mountinfo
(kolom 4). Entri di sana terlihat seperti ini:
12 34 56:78 / /mnt/one rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered
12 34 56:78 /sub /mnt/partial rw,relatime - ext3 /dev/foo rw,errors=remount-ro,data=ordered
Mungkin ini bisa membantu:
findmnt | grep "\["
Contoh:
$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep "\["
│ └─/tmp/foo /dev/sda2[/media] ext4 rw,relatime,data=ordered
Kernel tidak menangani bind mount yang berbeda dari normal meningkat setelah fakta. Satu-satunya perbedaan dalam apa yang terjadi saat mount
berjalan.
Saat Anda memasang sistem file (mis. dengan mount -t ext4 /dev/sda1 /mnt
) kernel (sedikit disederhanakan) melakukan tiga langkah:
- Kernel mencari driver sistem file untuk tipe sistem file yang ditentukan (jika Anda menghilangkan
-t
atau gunakan-t auto
mount
menebak tipe untuk Anda dan memberikan tipe tebakan ke kernel) - Kernel menginstruksikan driver sistem file untuk mengakses sistem file menggunakan jalur sumber dan opsi apa pun yang disediakan. Pada titik ini sistem file hanya diidentifikasi oleh pasangan nomor mayor:minor.
- Sistem berkas terikat pada sebuah jalur (titik pemasangan). Kernel juga menggunakan beberapa opsi pemasangan di sini. (
nodev
misalnya adalah opsi pada mountpoint, bukan pada sistem file. Anda dapat memasang bind dengannodev
dan satu tanpa)
Jika Anda melakukan bind mount (mis. dengan mount --bind /a /b
) hal berikut terjadi:
- Kernel menyelesaikan sistem file mana yang berisi path sumber dan path relatif dari mountpoint ke direktori.
- Sistem file terikat ke mountpoint baru menggunakan opsi dan jalur relatif.
(Saya akan melewatkan mount --move
, karena tidak relevan dengan pertanyaan.)
Ini sangat mirip dengan bagaimana file dibuat di Linux:
- Kernel memutuskan sistem file mana yang bertanggung jawab atas direktori di mana file harus dibuat.
- Berkas baru dalam sistem berkas dibuat. Saat ini file hanya memiliki nomor inode.
- File baru ditautkan ke nama file di direktori.
Jika Anda membuat tautan keras, hal berikut akan terjadi:
- Kernel menyelesaikan nomor inode dari file sumber.
- File ditautkan ke nama file tujuan.
Seperti yang Anda lihat, file yang dibuat dan tautan keras tidak dapat dibedakan:
$ touch first
$ ln first second
$ ls -li
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/first
1184243 -rw-rw-r-- 2 cg909 cg909 0 Feb 20 23:56 /tmp/second
Tapi , karena Anda dapat mengidentifikasi semua hardlink ke file dengan membandingkan nomor inode, Anda dapat mengidentifikasi semua pemasangan ke sistem file dengan membandingkan jumlah pemasangan major:minor.
Anda dapat melakukannya dengan findmnt -o TARGET,MAJ:MIN
atau dengan langsung melihat /proc/self/mountinfo
(lihat dokumentasi kernel Linux untuk informasi selengkapnya).
Skrip Python berikut mencantumkan semua mount bind. Diasumsikan bahwa titik pemasangan terlama dengan jalur relatif terpendek ke akar sistem file yang dipasang adalah pemasangan asli.
#!/usr/bin/python3
import os.path, re
from collections import namedtuple
MountInfo = namedtuple('MountInfo', ['mountid', 'parentid', 'devid', 'root', 'mountpoint', 'mountoptions', 'extra', 'fstype', 'source', 'fsoptions'])
mounts = {}
def unescape(string):
return re.sub(r'\\([0-7]{3})', (lambda m: chr(int(m.group(1), 8))), string)
with open('/proc/self/mountinfo', 'r') as f:
for line in f:
# Parse line
mid, pid, devid, root, mp, mopt, *tail = line.rstrip().split(' ')
extra = []
for item in tail:
if item != '-':
extra.append(item)
else:
break
fstype, src, fsopt = tail[len(extra)+1:]
# Save mount info
mount = MountInfo(int(mid), int(pid), devid, unescape(root), unescape(mp), mopt, extra, fstype, unescape(src), fsopt)
mounts.setdefault(devid, []).append(mount)
for devid, mnts in mounts.items():
# Skip single mounts
if len(mnts) <= 1:
continue
# Sort list to get the first mount of the device's root dir (if still mounted)
mnts.sort(key=lambda x: x.root)
src, *binds = mnts
# Print bind mounts
for bindmount in binds:
if src.root == bindmount.root:
srcstring = src.mountpoint
else:
srcstring = src.mountpoint+':/'+os.path.relpath(bindmount.root, src.root)
print('{0} -> {1.mountpoint} ({1.mountoptions})'.format(srcstring, bindmount))