Masalah apa yang sebenarnya dipecahkan udev?

28

Dalam hal ini, apa sebenarnya yang salah dengan sekelompok file statis /dev? Tampaknya tidak cukup memuaskan bagi para pengembang untuk menemukan kembali roda ini dengan hitungan saya 3 kali sekarang ( devfs-> udev + HAL-> udev), dan sekarang tampaknya ia juga masuk ke Program Grand Unified Init, jadi empat kali.

Saya ingat ketika saya pertama kali mulai menggunakan Linux tahun lalu terkejut bahwa meskipun mengklaim bahwa "semuanya adalah file", tidak ada /dev/eth0(yang kemudian masuk akal, karena itu bukan perangkat char atau blok - meskipun tipe perangkat "paket" akan menarik ...). Karena itu, mengapa program yang menangani char dan memblokir bagan file perangkat juga bertanggung jawab untuk perangkat jaringan? Saya telah melihat referensi samar-samar untuk "fleksibilitas", tetapi apa ini menambahkan atas apa, katakanlah, ifconfig (8) yang dilakukan dengan hanya melihat /proc/net/dev? Saya tahu, misalnya, NetworkManager tidak akan berada di Net atau OpenBSD dalam waktu dekat karena tergantung pada udev, yang tidak ingin ditulis oleh tim mana pun; apa yang saya tidak/devyang sudah terpapar beberapa cara oleh kernel (dan tidak ada satu pun di dalamnya /dev!).

Apakah itu hanya karena hotplugging? Apakah ada masalah dengan kernel hanya mendengarkan bus fisik dan memuat modul yang sesuai pada pesan "perangkat ditambahkan"? Atau, Tuhan melarang, administrator yang sebenarnya melakukannya? Saya ingat kembali pada awal 2000-an server saya kadang-kadang akan menginisialisasi kartu jaringan mereka dalam urutan yang tidak terduga, dan saya kira masuk akal untuk memiliki penamaan yang diputuskan di userland (meskipun itu tidak terlalu sulit untuk diperbaiki saat itu), tetapi ini seperti palu godam untuk seekor kecoa. (Atau mungkin masalah itu mengenai kasus penggunaan yang tidak saya pikirkan jauh lebih sulit daripada server atau PC rackmount, yang merupakan pengalaman saya.)

Jadi, jelaskan pertanyaan saya: masalah apa yang sebenarnya udev selesaikan, dan bagaimana devfs, HAL, dan / atau file lama yang polos gagal menyelesaikannya? Apakah ada alasan khusus untuk banyak hal yang berbeda (hotplugging, manajemen perangkat umum, manajemen perangkat jaringan, penamaan perangkat, prioritas driver, dll.) Untuk semuanya menjadi satu program?

Bandrami
sumber
5
Garis pemikiran Anda baik untuk administrator sistem yang menangani server, tetapi tidak menjawab kebutuhan laptop, desktop modern tipikal, atau pengguna ponsel. File statis di /devtidak (dengan mudah atau mudah) mengatasi hal-hal seperti orang yang memasukkan adaptor jaringan USB atau adapter jaringan virtual yang ditambahkan atau diturunkan saat sistem sedang berjalan. Namun, tidak ada yang menghentikan Anda untuk mencopot udevdan kembali ke /devrute direktori statis lama .
LawrenceC
Sebenarnya ada implementasi devfs yang bersaing, awalnya. Jadi ini lebih dari tiga ... (Meskipun saya tidak berpikir Anda dapat menghitung udev + HAL sebagai satu.)
derobert

Jawaban:

33

Dua hal lagi: pemindahan Linux ke perusahaan & server besar lainnya membuat statis /devmenjadi rusak. Kemajuan teknologi, baik di konsumen dan perusahaan, memperlihatkan statis / dev sebagai lelucon. [Jawaban ini mengisi lebih banyak dari latar belakang, terutama mengapa devf digantikan dengan udev].

Kelelahan Ruang Bilangan Mayor & Minor

