GNU/Linux >> Belajar Linux >  >> Linux

Apakah dua subdirektori dengan akar yang sama dijamin berada pada sistem file terpasang yang sama?

Mereka tidak menjamin itu. Ada kemungkinan bahwa /foo/oldPath adalah titik pemasangan.

Namun, hal ini dapat dengan mudah diperiksa dengan menjalankan mount | grep 'on /foo/oldPath' Tidak ada output yang menunjukkan bahwa oldPath direktori bukan titik pemasangan.

Anda harus lebih berhati-hati jika menggunakan direktori bersarang, karena Anda dapat memiliki titik pemasangan di mana saja.

Saya tidak yakin apakah ini otomatis, tetapi perlu dicatat bahwa bidang ke-3 dari mount (dipisahkan dengan spasi) adalah titik pemasangan untuk setiap baris, jadi gunakan cut -d ' ' -f 3 dapat digunakan untuk mengekstrak jalur (jika Anda perlu memverifikasi itu bukan hanya substring dari titik pemasangan lain, seperti /foo/oldPath/nested/mountPoint )

Jika Anda ingin menerjemahkannya ke dalam kode C/C++, Anda mungkin dapat menggunakan system("mount | grep 'on /foo/oldPath'") , tapi aku tidak akan bersumpah dengan itu. Anda mungkin lebih beruntung di StackOverflow untuk detail implementasi lebih lanjut di sana jika Anda membutuhkannya.


Anda tidak boleh mencoba ini, karena berbagai alasan (dirinci dalam jawaban lain):/foo/oldPath bisa sendiri menjadi mountpoint, atau sistem file overlay bisa hadir dan mencegah pemindahan file. Anda bahkan dapat menemukan mount bind, pada file tunggal, yang juga akan menyebabkan masalah saat mengganti nama file.

Alih-alih mencoba menentukan sebelumnya apakah file dapat diganti namanya, Anda harus mencoba mengganti namanya dan mengatasi kesalahannya. rename akan mengembalikan -1 jika terjadi kesalahan, dan errno akan disetel ke EXDEV jika penggantian nama tidak memungkinkan karena masalah cross-mount. Anda kemudian dapat melanjutkan dengan cara lain (salin dan hapus).

Secara umum, untuk menentukan apakah dua objek sistem file berada pada sistem file yang sama, Anda harus menjalankan stat di atasnya dan lihat pengidentifikasi perangkat (kode st_dev di struct stat ). Dua objek sistem file pada sistem file yang sama akan memiliki pengidentifikasi perangkat yang sama.


Perhatikan bahwa saat Anda menjalankan overlay, Anda tidak dapat mengandalkan rename() dari direktori yang sudah ada sebelumnya.

Saya pikir Anda biasanya dapat mengabaikan kemungkinan ini, jika Anda tidak menulis alat manajemen file tujuan umum ... Misalnya, manajer paket ... dalam hal ini Anda mungkin menganggapnya tidak dapat diperbaiki (karena alasan atomisitas) dan ingin mengandalkan redirect_dir yang baru format hamparan.

Jadi ini lebih merupakan catatan penting untuk memberi tahu Anda bahwa ini adalah Linux, kami tidak mematuhi POSIX jika kami tidak mau, dan "dijamin" adalah kata yang sangat kuat :).

https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt

Kecuali jika fitur "redirect_dir" diaktifkan, rename(2) pada direktori yang lebih rendah atau gabungan akan gagal dengan EXDEV.

Hamparan sudah tidak sesuai dengan ekspektasi biasa dari sistem file unix dalam detail lainnya:

Objek yang bukan direktori (file, symlink, file khusus perangkat, dll.) Disajikan baik dari sistem file atas atau bawah secepat mungkin. Ketika sebuah file dalam sistem file yang lebih rendah diakses dengan cara yang memerlukan akses tulis, seperti membuka untuk akses tulis, mengubah beberapa metadata, dll., file pertama-tama disalin dari sistem file yang lebih rendah ke sistem file yang lebih tinggi (copy_up)...

Operasi copy_up pada dasarnya membuat file baru yang identik dan memindahkannya ke nama lama. File apa pun yang terbuka yang merujuk ke inode ini akan mengakses data lama.


Linux
  1. Nonaktifkan masuk dengan akun root

  2. Bagaimana Cara Mengedit File Sistem Dengan Kate Editor??

  3. Periksa izin file Linux dengan ls

  1. Apa cara terbaik untuk menentukan bahwa dua jalur file merujuk ke objek file yang sama?

  2. Mengapa hash md5 dari dua tarball dari file yang sama berbeda?

  3. Mengapa sistem file saya dipasang sebagai hanya-baca?

  1. Memulai dengan ls

  2. Diff Reports Dua File Berbeda, Meski Sama!?

  3. per proses titik pemasangan sistem file pribadi