Findmnt bağlama bağlarını nasıl listeleyebilir?


11

Birçok insan Linux'un bağlama bağları hakkında bilgi tutmadığını söylüyor, bu yüzden bunların ve kaynaklarının bir listesini almanın bir yolu yok. İşte bazı örnekler:

  • dan Buradaki yorumların biri :

    IIRC bu bilgi hiçbir yerde tutulmaz: sonra mount --bind, iki kopya eşdeğerdir, diğerinden daha “orijinal” olan bir tane yoktur. Ne de olsa zaten sökülmüş olsaydı orijinal olamazdı /mnt.

  • dan bu sitede bir cevap :

    Bu nedenle, hangi bağların bağlama bağları olduğunu hatırlamanın tek yolu, bırakılan bağlama komutlarının günlüğüdür /etc/mtab. Bir bağlama bağlama işlemi, bağlama bağlama seçeneği ile belirtilir (dosya sistemi türünün yok sayılmasına neden olur). Ancak mount'un yalnızca belirli bir dizi seçenekle bağlanmış dosya sistemlerini listeleme seçeneği yoktur.

  • dan bir Debian hata raporu :

    Bu kasıtlı. Her iki bağlama noktası da her yönden tamamen eşittir, böylece çekirdek onları ayırmak için herhangi bir bayrak tutmaz.

Yukarıda da saçma. Araç findmnt, bağlama bağlarının kaynak yollarını listeleyebilir (şeklinde device[source-path]; Ayrıca cihazı değil, yalnızca kaynak yolunu listelemeye çalışıyorum ). Linux çekirdeği bağlama bağını korumak istiyorsa, bu bilgilerin bir yerde saklanması gerekir , aksi takdirde bunun /homebağlı olduğunu bilemez /users. Peki bu veriler nerede? RAM'de belirsiz bir bölgede mi depolanıyor? Bir yere mi findmntbakıyor /proc?


Hangi sürümünü kullanıyorsunuz findmntve hangi seçenekleri sunuyorsunuz? Benimki böyle çıktı almıyor ve kullanmakta _PATH_PROC_MOUNTINFOolduğu kaynak koduna bakarak, /proc/self/mountinfoiçinde bu bilgilere sahip olmayan görünüyor .
Bratchley

Tamam /proc/self/mountinfonispeten yakın zamanda yeniden yapılandırıldı sanırım . Daha önce yol bilgisine sahip olmayan RHEL6 makinemdeydim ama RHEL7 makinem yapıyordu ve bağlantınızda belirtildiği gibi Wheezy de yapıyor.
Bratchley

Saçma değil: eski çekirdeklerde doğruydu, ancak yeni çekirdekler bilgiyi izliyor.
Gilles 'SO- kötü olmayı kes

@Gilles Peki, bir dizinin diğerine bağlandığı bilgi izlenmezse, bir bağlama bağı nasıl devam edebilir?
Melab

@Melab Aslında, bir bağlama montajı olup olmadığını takip etmezseniz bağlama montajının devam etmesi daha kolaydır. Ne zaman /dev/Amonte edilir /Bve yapmanız mount --bind /B /C, eski çekirdekler sadece hatırlamak /B → /dev/Ave /C → /dev/Aonlar arasında herhangi bir ilişki hatırlamıyorum, /Bve /C. Yani demontajın /Bdoğal olarak hiçbir etkisi yoktur /C. Daha yeni çekirdekler /Cbunun bağlama noktası /Bolduğunu hatırlar , ancak bağlantısızsa /Cçalışmaya devam etmesini engellemeyen bir şekilde, /Bnasıl olduğunu tam olarak bilmiyorum.
Gilles 'SO- kötü olmayı kes'

Yanıtlar:


12

Biraz yanlış anladınız; iki bağlama noktası, izinler, bayraklar vb. bakımından eşittir . Ama hala farklılar .

Eğer bakarsanız, /proc/self/mountinfobu süreç için bağ dünyasının çekirdek görünümünü görürsünüz (ad alanları işleri daha karmaşık hale getirir; montaj tablosunun yalnızca bir görünümü yoktur).