/devfile diidentifikasi di dalam kernel dengan nomor utama dan kecil mereka. Kernel tidak pernah benar-benar peduli tentang nama (dan Anda bisa, misalnya, mv /dev/sda /dev/disk-1dan itu akan terus bekerja — walaupun tentu saja program tidak akan tahu di mana menemukannya).

Dengan statis /dev, Anda perlu mengalokasikan angka besar / kecil untuk setiap perangkat potensial yang bisa ada. Angka-angka ini harus unik secara global, karena mereka dikirim sebagai bagian dari distro, bukan dibuat atas permintaan. Masalahnya adalah masing-masing angka 8-bit — kisarannya adalah 0-255.

Awalnya, misalnya, Linux dimulai dengan 8,0 menjadi sda, 8,1 menjadi sda1, 8,16 menjadi sdb, dll. Tetapi orang-orang terus menambahkan semakin banyak disk ke mesin, terutama ketika Anda mempertimbangkan hal-hal seperti saluran serat. Jadi pada beberapa titik, angka utama 65-71 ditambahkan untuk lebih banyak disk. Kemudian, bilangan utama 128–135. Namun orang-orang terus menginginkan lebih banyak disk ...

Dan format tabel partisi seperti GPT muncul, mendukung lebih banyak partisi per disk. Dan tentu saja perangkat lain memakan ruang angka: berbagai pengontrol RAID, manajemen volume logis, dll.

Hasil akhirnya dapat dilihat di Daftar Perangkat Linux LANANA . Jika Anda melihat daftar 2.6 (satu-satunya yang masih ada di sana), banyak blok nomor utama hingga 200 (maks: 255) —digunakan. Jelas, angkanya akan habis.

Mengubah ke angka yang lebih besar tidak mudah. Itu mengubah ABI kernel. Tergantung pada sistem file, itu mengubah tata letak pada disk. Tetapi, tentu saja, sebagian besar perangkat itu tidak ada pada satu sistem apa pun, bahkan perangkat yang (misalnya) kehabisan disk SCSI mungkin memiliki banyak hal gratis — mungkin tidak memerlukan hard disk IBM XT, sebagai contoh.

Dengan dinamis /dev, distro tidak harus mengirim nomor perangkat. Mereka tidak lagi harus unik secara global. Mereka bahkan tidak harus unik di sepatu bot.

Nama perangkat tidak dapat diprediksi

Dulu sangat mudah untuk menetapkan nomor untuk semuanya. Papan memiliki dua saluran IDE; setiap saluran IDE mendukung satu master, dan satu slave. Anda dapat menetapkan dalam urutan saluran, dan urutan master-kemudian-budak. Jadi hdamenjadi saluran pertama, master; hdbsaluran pertama, budak; hdcsaluran kedua, master; dll. Itu dapat diprediksi dan stabil. Mereka dapat berubah jika Anda menambahkan drive baru, atau menghapus satu, tetapi tidak ada perubahan perangkat keras, mereka statis.

Anda bisa menempatkan /dev/hda1di Anda /etc/fstabdan yakin itu akan tinggal kerja, setidaknya perubahan hardware absen.

IDE bekerja seperti itu. Tidak ada setelah itu.

SATA tampaknya sederhana: satu port, satu disk. Tapi tidak demikian; memungkinkan pengganda port. Dan itu memungkinkan hot-swap. Namun, jika tidak ada perubahan perangkat keras, Anda sebenarnya masih dapat tetap membuat pemetaan berfungsi.

USB jauh lebih buruk. Tidak hanya itu memungkinkan hot swap, itu khas. Orang-orang mencolokkan USB flash drive setiap saat. Selanjutnya, perangkat dapat memerlukan waktu beberapa saat untuk menyelidiki — dan benar-benar dapat berubah kapan pun mereka mau (mis., Ketika menghidupkan atau mematikan mode penyimpanan USB pada ponsel Anda). Firewire serupa. Dengan tidak bisa Anda benar-benar datang dengan pemetaan yang stabil.

Disk yang terhubung jaringan tidak memiliki urutan port apa pun yang melekat. Satu-satunya urutan penggunaan kernel adalah urutan mereka muncul. Sama dengan volume logis.

