Bağlama montajı nedir?


325

“Bağlama bağlantısı” nedir? Nasıl yaparım? Bu ne için iyi?

Bana bir şey için bağlama bağını kullanmam söylendi, ama ne olduğunu veya nasıl kullanılacağını anlamıyorum.


2
bağlar ve sembolik bağlantılar arasında faydalı alternatif açıklama: quora.com/…
Charlie Parker

Yanıtlar:


564

Bağlama montajı nedir?

Bir bağlama bağlama bir dizin ağacının alternatif görünümüdür. Klasik olarak, montaj, bir depolama cihazının bir dizin ağacı olarak görülmesini sağlar. Bağlama bağlaması bunun yerine varolan bir dizin ağacını alır ve farklı bir nokta altında çoğaltır. Bağlama bağındaki dizinler ve dosyalar orijinal ile aynıdır. Bir taraftaki herhangi bir değişiklik hemen diğer tarafa yansır, çünkü iki görünüm aynı verileri gösterir.

Örneğin, Linux komutunu verdikten sonra

mount --bind /some/where /else/where

dizinler /some/whereve /else/whereaynı içeriğe sahip.

Sert bir linkten veya sembolik linkten farklı olarak, bir mount mount dosya sisteminde depolananları etkilemez. Canlı sistemin bir özelliği.

Ciltleme montajını nasıl oluşturabilirim?

bindfs

bindfsDosya sistemi bir olan FUSE bir dizin ağacının görünüm oluşturur dosya sistemi. Örneğin, komut

bindfs /some/where /else/where

/else/whereiçeriğinin /some/wheregörünür olduğu bir montaj noktası yapar .

Bindfs ayrı bir dosya sistemi olduğundan, dosyalar /some/where/foove /else/where/foouygulamalara farklı dosyalar olarak görünür (bindfs dosya sistemi kendi st_devdeğerine sahiptir). Bir taraftaki herhangi bir değişiklik diğer tarafa “sihirli bir şekilde” yansımıştır, ancak dosyaların aynı olduğu gerçeği yalnızca bir kişinin ciltleyicilerin nasıl çalıştığını bildiği durumlarda ortaya çıkar.

Bindfs'in bağlama noktaları hakkında bilgisi yoktur, bu nedenle altında bir bağlantı noktası varsa, altında /some/wheresadece başka bir dizin olarak görünür /else/where. Altına bir dosya sisteminin montajı veya sökülmesi , karşılık gelen dizinin değişikliği olarak /some/wheregörünür /else/where.

Bindfs dosya meta verilerinin bazılarını değiştirebilir: dosyalar için sahte izinler ve sahiplik gösterebilir. Ayrıntılar için kılavuza bakın ve örnekler için aşağıya bakın.

Bir bindfs dosya sistemi root olmayan bir kullanıcı olarak monte edilebilir, sadece FUSE dosya sistemlerini bağlama yetkisine ihtiyacınız vardır. Dağıtımınıza bağlı olarak, bu fusegrupta olmayı gerektirebilir veya tüm kullanıcıların kullanımına izin verebilir. Bir FUSE dosya sistemini kaldırmak fusermount -uiçin umount, örneğin

fusermount -u /else/where

nullfs

FreeBSD, nullfsbir dosya sisteminin alternatif bir görünümünü yaratan dosya sistemi sağlar. Aşağıdaki iki komut eşdeğerdir:

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

Her iki komutu verdikten sonra /else/where, içeriğinin /some/wheregörünür olduğu bir bağlama noktası haline gelir .

Nullfs ayrı bir dosya sistemi olduğundan, dosyalar /some/where/foove /else/where/foouygulamalara farklı dosyalar olarak görünür (nullfs dosya sistemi kendi st_devdeğerine sahiptir). Bir taraftaki herhangi bir değişiklik diğer tarafa “sihirli bir şekilde” yansımıştır, ancak dosyaların aynı olduğu gerçeği yalnızca nullfs'ın nasıl çalıştığını bildiğinde görülür.

Dizin ağacı seviyesinde hareket SİGORTA bindfs farklı olarak, FreeBSD'nin nullfs altında böylece bağlama noktaları, çekirdek içinde daha derin bir etki /else/whereolarak monte aynı noktada bir parçası olan tek ağaç: görünmez /some/whereolarak gösterilmektedir /else/where.

Nullfs dosya sistemi diğer BSD değişkenlerinde (OS X, OpenBSD, NetBSD) kullanılabilir, ancak varsayılan sistemin bir parçası olarak derlenmez.

Linux bağlama bağlaması

