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 mount
kalan komutların kaydıdır /etc/mtab
. Bir bağlama bağlama işlemi, bind
bağ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/mtab
o tarafından tutulan bir metin dosyası ise burada sadece yararlıdır mount
. Bazı dağıtımlar bunun yerine /etc/mtab
sembolik bir bağ olarak kurulur /proc/mounts
; /proc/mounts
çoğunlukla eşdeğerdir /etc/mtab
ancak biri bağlanma bağlarını izlemeyen birkaç farklılığı vardır.
Çekirdek tarafından tutulan, ancak /proc/mounts
gö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/one
ve /mnt/partial
aynı cihazı, aynı dosya sistemi türünü ve aynı seçeneklere sahiptir. /mnt/partial
Dosya sisteminin yalnızca kaynaklandığı kısmını gösteren bilgiler, /sub
iş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 --version
Herhangi bir bind
bilgiyi 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 --bind
kullanarak 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/mtab
sahip olduğunu onaylayabilirim (util-linux-ng 2.17.2'den mount). bind
mount --bind /source /target
mount
ve /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ışı bind
in /etc/mtab
yaptığı dağılımı da daha yeni bir sürümü kullanıyorsa?
findmnt
Cevap 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:
-t
veya kullanım -t auto
mount
tahminini 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 nodev
olmadan 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:MIN
doğ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 .