Yanıtlar:
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
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 .
</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
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?
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
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
/kendisi bağlama monte Örneğin, çıktı bir yok [...].
Ç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:
-tveya kullanım -t auto mounttahminini sizin için tahmin etmez ve kullanırsanız ve çekirdeğe tahmin edilen türü sağlarsa )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:
(Ben atlayacağım mount --moveçünkü soru ile ilgili değil.)
Bu oldukça Linux'ta dosyaların nasıl oluşturulduğuna benzer:
Sert bir bağlantı yaparsanız aşağıdakiler olur:
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))
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")
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.
findmnt | fgrep [olarak burada açıklanacaktır .