Yalnızca bağlama bağlantılarını listele


24

Kullanmak yerine kullanmak mount | grepistiyorum mount -l -t bind, ama bu işe yaramıyor ve tüm montajları -t nonegösteriyor .

Yanıtlar:


28

Bağlama bağları bir dosya sistemi türü ya da bağlanmış bir dosya sisteminin bir parametresi değildir; mount işleminin parametreleridir . Bildiğim kadarıyla, aşağıdaki komut dizileri, çekirdek söz konusu olduğunda esasen özdeş sistem durumlarına yol açmaktadır:

mount /dev/foo /mnt/one; mount --bind /mnt/one /mnt/two
mount /dev/foo /mnt/two; mount --bind /mnt/two /mnt/one

Bu yüzden hangi bağların bağlanmış bağlar olduğunu hatırlamanın tek yolu içinde mountkalan komutların kaydıdır /etc/mtab. Bir bağlama bağlama işlemi, bindbağlama seçeneğiyle gösterilir (bu, dosya sistemi türünün yoksayılmasına neden olur). Ancak mount, yalnızca belirli bir seçenek kümesine sahip dosya sistemlerini listeleme seçeneği yoktur. Bu nedenle, kendi filtrelemenizi yapmanız gerekir.

mount | grep -E '[,(]bind[,)]'
</etc/mtab awk '$4 ~ /(^|,)bind(,|$)/'

Not /etc/mtabo tarafından tutulan bir metin dosyası ise burada sadece yararlıdır mount. Bazı dağıtımlar bunun yerine /etc/mtabsembolik bir bağ olarak kurulur /proc/mounts; /proc/mountsçoğunlukla eşdeğerdir /etc/mtabancak biri bağlanma bağlarını izlemeyen birkaç farklılığı vardır.

Çekirdek tarafından tutulan, ancak /proc/mountsgösterilmeyen bir bilgi parçası, bir bağlama noktasının, bağlı dosya sistemindeki dizin ağacının yalnızca bir bölümünü gösterdiği zamandır. Uygulamada bu çoğunlukla bağlanma bağları ile olur:

mount --bind /mnt/one/sub /mnt/partial

Olarak /proc/mounts, başvuruların /mnt/oneve /mnt/partialaynı cihazı, aynı dosya sistemi türünü ve aynı seçeneklere sahiptir. /mnt/partialDosya sisteminin yalnızca kaynaklandığı kısmını gösteren bilgiler, /subişlem başına bağlama noktası bilgilerinde /proc/$pid/mountinfo(sütun 4) görünür . Buradaki girişler şöyle görünür:

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

