Apakah slash (/) bagian dari nama direktori root Linux?

46

Apakah slash ( /) benar-benar bagian dari nama direktori root Linux? Atau itu hanya simbol untuk itu?

Bagaimana dengan /etcdan seterusnya?

Memperbarui

Misalkan /dev/sda2adalah perangkat blok direktori root Linux.

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24-Mar-2018)
debugfs:   pwd
[pwd] INODE: 2 PATH: /
[root] INODE: 2 PATH: /
debugfs:   stat /
Inode: 2    Jenis:     Mode direktori : 0755 Bendera: 0x80000
Generasi: 0 Versi: 0x00000000: 00000077
Pengguna: 0 Grup: 0 Proyek: 0 Ukuran: 4096
File ACL: 0
Tautan: 25 Blockcount: 8
Fragmen: Alamat: 0 Nomor: 0 Ukuran: 0
 ctime: 0x5b13c9f1: 3f017990 - Sun 3 Jun 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - Sun 3 Jun 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - Sun 3 Jun 15:28:57 2018
crtime: 0x5aad1843: 00000000 - Sabtu 17 Maret 16:59:39 2018
Ukuran bidang inode ekstra: 32
EXTENTS:
(0): 9249

Jadi ada direktori di sana, inode # 2, tetapi tidak memiliki nama.

mlibre
sumber
1
Mengenai pembaruan terakhir Anda menunjukkan beberapa debugfsoutput. Bisakah Anda mengklarifikasi bagaimana ini mengubah pertanyaan?
Kusalananda
Tidak. Saya hanya ingin menyelesaikan jawaban. tetapi saya tidak ingin menambahkan yang lain. jadi saya memperbaruinya. jika Anda dapat memasukkan baris thease di jawaban Anda akan menghapusnya
mlibre

Jawaban:

61

Standar POSIX.1-2008 mengatakan

Pathname yang terdiri dari satu /harus menyelesaikan ke direktori root dari proses. Pathname nol tidak akan berhasil diselesaikan.

Standar lebih lanjut membuat perbedaan antara nama file dan nama path . /adalah pathname untuk path dari direktori root. Nama direktori adalah "direktori root", tetapi dalam sistem file itu tidak bernama, itu tidak memiliki nama file. Jika memiliki nama file, nama itu akan menjadi entri direktori di direktori di atas direktori root, dan tidak ada direktori seperti itu.

Karakter /tidak pernah bisa menjadi bagian dari nama file karena merupakan pemisah jalur.

Untuk kejelasan: /bukan nama direktori root, tetapi path untuk itu, pathname -nya .

/etcadalah nama path lain. Ini adalah nama jalur absolut ke etcdirektori. Nama direktori pada path tersebut adalah etc(nama file-nya etc).

/usr/local/bin/curladalah pathname dari curlfile yang dapat dieksekusi dengan cara yang sama yaitu /etcpathname dari etcdirektori.

Kusalananda
sumber
"Jika itu memiliki nama file, nama itu akan menjadi entri direktori di direktori di atas direktori root" Ini akan menjadi dua hal, secara teknis - nomor inode dan nama (yang seperti yang kita tahu adalah inode 2). Ini juga menarik untuk dicatat bahwa /..menunjuk kembali ke /, dan /memang memiliki entri direktori untuk dirinya sendiri - itu yang lama yang baik /.; semua 3 hal menunjuk ke inode yang sama - 2.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Secara teknis , direktori root adalah "per-proses", yang penting dalam lingkungan chroot. Dalam chroot, nomor inode dari direktori root tidak akan menjadi nomor tertentu (itu akan menjadi nomor inode dari root chroot). Juga, saya berpikir bahwa angka 2 (dalam situasi non-chroot) tergantung pada sistem file yang digunakan.
Kusalananda
Saya juga memperhatikan bahwa /didefinisikan dalam istilah per-proses root tetapi saya tidak tahu bahwa inode chrootbelum tentu 2. Fakta yang sangat menarik. Ini juga menimbulkan pertanyaan tentang apa /direktori untuk proses kernel istimewa. Apakah itu berarti hanya proses ruang pengguna /yang terkait dengannya?
Sergiy Kolodyazhnyy
37

