Memahami / dev dan subdir serta file-nya

53
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Saya bertanya-tanya apakah semua file di bawah /devdan subdirektori adalah semua deskriptor file perangkat?
  2. Mengapa ada begitu banyak tautan dari satu sama lain? Sebagai contoh, /dev/fd/0, /dev/stdin, /proc/self/fd/0semua link ke /dev/pts/2.
  3. Jika ldi lrwx------link yang berarti, apa cdi crw--w---- berarti?
Tim
sumber
3
Dan untuk menjawab # 3, c berarti perangkat karakter, atau karakter khusus . b adalah singkatan dari special block .
felixphew

Jawaban:

79

Hampir semua file di bawah /devadalah file perangkat . Sedangkan membaca dan menulis ke file biasa menyimpan data pada disk atau sistem file lain, mengakses file perangkat berkomunikasi dengan driver di kernel, yang umumnya pada gilirannya berkomunikasi dengan perangkat keras (perangkat perangkat keras, maka namanya).

Ada dua jenis file perangkat: perangkat blok (ditunjukkan oleh bsebagai karakter pertama dalam output ls -l), dan perangkat karakter (ditunjukkan oleh c). Perbedaan antara perangkat blok dan karakter tidak sepenuhnya universal. Block device adalah hal-hal seperti disk, yang berperilaku seperti file besar berukuran tetap: jika Anda menulis byte pada offset tertentu, dan kemudian membaca dari perangkat pada offset itu, Anda mendapatkan byte itu kembali. Perangkat karakter hanya tentang hal lain, di mana menulis byte memiliki efek langsung (misalnya dipancarkan pada baris serial) dan membaca byte juga memiliki efek langsung (misalnya dibaca dari port serial).

Arti file perangkat ditentukan oleh nomornya, bukan oleh namanya (nama itu penting untuk aplikasi, tetapi tidak untuk kernel). Jumlahnya sebenarnya adalah dua angka: angka utama menunjukkan driver mana yang bertanggung jawab untuk perangkat ini, dan nomor minor memungkinkan pengemudi untuk mendorong beberapa perangkat several. Angka-angka ini muncul dalam ls -ldaftar, di mana Anda biasanya akan menemukan ukuran file. Misalnya brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ perangkat ini adalah 8 utama, minor 0.

Beberapa file perangkat di bawah /devtidak sesuai dengan perangkat perangkat keras. Salah satu yang ada pada setiap sistem unix adalah /dev/null; menulis ke sana tidak berpengaruh, dan membaca darinya tidak pernah mengembalikan data apa pun. Seringkali nyaman dalam skrip shell, ketika Anda ingin mengabaikan output dari perintah ( >/dev/null) atau menjalankan perintah tanpa input ( </dev/null). Contoh umum lainnya adalah /dev/zero(yang mengembalikan null byte ad infinitum ) /dev/urandom(yang mengembalikan byte acak ad infinitum ).

Beberapa file perangkat memiliki arti yang tergantung pada proses yang mengaksesnya. Misalnya, /dev/stdinmenunjuk input standar dari proses saat ini; membuka dari memiliki efek yang kira-kira sama dengan membuka file asli yang dibuka sebagai input standar proses. Agak serupa, /dev/ttymenunjuk terminal tempat proses terhubung. Di Linux, saat ini, /dev/stdindan teman tidak diimplementasikan sebagai perangkat karakter, melainkan sebagai tautan simbolis ke mekanisme yang lebih umum yang memungkinkan setiap deskriptor file untuk direferensikan (bukan hanya 0, 1 dan 2 di bawah metode tradisional); misalnya /dev/stdinadalah tautan simbolis ke /proc/self/fd/0. Lihat Bagaimana / dev / fd berhubungan dengan / proc / self / fd /? .