man 5 procbu dosyanın biçimini açıklar, ancak ağaç hiyerarşisini ve bağlama bağlarının "üst" öğelerinin nerede olduğunu görebilirsiniz. Bu, findmntayrıştırılan dosyadır .


9

Linux, hangi bağlantının bağlama bağlaması olduğu hakkında bilgi tutmaz . Bağlama bağlantıları da dahil olmak üzere tüm bağlantı noktaları hakkında bilgi tutar .

Sert bağlantılara oldukça benzer. Dosya adları gibi dosya sistemlerine bağlantıyı düğümlere bağlar. Tek fark, bağların aynı zamanda bağlama noktası bayraklarına sahip olmaları ve dosya sistemi kökü yerine hedef dosya sisteminin bir alt dizinine işaret edebilmeleridir.

Bir sabit bağlantı oluşturduğunuzda, dosya sistemi hangi dosya adının orijinal ve hangisinin sabit bağlantı olduğunu kaydetmez. Her ikisi de aynı inode anlamına gelir. Orijinal dosyanın bağlantısını kaldırırsanız, dosyayı doğrudan ikinci dosya adıyla oluşturduysanız durum ayırt edilemez.

Bağlama bağlantılarına geri dön: Çekirdek, dosya sistemini (bir büyük: küçük sayı çifti tarafından tanımlanır), bağlama noktasını, dosya sistemi köküne göre yolu ve bazı bayrakları içeren bir tablo tutar. Bu listeye bakarak erişebilirsiniz /proc/self/mountinfo. (@ Stephen-harris'in de belirttiği gibi, ad alanları söz konusu olduğunda daha karmaşık hale gelir). findmntbu listeyi ayrıştırır.

Kökünüz /dev/sda1majör ise: minör 8:1ve koştuğunuz mount --bind /a /b /proc/self/mountinfoşuna benzer çizgiler içerir:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro

Eğer senin /homeolduğunu /dev/sda2majör ile: minor 8:2ve Çalıştırmak mount --bind /home /usersbu gibi görünecektir:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw

Sorunuzla ilgili sütunlar üçüncü, dördüncü ve beşinci sütunlardır. Bunlar dosya sistemi kimliğidir ( gerçek dosya sistemleri için ana cihazla aynıdır: küçük; tmpfs gibi sanal dosya sistemleri için [0: counter ]), bağlantı noktasına bağlı dosya sistemi köküne göre (genellikle / normal bağlar, bağlama bağları için herhangi bir şey olabilir) ve bağlama noktası.
Kalan sütunların anlamları için Linux çekirdek belgelerine bakın .

findmnt"FSROOT" dosya sistemi köküne göre kaynak yolunu çağırır. Bunu findmnt -o TARGET,FSROOTalmak için kullanabilirsiniz . Mutlak kaynak yolunu istiyorsanız, muhtemelen /proc/self/mountinfokendiniz ayrıştırmanız ve aynı dosya sistemi için bağlarla ilgili bilgileri birleştirmeniz gerekir .

Daha fazla bilgi için , "Yalnızca bağlama bağlarını listele" yanıtına bakın .


Eğer /proc/self/mountinfoiçerebilir hatları gibi 2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro, daha sonra Linux kesinlikle yok bağlamak bağlar hakkında bilgi tutun.
Melab

Hayır. İkinci örneğime bak. Hangi dosya sisteminin monte edildiğini ve dosya sistemi köküne göre hangi yolun monte edildiğini tutar . Yani için mount --bind /home/melab /mntçıkan hat aşağıdakilerden bağlı herhangi gibi görünebilir /homeve /home/melaba bağlantı noktasının olduğu 3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw, 3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
cg909

/Dördüncü sütundakinden farklı bir şeyin genellikle bağlama bağını işaret ettiği doğrudur . Ama aynı zamanda bir Btrfs alt hacmi de olabilir.
cg909

Is /dev/sda3monte gerekiyordu /home/melab?
Melab

Evet. Benim örnekte kullandığım /dev/sda1olarak /, /dev/sda2yanı /homeve /dev/sda3sıra/home/melab
cg909
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.