Linux altında, bağlanma bağları bir çekirdek özelliği olarak kullanılabilir. Komut satırı seçeneklerinden mountbirini --bindveya bindmount seçeneğini ileterek komutla bir tane oluşturabilirsiniz . Aşağıdaki iki komut eşdeğerdir:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

Burada “cihaz” /some/where, bir disk üstü dosya sistemi gibi bir disk bölümü değil, mevcut bir dizindir. Bağlantı noktası /else/whereher zamanki gibi mevcut bir dizin olmalıdır. Her iki şekilde de bir dosya sistemi türü belirtilmediğine dikkat edin: bağlama bağlama yapmak bir dosya sistemi sürücüsü içermez, çekirdek veri yapılarını orijinal montajdan kopyalar.

mount --bindayrıca, bir dizinin olmayan bir dizine eklenmesini de destekler: /some/wherenormal bir dosya olabilir (bu durumda /else/wherenormal bir dosya da olmalıdır).

Bir Linux ciltleme bağlantısı çoğunlukla orijinalinden ayırt edilemez. Komut df -T /else/whereaynı cihazı ve aynı dosya sistemi tipini gösterir df -T /some/where. Dosyalar /some/where/foove /else/where/foosanki sabit linklermiş gibi ayırt edilemezler. Monte edilmiş /some/wherehalde kalmak mümkündür /else/where.

Eski çekirdeklerde (tam olarak ne zaman bilmiyorum, sanırım 3.x'e kadar), bağlanma bağları orijinalden gerçekten ayırt edilemezdi. Son zamanlarda kullanılan çekirdekler bağlanma bağlarını izler ve bilgileri findmntbağlanma bağını belirtmeye izin veren PID / mountinfo aracılığıyla gösterir .

Ciltleme bağlama girişlerini içine koyabilirsiniz /etc/fstab. İstediğiniz diğer seçeneklerle birlikte seçeneklere eklemeniz bind(veya rbindvb.). “Cihaz” mevcut ağaçtır. Dosya sistemi sütunu içerebilir noneveya bind(yoksayılır, ancak bir dosya sistemi adı kullanmak kafa karıştırıcı olabilir). Örneğin:

/some/where /readonly/view none bind,ro

Altında montaj noktaları varsa /some/where, içerikleri altında görünmez /else/where. Yerine bind, kullanabilirsiniz rbindda altından bağlama noktalarını çoğaltmak, /some/where. Örneğin /some/where/mnt, bir bağlantı noktası ise

mount --rbind /some/where /else/where

eşittir

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

Ayrıca, Linux, bağların paylaşılan , köle , özel veya birleştirilemez olarak ilan edilmesine izin verir . Bu, montaj işleminin, montaj noktasını kopyalayan bir bağlama montajı altına yansır olup olmadığını etkiler. Daha fazla ayrıntı için çekirdek belgelerine bakın .

Linux ayrıca montajları taşımak için bir yol sağlar: --bindkopyalandığı zaman --movebir montaj noktasını taşır.

İki bağlama dizininde farklı montaj seçeneklerine sahip olmak mümkündür. Bununla birlikte bir tuhaflık var: bağlama montajı yapmak ve montaj seçeneklerini ayarlamak atomik olarak yapılamaz, birbirini takip eden iki işlem olması gerekir. (Eski çekirdekler buna izin vermedi.) Örneğin, aşağıdaki komutlar salt okunur bir görünüm yaratıyor, ancak /else/whereokuma-yazma sırasında küçük bir zaman penceresi var :

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

Bağlanmak için bağlama alamıyorum!

Sisteminiz FUSE özelliğini desteklemiyorsa, aynı etkiyi elde etmenin klasik bir numarası, bir NFS sunucusunu çalıştırmak, ortaya çıkarmak istediğiniz dosyaları dışa aktarmak (erişime izin vermek localhost) ve aynı makineye monte etmektir. Bu, bellek ve performans açısından önemli bir ek yüke sahiptir, bu nedenle bağlama yuvaları, mümkün olduğunda (FUSE sayesinde çoğu Unix varyantında) kesin bir avantaja sahiptir.

Davaları kullanın

Salt okunur görünüm

Yanlışlıkla değişiklik yapmamanızı sağlamak için güvenlik nedenlerinden dolayı veya sadece bir güvenlik katmanı olarak dosya sisteminin salt okunur bir görünümünü oluşturmak faydalı olabilir.

Ciltleri ile:

bindfs -r /some/where /mnt/readonly

Linux ile basit yol:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

Bu /mnt/readonly, okuma-yazma sırasında kısa bir zaman aralığı bırakır . Bu bir güvenlik sorunuysa, önce bağlama bağını yalnızca kök erişebileceği bir dizinde oluşturun, salt okunur yapın, sonra ortak bir bağlama noktasına taşıyın. Aşağıdaki kod parçasında, /root/private(bağlama noktasının üstündeki dizinin) özel; orijinal izinler /root/private/mntbağlama noktasının arkasına gizlendiğinden dolayı önemsizdir.

mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly

Kullanıcıları ve grupları yeniden eşleştirme

Dosya sistemleri kullanıcıları ve grupları sayısal kimliklerine göre kaydeder. Bazen aynı kişiye farklı kullanıcı kimlikleri atayan birden fazla sistemle karşılaşırsınız. Bu ağ erişiminde bir sorun değildir, ancak bir diskten bir sistemden diğerine veri taşırken kullanıcı kimliklerini anlamsız kılar. Alice'in kullanıcı kimliği 1000 ve Bob'un kullanıcı kimliği 1001'e sahip olduğu bir sistemde çok kullanıcılı bir dosya sistemiyle (örneğin ext4, btrfs, zfs, UFS,…) oluşturulmuş bir diske sahip olduğunuzu ve bu diski erişilebilir kılmak istediğinizi varsayalım. Alice'in kullanıcı kimliği 1001 ve Bob'un kullanıcı kimliği 1000 olduğu bir sistem. Diski doğrudan takarsanız, Alice'in dosyaları Bob'a ait (görünür (kullanıcı kimliği 1001 olduğundan)) ve Bob'un dosyaları Alice'in sahip olduğu gibi görünecektir (çünkü kullanıcı kimliği 1000).

Kullanıcı kimliklerini yeniden eşlemek için bindfs kullanabilirsiniz. Öncelikle disk bölümünü, sadece root'un erişebileceği özel bir dizine yerleştirin. Ardından, ortak bir alanda, Alice ve Bob'un kullanıcı kimliklerini ve grup kimliklerini değiştiren remepaj eden kullanıcı kimliği ve grup kimliği ile bir cilt görünümü oluşturun.

mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk

Bkz. Önyükleme yapılmayan bir sistemin kullanıcısının giriş klasöründeki dosyalara izin verilen şekilde nasıl erişilir? ve mount - diğer kullanıcıları kendimden başka örnekler olarak bağlayın .

Bir hapishaneye veya konteynere montaj

Bir chroot hapis veya konteyneri , sistemin dizin ağacının bir alt ağacında bir işlem yürütür. Bu, sınırlı erişime sahip bir programı çalıştırmak için yararlı olabilir, örneğin yalnızca kendi dosyalarına ve hizmet verdiği dosyalara erişen bir ağ sunucusunu çalıştırmak, ancak aynı bilgisayarda depolanan diğer verilere değil). Chroot'un bir kısıtlaması, programın bir alt ağaç ile sınırlı olmasıdır: bağımsız alt ağaçlara erişemez. Bağlama bağlantıları, diğer alt ağaçların o ana ağaç üzerine aşılanmasına izin verir. Bu onları Linux altında konteynerlerin en pratik kullanımı için temel yapar.