1
Aslında @Gilles, sadece kullanarak yapabilirsiniz findmnt | fgrep [olarak burada açıklanacaktır .
aculich

@Gilles mount --versionHerhangi bir bindbilgiyi kaydeden ne kullanıyorsunuz /etc/mtab? 2.20.1 sürümünü kullanıyorum ve en son kaynaklara baktım ve hiçbir durumda grep yapmanıza izin vermeyecek herhangi bir yerde kaydedilmiş bilgileri göremiyorum bind. Öte yandan, ne de öne benim cevap aslında listesinin bağlama ile oluşturulan bağlar yapar --bindkullanarak yanı sıra bind seçeneği .
aculich

@ aculich </etc/mtab awk …POSIX uyumludur (Bourne'da desteklenip desteklenmediğini unutuyorum). Lütfen gerçeklerinizi kontrol edin. Debian kararlı üzerine monte edilmiş bir dosya sistemi seçeneğine /etc/mtabsahip olduğunu onaylayabilirim (util-linux-ng 2.17.2'den mount). bindmount --bind /source /target
Gilles 'SO- kötülük'

@Gilles Kargaşayı gidermek için hatalı yorumumu sildim. Haklısın, gerçekten POSIX uyumlu. Ayrıca şimdi biz farklı davranışlarla karşılaşır sebebini anlamak mountve /etc/mtab. Util-linux-ng'nin eski bir sürümüne sahip olan Debian stable kullanıyorsunuz; Ben artık aynı olması gibi görünüyor yeni bir sürümü olan Debian testini kullanıyorum /etc/mtab@rozcietrzewiacz neden görmedik belki olan davranışı bindin /etc/mtabyaptığı dağılımı da daha yeni bir sürümü kullanıyorsa?
aculich

1
@ aculich findmntCevap olarak yazmalısınız . Bu arada, sadece hedef dizin başka bir bağlama noktası değilse çalışır. Örneğin deneyinsudo mount --bind / foo && findmnt | grep foo
l0b0

21

Belki bu hile yapabilirdi:

findmnt | grep  "\["

Örnek:

$ mkdir /tmp/foo
$ sudo mount --bind /media/ /tmp/foo
$ findmnt | grep  "\["
│ └─/tmp/foo                     /dev/sda2[/media] ext4            rw,relatime,data=ordered

1
Görünüşe göre, bu yalnızca bir bağlama noktasının alt dizini bağlandığı zaman çalışır. Eğer /kendisi bağlama monte Örneğin, çıktı bir yok [...].
muru

8

Çekirdek, bağlamadan sonra bağları normal bağlanmalardan farklı bağlar. Çalışırken olanlarda sadece farklılıklar var mount.

Bir dosya sistemi bağladığınızda (örn. İle mount -t ext4 /dev/sda1 /mnt) çekirdek (biraz basitleştirilmiş) üç adımı gerçekleştirir:

  1. Çekirdek, belirtilen dosya sistemi türü için bir dosya sistemi sürücüsü arar (ihmal -tveya kullanım -t auto mounttahminini sizin için tahmin etmez ve kullanırsanız ve çekirdeğe tahmin edilen türü sağlarsa )
  2. Çekirdek, dosya yolu sürücüsüne kaynak yolunu ve sağlanan seçenekleri kullanarak dosya sistemine erişmesini söyler. Bu noktada, dosya sistemi yalnızca bir büyük: küçük sayı çifti ile tanımlanır.
  3. Dosya sistemi bir yola (bağlama noktası) bağlıdır. Çekirdek burada ayrıca bazı montaj seçeneklerini kullanır. ( nodevÖrneğin değil dosya sistemi üzerinde, bağlantı noktasının üzerinde bir seçenektir. Bir var bağlama ile monte edebilirsiniz nodevolmadan ve bir)

Bir bağlama montajı yaparsanız (örn. İle mount --bind /a /b), aşağıdakiler gerçekleşir:

  1. Çekirdek, hangi dosya sisteminin kaynak yolu ve bağlanma noktasından dizine olan göreli yolu içerdiğini çözer.
  2. Dosya sistemi, seçenekler ve ilgili yol kullanılarak yeni bağlama noktasına bağlanır.

(Ben atlayacağım mount --moveçünkü soru ile ilgili değil.)

Bu oldukça Linux'ta dosyaların nasıl oluşturulduğuna benzer:

  1. Çekirdek, hangi dosya sisteminin, dosyanın oluşturulacak dizinden sorumlu olduğunu çözer.
  2. Dosya sisteminde yeni bir dosya oluşturulur. Bu noktada, dosyanın yalnızca bir inode numarası vardır.
  3. Yeni dosya dizindeki bir dosya adına bağlanır.

Sert bir bağlantı yaparsanız aşağıdakiler olur:

  1. Çekirdek, kaynak dosyanın inode numarasını çözer.
  2. Dosya, hedef dosya adına bağlı.

Görebileceğiniz gibi, oluşturulan dosya ve sabit bağlantı ayırt edilemez:

$ 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

Ancak , bir dosyadaki tüm sabit bağlantıları inode numaralarını karşılaştırarak tanımlayabileceğiniz gibi, ana: küçük sayıdaki bağ sayıları karşılaştırarak tüm dosya sistemlerini bir dosya sistemine tanımlayabilirsiniz.

Bunu findmnt -o TARGET,MAJ:MINdoğrudan veya bakarak bakarak yapabilirsiniz /proc/self/mountinfo( daha fazla bilgi için Linux çekirdeği belgelerine bakın ).

Aşağıdaki Python betiği tüm bağlama bağlarını listeler. Monte edilen dosya sisteminin köküne en kısa bağıl yoluna sahip en eski mount noktasının orijinal mount olduğu varsayılmaktadır.

#!/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))

0
unset DONE1FSES
FSES=$(findmnt -vUPno SOURCE,FSROOT,TARGET,MAJ:MIN)
FSES=${FSES//MAJ:MIN/MAJ_MIN}
while read SEARCH1FS
do
  unset DONE2FSES
  eval "$SEARCH1FS"
  SEARCH1SOURCE=$SOURCE
  SEARCH1FSROOT=$FSROOT
  SEARCH1TARGET=$TARGET
  SEARCH1MAJMIN=$MAJ_MIN

  FS1WASHANDLED=0
  while read DONE1FS 
  do
    if [[ $DONE1FS == $MAJ_MIN ]]
    then
      FS1WASHANDLED=1
      break
    fi
  done < <(echo "$DONE1FSES")


  if [[ ($SEARCH1FSROOT == /) && ($FS1WASHANDLED == 0) ]]
  then
  DONE1FSES+=$MAJ_MIN$'\n'
  while read SEARCH2FS
  do
    eval "$SEARCH2FS"
    SEARCH2SOURCE=$SOURCE
    SEARCH2FSROOT=$FSROOT
    SEARCH2TARGET=$TARGET
    SEARCH2MAJMIN=$MAJ_MIN

    FS2WASHANDLED=0
    while read DONE2FS 
    do
      if [[ $DONE2FS == $SEARCH2FS ]]
      then
        FS2WASHANDLED=1
        break
      fi
    done < <(echo "$DONE2FSES")

    if [[ ($SEARCH1MAJMIN == $SEARCH2MAJMIN)  && ($SEARCH1TARGET != $SEARCH2TARGET )  && ($FS2WASHANDLED == 0 ) ]]
    then
      DONE2FSES+=$SEARCH2FS$'\n'
      echo "$SEARCH1TARGET$SEARCH2FSROOT   --> $SEARCH2TARGET"
    fi

  done < <(echo "$FSES")


  fi
done   < <(echo "$FSES")

0

Bu, diğer bulucu cevaplarına benzer, ancak biçimlendirme sorununu önler.

Tüm alt kitapları göstermek için:

findmnt --kernel -n --list | grep '\['

Ext4 tipindeki tüm dosya sistemlerini göstermek için:

findmnt --kernel -t ext4 -n --list | grep '\['

Alt montajlar dışındaki tüm bağları göstermek için:

findmnt --kernel -n --list | grep -v '\['

Submount'lar hariç tüm ext4 dosya sistemlerini göstermek için:

findmnt --kernel -t ext4 -n --list | grep -v '\['

"-N", başlıkları kaldırır ve "--list" "ağaç" biçimindeki satırları kaldırır.

Debian gerilmesinde test edildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.