slash adalah pemisah ; nama direktori tidak termasuk pemisah, tetapi nama path lengkap termasuk pemisah.

Jadi "root-level" / tidak memiliki nama . Pada kebanyakan sistem mirip Unix, ini diperlakukan sebagai kasus khusus seperti .dan ..(walaupun tentu saja tidak ada perbedaan antara keduanya di tingkat root).

Nomenklatur dapat berbeda. POSIX.1-2017, misalnya, mencantumkan beberapa definisi yang umum digunakan :

  • 3.2 Pathname absolut

    Pathname dimulai dengan satu atau lebih dari dua <slash>karakter; lihat juga Pathname .

  • 3.271 Pathname

    String yang digunakan untuk mengidentifikasi file. Dalam konteks POSIX.1-2008, nama path mungkin terbatas pada {PATH_MAX} byte, termasuk terminasi null byte. Ini memiliki <slash>karakter awal opsional , diikuti oleh nol atau lebih nama file yang dipisahkan oleh <slash>karakter. Pathname opsional dapat berisi satu atau lebih <slash>karakter trailing Beberapa <slash>karakter berturut-turut dianggap sama dengan satu <slash>, kecuali untuk kasus tepat dua <slash>karakter utama .

    Catatan: Jika nama path hanya terdiri dari byte yang sesuai dengan karakter dari set karakter nama file portabel (lihat Set Karakter File Portabel ), <slash>karakter, dan penghentian tunggal<NUL>karakter, nama path akan dapat digunakan sebagai string karakter di semua lokal yang didukung; jika tidak, pathname mungkin hanya berupa string (bukan string karakter). Selain itu, karena pengodean byte-tunggal <slash>karakter harus sama di semua lokal dan tidak terjadi dalam karakter multi-byte, referensi ke <slash>karakter dalam pathname didefinisikan dengan baik bahkan ketika pathname bukan karakter tali. Namun, properti ini tidak selalu berlaku untuk karakter yang tersisa dalam set karakter nama file portabel.

  • 3.272 Komponen Pathname

    Lihat Nama File di Nama File .

  • 3.170 Nama file

    Urutan byte yang terdiri dari 1 hingga {NAME_MAX}byte yang digunakan untuk menamai file. Bytes yang menyusun nama tidak boleh berisi karakter <NUL>atau <slash>. Dalam konteks nama path, setiap nama file harus diikuti oleh a <slash>atau <NUL>karakter; di tempat lain, nama file diikuti oleh <NUL>karakter membentuk string (tetapi tidak harus string karakter). Nama file dot dan dot-dotmemiliki arti khusus. Nama file kadang-kadang disebut sebagai "komponen pathname". Lihat juga Pathname .

Jadi ... jika Anda mencari klarifikasi , itu mungkin bukan pemberhentian pertama Anda. Tutorial seperti halaman Konsep UNIX ini bermanfaat, misalnya, menunjukkan bahwa "nama path lengkap" identik dengan "absolut" pathname ".

Thomas Dickey
sumber
3
Nitpick: dot dan dot-dot adalah nama file, bukan nama path. Sebenarnya, standar POSIX memiliki formulasi yang aneh "Sebagai kasus khusus, dalam direktori root, dot-dot dapat merujuk ke direktori root itu sendiri." (Penekanan saya).
Kusalananda
Jadi, membaca spesifikasi surat itu, /bukan nama file yang valid atau komponen pathname, dan itu bukan string yang berisi komponen seperti itu tetapi masih pathname yang benar-benar valid untuk satu direktori tertentu. Yang harus ada, meskipun bagian yang menuntut ini tidak menyebut "namanya". Entah bagaimana, saya menemukan ini sedikit menghibur.
ilkkachu
Itu dijawab dalam POSIX : Ini memiliki karakter awal opsional, diikuti oleh nol atau lebih nama file yang dipisahkan oleh karakter.
Thomas Dickey
@ Kusalananda mengulas alasan spesifik untuk penekanan Anda. yang Mei di mendefinisikan spesifikasi adalah pernyataan yang jelas tentang jaminan sehubungan dengan tes implementasi. di mana dapat digunakan, spek memastikan setiap pengikut pemula dari perilaku yang ditentukan. dengan kata lain, pelaksanaan setiap mungkin mengandalkan ..pada /menghubungkan /.
mikeserv
19