Örneğin, bir makinenin /usr/sbin/somethingdyalnızca altındaki verilere erişimi olan bir servisi çalıştırdığını varsayalım /var/lib/something. Bu dosyaların her ikisini de içeren en küçük dizin ağacı köküdür. Hizmet nasıl sınırlandırılabilir? Bir olasılık, hizmetin ihtiyaç duyduğu tüm dosyalara (en azından /usr/sbin/somethingdve birkaç paylaşılan kitaplık) sıkı bağlantılar kurmaktır /var/lib/something. Ama bu (sert bağlantılar dosya yükseltilir zaman güncellenmesi gereken) zahmetlidir ve eğer çalışmaz /var/lib/somethingve /usrfarklı dosyasistemlerinden. Daha iyi bir çözüm, geçici bir kök oluşturmak ve bunu mount'ları kullanarak doldurmaktır:

mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &

Linux'un mount ad alanları chroots'u genelleştirir. Bağlama bağları, ad alanlarının esnek şekillerde nasıl doldurulabildiğini gösterir. Örneğin , bir işlemin aynı dosya adı için farklı bir dosya okuma konusuna bakın .

Farklı bir dağıtım yürütmek

Chroots'un bir diğer kullanımı, dizinde farklı bir dağıtım kurmak ve temel sistemde bulunmayan ya da farklı içeriğe sahip olmayan kodlanmış yollardaki dosyalara ihtiyaç duysalar bile ondan programları çalıştırmaktır. Bu, örneğin, karışık paketleri desteklemeyen bir 64 bit sisteme 32 bit dağıtım kurmak, bir dağıtımın eski sürümlerini veya uyumluluğunu test etmek için başka bir dağıtım kurmak, test etmek için daha yeni bir sürüm yüklemek için yararlı olabilir. Temel bir sistemi korurken en son özellikler vb. Bakın 64-bit Debian / Ubuntu'da 32-bit programları nasıl çalıştırırım? Debian / Ubuntu'da bir örnek için.

