Bağlama bağlama bağlantıları için neden salt okunur seçeneğine saygı göstermiyor?


35

Arch Linux sistemimde (Linux Çekirdeği 3.14.2) bağlama bağlantıları salt okunur seçeneğe uymuyor

# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo

dosyayı oluşturur /mnt/foo. İlgili giriş /proc/mountsDİR

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

Bağlama seçenekleri istenen seçeneklerimle eşleşmiyor, ancak bağlama bağlamanın okuma / yazma davranışı ile ilk olarak takmak /dev/sda2için kullanılan seçeneklerle eşleşmiyor/

/dev/sda2 / ext4 rw,noatime,data=ordered 0 0

Bununla birlikte, montajı yeniden takarsam, salt okunur seçeneğine uyar

# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system

ve ilgili giriş /proc/mounts/

/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0

umduğum gibi gözüküyor (gerçekte testdizinin tam yolunu görmeyi beklememe rağmen ). Giriş /proc/mounts/ve monte Orignal için /dev/sda2/üzerinde /de değişmez ve kalıntılar okuma / yazma

/dev/sda2 / ext4 rw,noatime,data=ordered 0 0

Bu davranış ve bunun etrafındaki iş en az 2008'den beri bilinmektedir vemount

Dosya sistemi bağlama seçeneklerinin orijinal bağlama noktasındakilerle aynı kalacağını ve -o seçeneğini --bind / - rbind ile birlikte geçirerek değiştirilemeyeceğini unutmayın. Bağlama seçenekleri ayrı bir remount komutu ile değiştirilebilir

Tüm dağılımlar aynı şekilde davranmaz. Kemer, bağlama montajı salt okunur olmadığında bir uyarı verirken Arch seçeneklere saygı duymakta başarısız görünüyor.

mount: warning: /mnt seems to be mounted read-write.

Debian Lenny ve Squeeze’de bu davranışın “düzeltildiğini”, ancak evrensel bir düzeltme gibi görünmediğini ve hala Debian Wheezy’de çalışmadığını bildiriyorlar. Bağlama montajının ilk montajdaki salt okunur seçeneğine saygı göstermesi ile ne kadar zor?


/ Etc / mtab adresiniz var mı?
eyoung100

Ayrıca bkz thread.gmane.org/gmane.linux.utilities.util-linux-ng/2979 ve kullanarak bir geçici çözüm mount -t bindve bir yardımcı komut bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380
Stephane Chazelas

@ ECarterYoung evet ben bir /etc/mtab. İlk montajdan sonra, giriş montajın rw olduğunu ve ro dediği yeniden montajdan sonra montajın durumunu doğru şekilde raporladığını söyler. Başarısız olan sadece mount komutudur.
StrongBad

3
Ben, iki Debian test / kararsız makinelerde birini bir Debian çekirdek çalışan ve bir ile bir kernel.org çekirdeği, ne işi çalıştıran test mount --bind -o robir mesajla dışarı, ikisi de tükürük mount: warning: «mountpoint» seems to be mounted read-write.Debian düştü ya da bir noktada yama kaybetmiş görünüyor Öyleyse ... Remount olsa çalışır.
derobert

2
@StrongBad İstendiği gibi test edildi ve çalışmadı.
derobert

Yanıtlar:


21

Bind mount sadece ... şey ... bind mount. Yani yeni bir montaj değil. Sadece "links" / "ifşa ediyor" / ", alt dizini yeni bir bağlama noktası olarak görüyor". Bu nedenle mount parametrelerini değiştiremez. Bu yüzden şikayet alıyorsun:

# mount /mnt/1/lala /mnt/2 -o bind,ro
mount: warning: /mnt/2 seems to be mounted read-write.

Ama dediğiniz gibi normal bir bağlama da çalışır:

# mount /mnt/1/lala /mnt/2 -o bind

Ve sonra bir ro remount da çalışır:

# mount /mnt/1/lala /mnt/2 -o bind,remount,ro 

Ancak olan şey, sadece bu bağlanma bağını değil tüm bağlamayı değiştirdiğinizdir. / Proc / mount'lara bakarsanız, hem mount hem de orijinal mount'un salt okunur olarak değiştiğini göreceksiniz:

/dev/loop0 /mnt/1 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0
/dev/loop0 /mnt/2 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0

Yani, yaptığınız ilk montajı salt okunur bir montaja değiştirmek ve sonra tabii ki salt okunur olacak bir bağlama montajı yapmak gibi.

GÜNCELLEME 2016-07-20:

4.5 çekirdek için aşağıdakiler geçerlidir, ancak 4.3 çekirdek için doğru değildir (Bu yanlış. Aşağıdaki güncelleme # 2'ye bakınız):

Çekirdeğin salt okunuru kontrol eden iki bayrağı vardır:

  • MS_READONLY: Montaj olmadığını belirten salt okunur
  • MNT_READONLY: "Kullanıcı" isteyip istemediğini belirten salt okunur

4.5 çekirdekte, mount -o bind,roaslında hile yapmak bir irade yapıyor . Örneğin, bu:

# mkdir /tmp/test
# mkdir /tmp/test/a /tmp/test/b
# mount -t tmpfs none /tmp/test/a
# mkdir /tmp/test/a/d
# mount -o bind,ro /tmp/test/a/d /tmp/test/b

bağlamak ait montaj salt okunur bir yaratacaktır /tmp/test/a/diçin /tmp/test/bgörünür olacak, /proc/mountsolarak:

none /tmp/test/a tmpfs rw,relatime 0 0
none /tmp/test/b tmpfs ro,relatime 0 0

/proc/self/mountinfoKullanıcı görünümünü (ad alanı) dikkate alan daha ayrıntılı bir görünüm görülebilir . İlgili satırlar bunlar olacaktır:

363 74 0:49 / /tmp/test/a rw,relatime shared:273 - tmpfs none rw
368 74 0:49 /d /tmp/test/b ro,relatime shared:273 - tmpfs none rw

Nerede ikinci satırda, bunu söylüyor görebilirsiniz hem ro( MNT_READONLY) ve rw( !MS_READONLY).

Sonuç şudur:

# echo a > /tmp/test/a/d/f
# echo a > /tmp/test/b/f
-su: /tmp/test/b/f: Read-only file system

GÜNCELLEME 2016-07-20 # 2:

Bunu biraz daha araştırmak, davranışların aslında util-linux'un bir parçası olan libmount versiyonuna bağlı olduğunu göstermektedir. Bunun için destek bu taahhüt ile eklendi ve sürüm 2.27 ile yayınlandı:

taahhüt 9ac77b8a78452eab0612523d27fee52159f5016a
Yazar: Karel Zak 
Tarih: Pzt 17 Ağu 11:54:26 2015 +0200

    libmount: "bind, ro" için destek ekle

    Şimdi bir salt okunur oluşturmak için iki mount (8) çağrısı kullanmanız gerekiyor
    montaj:

      mount / foo / bar -o bağlama
      mount / bar -o remount, ro, bağlama

    Bu düzeltme eki "ciltleme, ro" belirtmenize izin verir ve yeniden yapılır
    otomatik olarak ek mount (2) sistem çağrısı ile libmount tarafından. Değil
    tabii ki atom.

    İmza-by: Karel Zak 

Ayrıca geçici çözüm sağlar. Davranış, daha eski ve daha yeni bir montajda strace kullanılarak görülebilir:

Eski:

mount("/tmp/test/a/d", "/tmp/test/b", 0x222e240, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.000681>

Yeni:

mount("/tmp/test/a/d", "/tmp/test/b", 0x1a8ee90, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.011492>
mount("none", "/tmp/test/b", NULL, MS_RDONLY|MS_REMOUNT|MS_BIND, NULL) = 0 <0.006281>

Sonuç:

İstenilen sonucu elde etmek için iki komutun çalıştırılması gerekir (@Thomas zaten söylediği gibi):

mount SRC DST -o bind
mount DST -o remount,ro,bind

Mount'un yeni sürümleri (util-linux> = 2.27) bunu çalıştırdığında otomatik olarak yapar

mount SRC DST -o bind,ro

3
Evet fakat hayır. IIRC, çekirdeğin farklı bağlama noktalarının (dosya sistemleri değil) farklı seçeneklere sahip olmaları için bir miktar destek var. Debian mount -o bind,ro, bir okuma-yazma dosya sisteminin salt okunur bir görüntüsünü yaratan bir yamaya sahipti (ama artık huzursuz görünüyordu).
Gilles 'SO- kötülük'

Bunun yukarıdakilerle nasıl çeliştiğini anlamıyorum. Hackler, pek anlamlı olmayan şeyler de dahil olmak üzere her türlü malzemeye izin verebilir. Şu anda 3.14 çekirdeğindeki salt okunur yeniden ödeme en sonunda bu çağrı tarafından gerçekleştirilir: mnt_make_readonly (real_mount (mnt)), gördüğünüz gibi real_mount () işlevini kullanır, bu nedenle pratik olarak gerçek bağlamayı etkiler ve bu da bağlanma bağlarını yeni yansıtmaya neden olur (salt okunur) montaj bayrağı. En azından benim anlayışım bu.
V13

Bu , ilk önce çekirdek 3.3'te görünen “yayılmış yapı montaj” yamasının (özellikle de bu taahhüdün ) bir sonucudur . Bu yamanın sonuçları lkml ya da lwn'da tartışıldı mı, biliyor musunuz?
Gilles 'SO- kötülük'

7
mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/... o touch /tmp/azaman tamam, ama touch /mnt/tmp/bverir touch: cannot touch ‘/mnt/tmp/b’: Read-only file system. Hem Debian 3.13 hem de kernel.org'da çalışır. 3.14.2. Yani sadece tüm montajı değiştirmez. En azından son çekirdeklerde olmaz.
derobert

1
Muhtemelen bir "Bağlama bağının sadece ... iyi ... bir bağlanma montajı" ifadesidir. bu gerçekten önemli ama benim için hiçbir şey ifade etmiyor. Ayrıca ikinci kez neden remount seçeneğiyle çalıştığını da anlamıyorum.
StrongBad

9

Doğru çözüm gerçekten iki kez monte etmektir. Komut satırında:

mount -t none -o bind /source/dir /destination/dir
mount -t none -o bind,remount,ro /source/dir /destination/dir

İçinde /etc/fstab:

/source/dir            /destination/dir    none  bind            0 0
/source/dir            /destination/dir    none  remount,bind,ro 0 0

Manual ( man mount) bu şekilde belirtir:

   The bind mounts.
          Since Linux 2.4.0 it is possible to remount part of the file hierarchy somewhere else. The call is
                 mount --bind olddir newdir
   [...]
          Note that the filesystem mount options will remain the same as those on the original mount point, and cannot be changed  by  passing  the  -o  option
          along with --bind/--rbind. The mount options can be changed by a separate remount command, for example:
          .
                 mount --bind olddir newdir
                 mount -o remount,ro newdir
          .
          Note  that  behavior  of  the remount operation depends on the /etc/mtab file. The first command stores the 'bind' flag to the /etc/mtab file and the
          second command reads the flag from the file.  If you have a system without the /etc/mtab file or if you explicitly define source and target  for  the
          remount command (then mount(8) does not read /etc/mtab), then you have to use bind flag (or option) for the remount command too. For example:
          .
                 mount --bind olddir newdir
                 mount -o remount,ro,bind olddir newdir

Bu, en azından Ubuntu 14.04 LTS ve çekirdek 3.19.0-51-alçakgönüllülük ile çalışıyor gibi görünüyor. Güzel!
Mikko Rantalainen

0

mount(8)Komut satırı perspektifinden soruyorsunuz (bu sitede kabul edilebilir). Bu komut diğer cevaplarda tartışıldı ve bazı durumlarda gerekli ikinci mount(2)sistem çağrısını iptal etti.

Peki neden ikinci sistem çağrısı gerekli? Neden tek bir mount(2)arama salt okunur bağlama bağını oluşturamıyor?

mount(2)Adam sayfa Diğerleri işaret gibi, orada olduğunu açıklar iki set bayrakları kümesi olma:

  • Temel dosya sistemi bayrakları
  • VFS bağlama noktası bayrakları

Diyor ki:

Linux 2.6.16'dan beri MS_RDONLY, temel dosya sisteminde olduğu gibi nokta başına esasına göre ayarlanabilir veya silinebilir. Monte edilmiş dosya sistemi, yalnızca dosya sistemi veya bağlantı noktası salt okunur olarak işaretlenmezse yazılabilir.

Ve ilgili MS_REMOUNT:

Linux 2.6.26’dan bu yana, bu bayrak MS_BINDyalnızca bağlama noktası bayraklarını değiştirmek için kullanılabilir . Bu özellikle, temel dosya sistemini değiştirmeden "salt okunur" bayrağını bağlama noktasındaki ayarlamak veya silmek için kullanışlıdır. Mountflags'i şu şekilde belirtmek:

      MS_REMOUNT | MS_BIND | MS_RDONLY

diğer montaj noktalarını etkilemeden bu mountpoint üzerinden salt okunur olarak erişime izin verecektir.

Bence bağlama bağları ilk tanıtıldığında sorun ortaya çıktı:

Mountflags MS_BIND(Linux 2.4'ten beri mevcut) içeriyorsa , bağlama montajı yapın. ... Mountflags argümanındaki kalan bitler hariç, dikkate alınmaz MS_REC. (Bağlama montajı, alttaki montaj noktasıyla aynı montaj seçeneklerine sahiptir.)

Görünüşe göre, MS_BIND | MS_REMOUNTsadece VFS bayraklarını ayarlamak için sinyal olarak kullanmak yerine MS_RDONLY, başlangıç ​​ile birlikte hariç (ve kabul etmeyi) seçmiş olabilirlerdi MS_BINDve onu bağlama noktasına uygulayabildiler.

Bu nedenle, mount(2)sistem çağrısının biraz tuhaf semantiği nedeniyle :

  • İlk çağrı bağlama bağını oluşturur ve diğer tüm bayraklar yoksayılır
  • İkinci çağrı (remountlu) bağlama noktası bayraklarını salt okunur olarak ayarlar.
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.