Pencarian kecepatan boot juga membuat segalanya lebih buruk. Awalnya, kernel akan dengan senang hati duduk dan menunggu cukup lama, misalnya, semua perangkat USB diinisialisasi. Untuk sepenuhnya menyelidiki semua bus SCSI, dll. Probe tersebut dibuat menjadi tugas latar belakang; boot tidak lagi menunggu mereka. Perangkat ditambahkan sebagai probe selesai.

Jadi kernel dibiarkan dengan, lebih atau kurang, "urutan apa pun yang mereka tampilkan". Ini berarti bahwa banyak jenis perangkat dapat dan memang mengubah urutan setiap boot — apa yang ada pada satu boot /dev/sdbadalah pada boot lain /dev/sdc. Ini membuat gagasan /devlelucon statis .

Ringkasan

Ketika Anda mengambil kombinasi statis /devmenjadi semakin tidak berarti karena pesanan penyelidikan perangkat yang tidak dapat diprediksi, dan terus mengalokasikan nomor statis utama / minor yang menyebabkan pekerjaan substansial tidak habis, menjadi jelas mengapa pengembang Linux memilih untuk beralih ke dinamis /dev.

derobert
sumber
2
Printer USB dulunya sangat sulit untuk dipasang, harus lsusb -vvmencari di mana printer saya disembunyikan dari boot ke boot. Saya harus mencari bit seperti ini: "Bus 001 Device 003: ID 04f9: 0217"
slm
24

Pertanyaan bagus.

Di satu sisi, argumen ini dapat berbalik: karena kernel 2.6.13 memperkenalkan versi baru uevent, pasti akan terjadi yang devfsperlu ditulis ulang untuk memanfaatkan fitur baru antarmuka. Jadi, bisa dibilang, pertanyaannya adalah mengapa perubahan kernel.

Namun, dengan mempertimbangkannya, pertanyaan Anda dijawab dalam artikel Wikipedia ini :

Tidak seperti sistem Unix tradisional, di mana node perangkat dalam direktori / dev telah menjadi kumpulan file statis, manajer perangkat udev Linux secara dinamis hanya menyediakan node untuk perangkat yang benar-benar ada pada sistem. Meskipun devfs digunakan untuk menyediakan fungsionalitas yang serupa, Greg Kroah-Hartman mengutip sejumlah alasan untuk lebih memilih implementasinya daripada devfs:

1) udev mendukung penamaan perangkat yang persisten, yang tidak bergantung pada, misalnya, urutan pemasangan perangkat ke sistem. Pengaturan udev default memberikan nama persisten untuk perangkat penyimpanan. Setiap hard disk dikenali oleh id sistem file yang unik, nama disk dan lokasi fisik pada perangkat keras yang terhubung dengannya.

2) udev dieksekusi sepenuhnya di ruang pengguna, sebagai lawan dari ruang kernel devfs. Salah satu konsekuensinya adalah udev memindahkan kebijakan penamaan dari kernel dan dapat menjalankan program sewenang-wenang untuk menyusun nama perangkat dari properti perangkat, sebelum node dibuat; di sana, seluruh proses juga interruptible dan berjalan dengan prioritas yang lebih rendah.

Saya mungkin harus menambahkan bahwa dengan udev kemungkinan race condition, yang pada dasarnya merusak penamaan perangkat di devfs dan hotplug, dihindari. Dengan kata lain: dengan devfs tidak ada cara untuk memastikan bahwa port ethernet paling kiri Anda akan dipanggil eth0dan yang paling kanan eth1, membuat (sebagai contoh murni) pengaturan router (satu port ke WAN, satu port ke LAN) sulit untuk melaksanakan.

Adopsi skema penamaan disk berdasarkan GUID adalah nilai tambah lainnya, dan memindahkan seluruh proses ke ruang pengguna yang lebih besar: sudahkah Anda mencari di situs ini untuk melihat berapa banyak orang yang menulis aturan udev mereka sendiri?

Sebagai contoh sederhana dari keuntungan yang melekat dalam memiliki udev di userspace, periksa pertanyaan ini atau pertanyaan lain ini , keduanya di situs ini.

MariusMatutiae
sumber