Dağıtımınızın en son paketlerini, bu dizine /f/unstablegeçerek programları çalıştırdığınız dizinin altına kurduğunuzu varsayalım chroot /f/unstable. Bu dizinlerden ev dizinlerinin kullanılabilir olmasını sağlamak için bunları chroot'a monte edin:

mount --bind /home /f/unstable/home

Program schroot bunu otomatik olarak yapar.

Bir bağlama noktasının arkasına gizlenmiş dosyalara erişme

Bir dizine bir dosya sistemi bağladığınızda, bu dizinin arkasında ne olduğunu gizler. Bu dizindeki dosyalara, dizinin bağlantısı kaldırılıncaya kadar erişilemez hale gelir. BSD nullfs ve Linux bağlama mountları, mount altyapısından daha düşük bir seviyede çalıştığından, bir nullfs mount veya bir dosya sisteminin bağlama mountu orijinaldeki alt montajların arkasına gizlenmiş dizinleri gösterir.

Örneğin, monte edilmiş bir tmpfs dosya sistemine sahip olduğunuzu varsayalım /tmp. /tmpTmpfs dosya sisteminin oluşturulduğu zamanlar altında dosyalar varsa , bu dosyalar hala etkin bir şekilde erişilmez fakat disk alanı kaplar. Çalıştırmak

mount --bind / /mnt

(Linux) veya

mount -t nullfs / /mnt

(FreeBSD) adresindeki kök dosya sisteminin bir görünümünü oluşturmak için /mnt. Dizin /mnt/tmp, kök dosya sisteminden bir dizindir .

NFS farklı yollarda ihracat yapıyor

