Direktori yang ada diperlukan sebagai titik pemasangan .
$ ls
$ sudo mount /dev/sdb2 ./datadisk
mount: mount point ./datadisk does not exist
$ mkdir datadisk
$ sudo mount /dev/sdb2 ./datadisk
$
Saya merasa ini membingungkan karena overlay isi direktori yang ada. Ada dua kemungkinan isi dari direktori titik mount yang dapat diaktifkan secara tidak terduga (untuk pengguna yang tidak melakukan mount).
Mengapa tidak mount
terjadi pada direktori yang baru dibuat? Ini adalah cara bagaimana sistem operasi grafis menampilkan media yang dapat dilepas. Akan menjadi jelas jika direktori di-mount (ada) atau tidak di-mount (tidak ada). Saya cukup yakin ada alasan bagus tapi saya belum bisa menemukannya.
udisksctl
. Mengapa menggunakanmount
?better design than Unix!
[rujukan?]Jawaban:
Ini adalah kasus detail implementasi yang bocor.
Dalam sistem UNIX, setiap direktori terdiri dari daftar nama yang dipetakan ke nomor inode . Inode menyimpan metadata yang memberi tahu sistem apakah itu file, direktori, perangkat khusus, bernama pipe, dll. Jika itu adalah file atau direktori, ia juga memberi tahu sistem tempat menemukan file atau isi direktori pada disk. Kebanyakan inode adalah file atau direktori. The
-i
pilihan untukls
nomor inode daftar keinginan.Memasang sistem file membutuhkan inode direktori dan menetapkan tanda pada salinan dalam-memori kernel untuk mengatakan "sebenarnya, ketika mencari isi direktori ini, lihat sistem file lain ini sebagai gantinya" (lihat slide 10 dari presentasi ini ). Ini relatif mudah karena itu mengubah item data tunggal.
Mengapa tidak membuat entri direktori untuk Anda yang menunjuk pada inode baru? Ada dua cara Anda bisa mengimplementasikannya, yang keduanya memiliki kelemahan. Pertama adalah secara fisik menulis direktori baru ke sistem file - tetapi itu gagal jika sistem file hanya dibaca! Yang lain adalah menambahkan ke setiap proses daftar direktori daftar hal-hal "ekstra" yang tidak benar-benar ada. Ini fiddly dan berpotensi menimbulkan hit kinerja kecil pada setiap operasi file.
Jika Anda ingin titik pemasangan yang dibuat secara dinamis,
automount
sistem dapat melakukan ini. Sistem file non-disk khusus juga dapat membuat direktori sesuka hati, misproc
.sys
,devfs
Dan sebagainya.Sunting: lihat juga jawaban untuk Apa yang terjadi ketika Anda 'me-mount' folder yang ada dengan konten?
sumber
sudo mount --bind / /mnt ; ls /mnt/proc
-> kosong Saya bertanya-tanya bagaimana cara kerjanya.fs/namespace.c
, saya pikir; Saya tidak terbiasa dengan sumbernya dan tidak ingin menghabiskan waktu terlalu lama untuk menggali detailnya. "Bendera di inode" saya dapatkan dari presentasi yang ditautkan./var/cache
beberapa waktu ketika/var
gagal dipasang.) Lihat jugapath_resolution(7)
. (Linux-manpages lama memiliki halaman manual di bagian 2, seperti die.net) IDK bagaimana Linux sebenarnya bekerja secara internal, untuk mengoptimalkan memeriksa setiap komponen direktori sebagai kemungkinan mount. Mungkin pin entri VFS di cache?fs/namei.c
(path -> inode lookup) memanggil namespace.clookup_mnt()
. Ada bendera di dentry (entri cache direktori). Tapi itu hanya optimasi alias detail implementasi. Itu tidak memberi tahu Anda sistem file mana yang dipasang di sana; Anda harus melihat di tabel mount. (Lihat m_hash (), untuk detail implementasi lebih lanjut. Linux, setidaknya, menghindari perbandingan string tambahan, dan AFAICS pada saat yang sama berhasil menggunakan kembali dentry's di mis. Bind mounts, karena ditulis oleh penyihir).man 8 mount
::mount --bind foo foo
. Mengikatmount
panggilan menempel saja (bagian dari) filesystem tunggal, tidak mungkin submounts. Seluruh hierarki file termasuk sub-mount dilampirkan di tempat kedua dengan menggunakan :mount --rbind olddir newdir
Jika
mount(2)
diperlukan pembuatan direktori baru sebagai titik mount, Anda tidak bisa me-mount apa pun di bawah sistem file read-only. Itu akan bodoh, jadi kita bisa mengesampingkan itu.Jika mount secara opsional membuat direktori baru untuk menjadi mountpoint, itu akan aneh. Ini tidak seperti me-mount / unmount yang terjadi setiap saat, jadi menempatkan logika ekstra di kernel untuk melakukan dua langkah ini dengan satu pemanggilan sistem tidak akan menjadi sebuah speedup yang penting. Serahkan saja pada ruang pengguna untuk melakukan
mkdir(2)
panggilan sistem jika menginginkannya. Jawaban Dmitry menunjukkan bahwa setelahmount(2)
melakukan kedua hal itu akan membuatnya menjadi non-atom. Dan Anda ingin argumen ekstra untukmount(2)
dengan modus bendera sepertiopen(2)
mengambil, untukO_CREAT
,O_EXCL
, dll hanya akan konyol dibandingkan dengan membiarkan user-space melakukannya.Atau mungkin Anda bertanya tentang memiliki
mount(8)
(program tradisional yang membuatmount(2)
panggilan sistem) melakukan ini? Itu mungkin, tetapi sudah ada yang sangat baikmkdir(1)
untuk pekerjaan itu, dan desain Unix adalah tentang alat kecil yang baik yang dapat digabungkan. Jika Anda menginginkan alat yang melakukan keduanya, mudah untuk menulis skrip shell untuk membangun alat itu dari dua alat yang lebih sederhana. (Atau, seperti komentar muru,udisksctl
sudah melakukan ini, jadi Anda tidak perlu menulisnya.) Selain itu, normal Linuxmount(8)
dari util-linux mendukungmount -o x-mount.mkdir[=mode]
penggunaanx-
sintaksnya untuk opsi untuk userspace, daripada opsi untuk diteruskan ke sistem file.Sekarang pertanyaan yang lebih menarik: mengapa harus ada direktori di sistem berkas induk?
Seperti yang ditunjukkan oleh jawaban pjc50 (tidak ada relasi, meskipun ia memiliki inisial saya!), Memiliki mount poin muncul di daftar direktori akan memerlukan pemeriksaan tambahan pada setiap
readdir()
.Memiliki mount point ada sebagai direktori dalam direktori yang berisi mereka (pada induk FS) adalah trik yang bagus.
readdir()
tidak perlu memperhatikan bahwa itu adalah titik pemasangan sama sekali. Itu hanya terjadi jika titik mount digunakan sebagai komponen jalur. Resolusi path tentu saja harus memeriksa tabel mount untuk setiap komponen direktori dari sebuah path.sumber
If mount(2) required the creation of a new directory to be the mount point, you couldn't mount anything under a read-only filesystem. That would be dumb
- Saya berpendapat lebih pintar: Dari perspektif pengguna, sistem file read-only tidak boleh berubah, tetapi memungkinkan mounts berarti itu bisaro
. Ada banyak kasus penggunaan untuk sistem file read-only di mana argumen Anda tidak masuk akal.man 8 mount
:x-mount.mkdir[=mode]
Izinkan untuk membuat direktori target (mountpoint). Mode argumen opsional menentukan mode akses sistem file yang digunakanmkdir(2)
dalam notasi oktal. Mode standar adalah 0755. Fungsi ini hanya didukung untuk pengguna root./tmp
dan/home
. Atau read-only NFS-mount/usr
dengan lokal yang/usr/local
terpasang di atasnya. Atau lebih umum, gambar read-only yang dibagikan dengan bagian yang dapat dimodifikasi dipasang di atasnya. (mods lokal untuk gambar read-only juga bisa dilakukan pada basis per-file tersebut dengan filesystem kustom seperti overlayfs atau filesystem serikat lainnya untuk Linux, yang digunakan pada LiveCD gambar bootable.) Saya awalnya berpikir akar FS awalnya dipasang RO di boot, tetapi membuatnya bisa terjadi sebelum tunggangan lainnya.Pemasangan ke direktori yang ada membuat panggilan ke
mount
atom praktis: itu berhasil atau gagal, setidaknya dari perspektif pengguna. Jikamount
harus membuat mountpoint itu sendiri, itu akan memiliki dua titik kegagalan, sehingga tidak mungkin untuk menjamin roll kembali yang bersih. Bayangkan skenario berikut:mount
berhasil membuat mountpointmount
mencoba memasang sistem file baru ke direktori itu, tetapi gagalmount
mencoba menghapus titik mount, tetapi gagalSistem berakhir dengan efek samping yang gagal
mount
.Ini satu lagi:
umount
berhasil meng-unmount sistem fileumount
mencoba menghapus titik mount, tetapi gagalSekarang, haruskah
umount
mengembalikan keberhasilan atau kegagalan?sumber
mount
memiliki 8 kode pengembalian berbeda untuk kesalahan yang juga dapat digabungkan. Itu bisa saja menambahkan yang lain ketika penghapusan direktori gagal. man7.org/linux/man-pages/man8/mount.8.html#RETURN_CODESmount
system call tidak membuatnya. Meskipun mungkin itu hanya interpretasi / harapan saya tentang apa yang saya pikir ingin ditanyakan oleh OP, atau apa yang akan saya tanyakan jika saya bertanya.Kasus lain yang dapat terjadi:
Saat Anda boot, gambar hanya baca dasar dimuat di direktori root. Jadi, Anda ingin menimpanya ketika ingin membuat gundukan root asli. Jadi Anda dapat membayangkan bahwa mount syscall cukup menukar
ro
mountpoint kerw
.Di sini, mari kita bayangkan Anda memiliki masalah sistem file pada mountpoint root, Anda ingin dapat mencoba memperbaikinya. Dengan mount overlap, Anda dapat meng-unmount sistem file dan menggunakan
fsck
gambar dasar yang disediakan untuk menyelesaikannya.Fitur ini juga dapat berguna dalam sistem yang membutuhkan keamanan yang kuat untuk melacak perubahan antara
ro
partisi dan partisirw
.sumber
mount
diperlukan membuat direktori baru di lokasi mountpoint yang Anda tidak bisa memasang apa pun di atas sistem file read-only? Paragraf pembuka membingungkan: itu bukan cara kerja initrd Linux. Ia menggunakanpivot_root
system call untuk mengubah root fs, tidak hanya me-mount lebih banyak barang di atasnya. Itu membuatnya sulit untuk mengikuti logika Anda di paragraf berikutnya, karena saya pikir Anda bicarakanpivot_root(2)
.pivot_root
dan kemudianumount
ramdisk. Tetapi initramfs adalah rootfs: Anda tidak dapatpivot_root
rootfs, maupun unmount . Alih-alih hapus semuanya dari rootfs untuk mengosongkan spasi (find -xdev / -exec rm {} \;
), overmount rootfs dengan root baru (cd /newmount; mount --move . /; chroot .
), lampirkan stdin / stdout / stderr ke konsol / dev / baru, danexec
init
Saya selalu bertanya-tanya itu juga.
Pembungkus sederhana seperti:
disimpan sebagai skrip yang dapat dieksekusi bernama
mount
dalam direktori yang menimpa/bin
di PATH Anda harus mengurus ini jika itu mengganggu Anda terlalu banyak(Sebelum menjalankan
mount
biner yang sebenarnya , ia membuat direktori bernama setelah argumen terakhirmount
, jika direktori tersebut belum ada.)Sebagai alternatif, jika Anda tidak ingin undangan
mount
pembungkus yang gagal untuk membuat direktori, Anda dapat melakukan:sumber
mount
perintah kemudian menggunakan direktori yang dibuat?mount /dev/foo /some/path
? Saya menganggap itu akan berfungsi sepertiudisksctl
halnya, sehingga Anda akan larimount /dev/foo
.eval
memperluas$#
, menggunakan"${@:-1}"
. Saya menguji ini dengan DASH, karena saya pikir itu tidak mendukung apa pun di luar apa yang POSIX sh diperlukan untuk mendukung./bin/dash -c 'echo ${@:-1}' foo bar
cetakanbar
.man -o x-mount.mkdir
...