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.