Bazı NFS sunucuları (NFSv4'ten önceki Linux çekirdeği NFS sunucusu gibi), bir dizini dışa aktardıklarında her zaman gerçek dizin konumunu bildirir. Diğer bir deyişle, bir müşteri talep ettiğinde server:/requested/location, sunucu ağacı ağaca konumlandırır /requested/location. Bazen istemcilerin istemesine izin vermek istenebilir /request/locationancak aslında altındaki dosyaları sunabilir /actual/location. NFS sunucunuz alternatif bir konum sunmayı desteklemiyorsa, beklenen istek için bir bağlanma bağlaması oluşturabilirsiniz, örn.

/requested/location *.localdomain(rw,async)

içinde /etc/exportsve aşağıdakilerde /etc/fstab:

/actual/location /requested/location bind bind

Sembolik bağların yerine geçecek

Bazen bir dosyanın /some/where/is/my/filealtında görünmesini sağlamak için sembolik bağlantı oluşturmak istersiniz /else/where, ancak kullanan uygulama filesembolik bağları genişletir ve reddeder /some/where/is/my/file. Bağlama monte: monte Bind bu çalışabilirsiniz /some/where/is/myiçin /else/where/is/myve sonra realpathrapor verecek /else/where/is/my/filealtında olmasını /else/wheredeğil, altında /some/where.

Bağlama bağlantılarının yan etkileri

Özyinelemeli dizin geçişleri

Bağlama bağları kullanıyorsanız, yedekleme ve dizin oluşturma gibi dosya sistemi ağacını yinelemeli olarak geçen uygulamalara dikkat etmeniz gerekir (örneğin, bir veritabanı bulmak için ).

Genellikle, bağlama bağları özyinelemeli dizin geçişlerinden dışlanmalıdır, böylece her bir dizin ağacı yalnızca bir kez orijinal konumuna geçirilir. Bindfs ve nullfs ile, geçiş aracını mümkünse bu dosya sistemi türlerini yoksayacak şekilde yapılandırın. Linux bağlama bağları şu şekilde tanınamıyor: yeni konum orijinal ile aynı. Linux bağlama mount'leriyle veya dosya sistemi türlerini değil yalnızca yolları hariç tutabilecek araçlarla, bağlama mount'larının bağlama noktalarını dışlamanız gerekir.

Dosya sistemi sınırlarında durdurmak dolaşımları (örneğin find -xdev, rsync -x, du -xbunlar bindfs karşılaşmanız veya nullfs bağlama noktası zaman bu noktadan farklı bir dosya sistemidir monte çünkü, ...) otomatik olarak duracaktır. Linux bağlanma bağlarıyla, durum biraz daha karmaşıktır: bir dosya sistemi sınırı vardır, ancak bağlanma bağlaması farklı bir dosya sistemini aşıyorsa, aynı dosya sisteminin başka bir parçasını aşıyorsa.

Bağlama bağlantılarının ötesine geçme

Bağlama bağları, farklı bir konumdaki dizin ağacının bir görünümünü sağlar. Aynı dosyaları, muhtemelen farklı mount seçenekleriyle ve (bindfs ile) farklı mülkiyet ve izinlerle gösterirler. Bir dizin ağacının değiştirilmiş bir görüntüsünü sunan dosya sistemlerine bindirme dosya sistemleri veya istiflenebilir dosya sistemleri denir . Daha gelişmiş dönüşümler gerçekleştiren birçok başka bindirme dosya sistemi var. İşte birkaç yaygın olanlar. İstediğiniz kullanım durumu burada ele alınmıyorsa, FUSE dosya sistemlerinin bulunduğu depoya bakın .

Görünür dosyaları filtrele

  • istiridye - dosyaları okunduğunda virüs tarayıcısından geçirir
  • filterfs - bir dosya sisteminin bölümlerini gizle
  • rofs - salt okunur bir görünüm. Benzer şekilde bindfs -r, sadece biraz daha hafif.
  • Birlik bağlar - Mevcut çoklu dosya sistemleri (denilen dalları tek bir dizin altında): eğer tree1içeriyor foove tree2içerdiği barardından sendika görünümü hem de içerir foove bar. Yeni dosyalar belirli bir şubeye veya daha karmaşık kurallara göre seçilen bir şubeye yazılır. Bu kavramın bazı uygulamaları vardır, bunlar:

Dosya adlarını ve meta verileri değiştirin

  • ciopfs - büyük / küçük harf duyarlı dosya adları (Windows dosya sistemlerini bağlamakta faydalı olabilir)
  • convmvfs - dosya kümelerini karakter kümeleri arasında dönüştürür ( örnek )
  • posixovl - Böyle VFAT olarak daha kısıtlı dosyasistemlerinden mağaza Unix dosya adları ve diğer meta (izinler, sahiplik, ...) ( örnek )

Değişen dosya içeriğini görüntüle

İçeriğin saklanma şeklini değiştirin


1
biri systemd ile nasıl yapılacağına bir örnek eklemek isteyebilir: utcc.utoronto.ca/~cks/space/blog/linux/SystemdBindMountUnits
dothebart

1
Ne yapar mount --bind /dir1 /dir1? Montaj kaynağının ve hedefinin farklı olduğu durumdan ne kadar farklıdır?
Mark

Linux 5.0 kullanarak / proc / self / mountinfo'da hiç kayıt görmedim. Çekirdek bana bağlama olup olmadığını söylemedi. Ve bir işlem kolayca chroot kırabilir, izolasyon mount isim alanı ile yapılmalıdır.
22:19

@ 炸鱼 薯条 德里克 Bence bağlantılı soru unix.stackexchange.com/questions/295525/… adresleri /proc/self/mountinfo. Chroot gelince, izolasyon için kullanılabilir, ancak kendi başına. Yine de mount ad alanlarına ihtiyacınız yoktur : chroot dosya sistemi ad alanı bölümü için yeterlidir. Chroot'taki hiçbir işlemin chroot dışındaki bir işlemle aynı kullanıcıyla aynı olmadığından emin olmanız gerekir.
Gilles

@Mark Bir dizini kendi üzerine bağlamak çok kullanışlı değildir. Sanırım, belirli bir dizine monte edilmiş dosya sistemlerini gizlemek için kullanabilirsiniz, ancak bunu özellikle yapmak istediğim bir zamanı düşünemiyorum.
Gilles

-1

Basit, bağlama montajı kullandığınızda, ana makinedeki bir dosya veya dizin bir kaba monte edilir, böylece ana makinedeki dosya dizininde yapılan değişiklikler otomatik olarak dizindeki kap içinde bulunur.


Bu, bağlama montajı kullanma yollarından biridir, ancak bağlama montajlarının kendileri ile konteynerlerle hiçbir ilgisi yoktur. Cevabımda yazdım ama “konteyner” yerine “hapis” adı altında; "container" eklemek değerli bir düzenleme olacaktır (ben yaparım). Bu aynı zamanda kötü bir tanımdır: neden dışarda yapılan değişikliklerin içeride de başka bir yoldan söz etmeden sağladığını da belirtmelisiniz?
Gilles
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.