GNU/Linux >> Belajar Linux >  >> Linux

Daftar hanya mengikat tunggangan

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:

  1. 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)
  2. 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.
  3. 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 dengan nodev dan satu tanpa)

Jika Anda melakukan bind mount (mis. dengan mount --bind /a /b ) hal berikut terjadi:

  1. Kernel menyelesaikan sistem file mana yang berisi path sumber dan path relatif dari mountpoint ke direktori.
  2. 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:

  1. Kernel memutuskan sistem file mana yang bertanggung jawab atas direktori di mana file harus dibuat.
  2. Berkas baru dalam sistem berkas dibuat. Saat ini file hanya memiliki nomor inode.
  3. File baru ditautkan ke nama file di direktori.

Jika Anda membuat tautan keras, hal berikut akan terjadi:

  1. Kernel menyelesaikan nomor inode dari file sumber.
  2. 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))

Linux
  1. Bagaimana Cara Memasang Sistem File, Memetakan Userid?

  2. Hanya Root yang Dapat Dipasang, Mengapa?

  3. Bind mount pengguna SFTP setelah menggunakan chroot

  1. Bind mount di Linux

  2. Cara Mount dan Unmount Filesystem/Partition di Linux (Contoh Perintah Mount/Umount)

  3. Daftar semua tunggangan di Linux

  1. Baca hanya bind-mount?

  2. Bagaimana cara mengizinkan non-pengguna super untuk memasang sistem file apa pun?

  3. Mengapa mount tidak menghargai opsi read only untuk bind mount?