Yanıtlar:
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/where
ve /else/where
aynı içeriğe sahip.
Sert bir linkten veya sembolik linkten farklı olarak, bir mount mount dosya sisteminde depolananları etkilemez. Canlı sistemin bir özelliği.
bindfs
Dosya 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/where
içeriğinin /some/where
görünür olduğu bir montaj noktası yapar .
Bindfs ayrı bir dosya sistemi olduğundan, dosyalar /some/where/foo
ve /else/where/foo
uygulamalara farklı dosyalar olarak görünür (bindfs dosya sistemi kendi st_dev
değ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/where
sadece 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/where
gö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 fuse
grupta olmayı gerektirebilir veya tüm kullanıcıların kullanımına izin verebilir. Bir FUSE dosya sistemini kaldırmak fusermount -u
için umount
, örneğin
fusermount -u /else/where
FreeBSD, nullfs
bir 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/where
görünür olduğu bir bağlama noktası haline gelir .
Nullfs ayrı bir dosya sistemi olduğundan, dosyalar /some/where/foo
ve /else/where/foo
uygulamalara farklı dosyalar olarak görünür (nullfs dosya sistemi kendi st_dev
değ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/where
olarak monte aynı noktada bir parçası olan tek ağaç: görünmez /some/where
olarak 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 altında, bağlanma bağları bir çekirdek özelliği olarak kullanılabilir. Komut satırı seçeneklerinden mount
birini --bind
veya bind
mount 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/where
her 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 --bind
ayrıca, bir dizinin olmayan bir dizine eklenmesini de destekler: /some/where
normal bir dosya olabilir (bu durumda /else/where
normal bir dosya da olmalıdır).
Bir Linux ciltleme bağlantısı çoğunlukla orijinalinden ayırt edilemez. Komut df -T /else/where
aynı cihazı ve aynı dosya sistemi tipini gösterir df -T /some/where
. Dosyalar /some/where/foo
ve /else/where/foo
sanki sabit linklermiş gibi ayırt edilemezler. Monte edilmiş /some/where
halde 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 findmnt
bağ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 rbind
vb.). “Cihaz” mevcut ağaçtır. Dosya sistemi sütunu içerebilir none
veya 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 rbind
da 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: --bind
kopyalandığı zaman --move
bir 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/where
okuma-yazma sırasında küçük bir zaman penceresi var :
mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where
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.
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/mnt
bağ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
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 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/somethingd
yalnı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/somethingd
ve 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/something
ve /usr
farklı 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 .
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/unstable
geç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 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
. /tmp
Tmpfs 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 .
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/location
ancak 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/exports
ve aşağıdakilerde /etc/fstab
:
/actual/location /requested/location bind bind
Bazen bir dosyanın /some/where/is/my/file
altında görünmesini sağlamak için sembolik bağlantı oluşturmak istersiniz /else/where
, ancak kullanan uygulama file
sembolik bağları genişletir ve reddeder /some/where/is/my/file
. Bağlama monte: monte Bind bu çalışabilirsiniz /some/where/is/my
için /else/where/is/my
ve sonra realpath
rapor verecek /else/where/is/my/file
altında olmasını /else/where
değil, altında /some/where
.
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 -x
bunlar 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ğ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 .
bindfs -r
, sadece biraz daha hafif.Birlik bağlar - Mevcut çoklu dosya sistemleri (denilen dalları tek bir dizin altında): eğer tree1
içeriyor foo
ve tree2
içerdiği bar
ardından sendika görünümü hem de içerir foo
ve 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:
mount --bind /dir1 /dir1
? Montaj kaynağının ve hedefinin farklı olduğu durumdan ne kadar farklıdır?
/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.
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.