Anda akan menemukan sejumlah tautan simbolis di bawah /dev. Ini dapat terjadi karena alasan historis: file perangkat dipindahkan dari satu nama ke nama lain, tetapi beberapa aplikasi masih menggunakan nama lama. Sebagai contoh, /dev/scd0adalah tautan simbolis ke /dev/sr0Linux; keduanya menunjuk perangkat CD pertama. Alasan lain untuk link simbolik adalah organisasi: di Linux, Anda akan menemukan hard disk dan partisi di beberapa tempat: /dev/sdadan /dev/sda1dan teman-teman (setiap disk yang ditunjuk oleh surat sewenang-wenang, dan partisi sesuai dengan tata letak partisi), /dev/disk/by-id/*(disk yang ditunjuk oleh nomor seri unik), /dev/disk/by-label/*(partisi dengan sistem file, ditunjuk oleh label pilihan manusia); dan lainnya. Tautan simbolik juga digunakan ketika nama perangkat generik dapat menjadi salah satu dari beberapa; sebagai contoh/dev/dvdmungkin tautan simbolis ke /dev/sr0, atau mungkin tautan /dev/sr1jika Anda memiliki dua pembaca CD dan yang kedua adalah menjadi pembaca DVD default.

Akhirnya, ada beberapa file lain yang mungkin Anda temukan di bawah /dev, karena alasan tradisional. Anda tidak akan menemukan hal yang sama di setiap sistem. Pada sebagian besar unices, /dev/logadalah soket yang digunakan program untuk memancarkan pesan log. /dev/MAKEDEVadalah skrip yang membuat entri dalam /dev. Pada sistem Linux modern, entri dalam /dev/dibuat secara otomatis oleh udev , usang MAKEDEV.

¹ Ini sebenarnya tidak lagi berlaku di Linux, tetapi detail ini hanya penting bagi penulis driver perangkat.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih! Dengan "Arti file perangkat ditentukan oleh nomornya", maksud Anda deskriptor file?
Tim
@Tim: Tidak, angka-angka muncul dalam ls -ldaftar di mana Anda biasanya menemukan ukuran file, sebelum tanggal, misalnya brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ perangkat ini adalah 8 utama, minor 0. Nomor perangkat tidak sering muncul dalam praktik, saya hanya menyebut mereka untuk mengatakan apa yang membuat perangkat menjadi perangkat (yang paling penting, itu bukan nama file). Nomor deskriptor file hanya memiliki arti dalam proses tertentu.
Gilles 'SANGAT berhenti menjadi jahat'
Tidak, membuka /dev/stdin(=> /proc/self/fd/0) di Linux tidak memiliki efek yang sama dengan menduplikasi input standar. Untuk melihat perbedaannya,, su - non_root_usermaka exec 5</dev/stdinakan gagal dengan "Izin Ditolak", tetapi exec 5<&0akan berhasil. Dan bukan hanya itu fd baru akan dibuka dengan bendera yang berbeda, segala sesuatu tentang file objek ( "open file descrip tion " di POSIX lingo) akan berbeda (file pointer offset, non / modus blocking, dll).
Mosvy
14
  1. Ya - baik secara langsung atau sebagai symlink - itulah gunanya /dev/.
  2. Untuk berbagai tujuan: kadang-kadang untuk kompatibilitas antara skema penamaan, kadang-kadang diperlukan untuk lingkungan kerja - seperti dalam contoh /dev/stdin. Ini tidak menunjuk secara statis ke /dev/pts/2atau yang lain - hanya beralih ke terminal lain dan Anda akan melihat. /dev/stdinadalah input standar dari sesi terminal Anda saat ini . Itu juga contoh mengapa perlu symlink.
  3. Lihat man mknoddan info coreutils 'mknod invocation'. Secara umum, csingkatan dari tipe perangkat karakter.
rozcietrzewiacz
sumber
3
"input standar dari sesi terminal Anda saat ini" agak ambigu. /dev/stdinmengacu pada input standar dari proses yang akan membukanya. Semua yang ada di dalamnya /proc/$pidadalah data yang bergantung pada proses, dan /proc/selfmerupakan semacam symlink ajaib yang menunjuk ke data proses itu sendiri.
Stéphane Gimenez
11

Untuk pertanyaan pertama Anda, mereka bukan deskriptor file, mereka adalah file perangkat. (alias "dev node")

File-file itu terikat dengan driver yang menangani perangkat menggunakan nomor utama dan kecil. (Misalnya, "136, 2" dalam lsoutput Anda merujuk ke driver perangkat terikat ke nomor utama 136, dan menentukan perangkat # 2 yang ditangani oleh driver itu.)

Huruf keluaran pertama ls -ladalah jenis perangkat jika ada file perangkat. Jika itu 'c' itu adalah perangkat karakter, atau jika itu adalah 'b', itu adalah perangkat blok.

Untuk pertanyaan kedua Anda, lihat jawaban di atas oleh rozcietrzewiacz.

penguasa hukum
sumber
1
Tautan "Pengantar Driver Perangkat" tampaknya rusak.
Slothworks