Pada sistem Arch Linux saya (Linux Kernel 3.14.2) bind mount tidak menghormati opsi read only
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
membuat file /mnt/foo
. Entri yang relevan /proc/mounts
adalah
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
Mount pilihan tidak cocok pilihan saya diminta, tetapi melakukan mencocokkan kedua perilaku membaca / menulis dari mengikat mount dan opsi yang digunakan untuk awalnya me-mount /dev/sda2
pada/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Namun, jika saya memasang kembali mount maka itu menghormati opsi read only
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
dan entri yang relevan di /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
sepertinya apa yang saya harapkan (walaupun sebenarnya saya akan berharap untuk melihat path lengkap dari test
direktori). Entri /proc/mounts/
untuk mount orignal /dev/sda2/
on /
juga tidak berubah dan tetap baca / tulis
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Perilaku ini dan pekerjaannya telah diketahui setidaknya sejak 2008 dan didokumentasikan di halaman manualmount
Perhatikan bahwa opsi pemasangan sistem berkas akan tetap sama dengan yang ada di titik pemasangan asli, dan tidak dapat diubah dengan melewatkan opsi -o bersama dengan --bind / - rbind. Opsi pemasangan dapat diubah dengan perintah remount terpisah
Tidak semua distribusi berperilaku sama. Arch tampaknya diam-diam gagal menghargai opsi sementara Debian menghasilkan peringatan ketika bind mount tidak mendapatkan mount read-only
mount: warning: /mnt seems to be mounted read-write.
Ada laporan bahwa perilaku ini "diperbaiki" di Debian Lenny dan Squeeze meskipun tampaknya tidak menjadi perbaikan universal juga tidak bekerja di Debian Wheezy. Apa yang paling sulit dikaitkan dengan membuat bind mount menghormati opsi read only pada mount awal?
sumber
mount -t bind
dan skrip pembantu di bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380/etc/mtab
. Setelah mount awal entri mengatakan mount adalah rw dan setelah remount dikatakan ro, sehingga melaporkan keadaan mount dengan benar. Hanya perintah mount yang gagal.mount --bind -o ro
, mereka berdua mengeluarkan pesanmount: warning: «mountpoint» seems to be mounted read-write.
Jadi sepertinya Debian menjatuhkan atau kehilangan tambalan di beberapa titik ... Remount bekerja, meskipun.Jawaban:
Bind mount hanya ... well ... bind mount. Yaitu itu bukan gunung baru. Itu hanya "tautan" / "memperlihatkan" / "menganggap" subdirektori sebagai titik pemasangan baru. Karena itu tidak dapat mengubah parameter mount. Itu sebabnya Anda mendapat keluhan:
Tetapi seperti yang Anda katakan, bind mount yang normal berfungsi:
Dan kemudian ro remount juga berfungsi:
Namun yang terjadi adalah Anda mengubah seluruh mount dan bukan hanya bind mount ini. Jika Anda melihat / proc / mounts Anda akan melihat bahwa bind mount dan mount asli berubah menjadi read-only:
Jadi yang Anda lakukan adalah seperti mengubah mount awal menjadi mount read-only dan kemudian melakukan binding mount yang tentu saja akan menjadi read-only.
UPDATE 2016-07-20:
Berikut ini berlaku untuk 4.5 kernel, tetapi tidak benar untuk 4.3 kernel (Ini salah. Lihat pembaruan # 2 di bawah):
Kernel memiliki dua flag yang mengontrol read-only:
MS_READONLY
: Menunjukkan apakah mount hanya bacaMNT_READONLY
: Menunjukkan apakah "pengguna" hanya menginginkannya untuk dibacaPada kernel 4.5, melakukan
mount -o bind,ro
wasiat benar-benar melakukan triknya. Sebagai contoh, ini:akan membuat read-only bind mount dari
/tmp/test/a/d
untuk/tmp/test/b
, yang akan terlihat dalam/proc/mounts
sebagai:Tampilan yang lebih rinci terlihat di
/proc/self/mountinfo
, yang mempertimbangkan tampilan pengguna (namespace). Baris yang relevan adalah sebagai berikut:Di mana pada baris kedua, Anda dapat melihat bahwa ia mengatakan keduanya
ro
(MNT_READONLY
) danrw
(!MS_READONLY
).Hasil akhirnya adalah ini:
UPDATE 2016-07-20 # 2:
Sedikit lebih dalam menggali ini menunjukkan bahwa perilaku sebenarnya tergantung pada versi libmount yang merupakan bagian dari util-linux. Dukungan untuk ini ditambahkan dengan komit ini dan dirilis dengan versi 2.27:
yang juga menyediakan solusi. Perilaku dapat dilihat menggunakan strace pada mount yang lebih tua dan lebih baru:
Tua:
Baru:
Kesimpulan:
Untuk mencapai hasil yang diinginkan, seseorang perlu menjalankan dua perintah (seperti yang sudah dikatakan @Thomas):
Versi mount yang lebih baru (util-linux> = 2.27) melakukan ini secara otomatis ketika seseorang menjalankannya
sumber
mount -o bind,ro
membuat tampilan read-only dari sistem file read-write (tapi sepertinya tidak lagi ada di sana saat mengi).mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/
... makatouch /tmp/a
tidak apa-apa, tetapitouch /mnt/tmp/b
memberitouch: cannot touch ‘/mnt/tmp/b’: Read-only file system
. Itu berfungsi baik pada Debian 3.13 dan kernel.org 3.14.2. Jadi itu tidak hanya mengubah seluruh mount. Setidaknya tidak dengan kernel terbaru.Solusi yang tepat adalah memasangnya dua kali. Di baris perintah:
Di
/etc/fstab
:Manual (
man mount
) menyatakan seperti itu:sumber
Anda bertanya dari perspektif
mount(8)
baris perintah (yang dapat diterima di situs ini). Perintah itu telah dibahas dalam jawaban lain dan dalam beberapa kasus, abstraksimount(2)
panggilan sistem kedua yang diperlukan .Tetapi mengapa panggilan sistem kedua diperlukan? Mengapa satu
mount(2)
panggilan tidak dapat membuat bind mount read-only?The
mount(2)
halaman man menjelaskan bahwa ada, seperti orang lain telah menunjukkan, dua set bendera menjadi set:Ia mengatakan:
Dan tentang
MS_REMOUNT
:Saya pikir masalah muncul ketika bind mount pertama kali diperkenalkan:
Tampaknya, alih-alih menggunakan
MS_BIND | MS_REMOUNT
sebagai sinyal untuk mengatur hanya flag VFS, mereka bisa memilih untuk kecuali (dan menerima)MS_RDONLY
bersama dengan inisialMS_BIND
, dan menerapkannya ke titik mount.Jadi karena semantik yang agak aneh dari
mount(2)
pemanggilan sistem:sumber