Di Unix, file (dan direktori hanyalah file) tidak memiliki "nama". Tautan memiliki nama, tautan adalah entri dalam direktori yang memetakan nama ke file.

Anda mungkin mengatakan, bahwa tautan memberi nama ke file, tetapi perhatikan: ini menyiratkan bahwa suatu file dapat memiliki lebih dari satu nama, karena dapat memiliki lebih dari satu tautan.

Karena direktori root adalah, well, direktori root, tidak ada direktori "lebih tinggi" di mana mungkin ada tautan ke sana, jadi tidak mungkin ada nama yang dikaitkan dengannya. Secara teori dimungkinkan untuk menambahkan tautan ke direktori root di dalam beberapa direktori lain, tetapi sebagian besar Unices melarang menambahkan tautan ke direktori yang ada, karena hal itu dapat menyebabkan siklus dalam hierarki sistem file (yang sebenarnya merupakan grafik berarah), dan mendeteksi siklus dalam grafik itu mahal, tetapi tidak mendeteksi mereka dapat menyebabkan rekursi tak terbatas ketika mencoba untuk menyelesaikan nama dalam kernel.

Jadi, pada dasarnya, direktori root tidak memiliki nama, karena tidak ada direktori di atasnya di mana kita dapat merekam nama.

Seperti yang ditunjukkan dalam jawaban lain, kita perlu membedakan antara nama dan jalur (nama). Direktori root dapat dirujuk melalui jalur (nama) /.

Jörg W Mittag
sumber
Ya, file dapat memiliki lebih dari satu nama, seperti halnya orang. Suami putri saya yang lebih muda biasanya menggunakan nama tengahnya, tetapi ia jelas harus menjawab nama depannya juga. Nama utama direktori root adalah "/", diucapkan "slash", karena pathname absolutnya adalah "/" (dan nama-nama berdasarkan nama path relatif tidak terlalu membantu). (Menyebutnya "root" beresiko kebingungan dengan "/ root", yang harus selalu disebut "root slash".
Monty Harder
1
Saya suka titik itu tidak memiliki nama karena tidak ada direktori yang lebih tinggi untuk merekam nama itu. Itu mengklarifikasi konsep dengan baik.
Joe
7

Penggunaan kata "nama" sedikit fleksibel; itu bisa merujuk ke "nama jalur yang sepenuhnya memenuhi syarat"; itu bisa merujuk ke "entri direktori"; itu bisa merujuk ke "nama file" yang diteruskan ke berbagai fungsi atau rutinitas.

Jadi, misalnya, /etc/foodan /var/tmp/../../etc/foodan /tmp/../../../../../../foosemua cara merujuk ke file yang sama; mereka semua nama yang valid , seperti fooketika di /etcdirektori.

Jadi mari kita kembali ke dasar.

Nama file di unix terbuat dari komponen yang dipisahkan oleh pemisah direktori /. Cukup banyak satu-satunya batasan pada komponen adalah bahwa mereka tidak dapat berisi karakter /atau NUL; hal lain diizinkan.

Jadi "memenuhi syarat nama jalan" dari /etcadalah string lengkap: /etc. Ini berarti memiliki etckomponen dalam direktori root.

Demikian pula /x/y/z/fooakan memiliki fookomponen dalam /x/y/zdirektori.

Sekarang direktori root unik karena tidak memiliki komponen dalam direktori induk; itu hanya memiliki nama path lengkap sebagai nama: /.

Stephen Harris
sumber