Setiap simpul perangkat di bawah /dev
memiliki pasangan nomor mayor / minornya sendiri. Saya tahu bahwa kami dapat mengambil pasangan angka ini dari simpul perangkat dengan cara stat
, seperti ini:
stat -c 'major: %t minor: %T' <file>
Atau, ls -l
juga menunjukkan angka-angka ini.
Tapi bagaimana kita bisa mendapatkan node perangkat dengan angka besar dan kecil? Satu-satunya cara saya sadar adalah semacam ls -l
+ awk
trik, tapi saya sangat berharap ada solusi yang lebih baik.
Jawaban:
Saya menemukan pendekatan yang lebih sederhana dengan menggunakan sistem pseudofiles sys , di / sys / dev Anda memiliki perangkat yang dipesan berdasarkan jenis lalu oleh may / minor, file uevent berisi nama perangkat dan banyak info lainnya.
Jadi misalnya,
Gema,
Catatan: Ini diuji dalam Debian Wheezy
sumber
for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
Tidak yakin apa yang kamu maksud.
Akan membuat file perangkat yang disebut
foo
sebagai perangkat blok dengan mayor 8 dan minor 0. Jika Anda bermaksud menemukan satu atau salah satu file di/dev
yang memiliki tipe yang sama, mayor dan minor, Anda dapat melakukan (denganzsh
):Untuk perangkat blok
8:0
:untuk perangkat char
226:0
:Perhatikan bahwa apa pun dapat membuat file
/dev
. Di masa lalu, itu adalah skrip yang membuat file statis di sana. Pada titik tertentu, Anda bahkan memiliki sistem file khusus à la/proc
.Pada versi Linux modern, biasanya
udev
didasarkan pada input dari kernel.Nama yang dipilih untuk file perangkat dasar didasarkan pada yang
DEVNAME
disediakan oleh kernel.udev
aturan dapat mengubah itu tetapi umumnya tidak, dan beberapaudev
aturan akan menambahkan lebih banyak symlink untuk kenyamanan (seperti yang/dev/disk/by...
ada).Anda dapat beralih dari mayor: minor ke kernel
DEVNAME
dengan melihat:Anda juga bisa mendapatkan informasi itu dari
udev
database seperti yang ditunjukkan mikeserv.sumber
Ternyata itu bisa dilakukan lebih sederhana dengan
udevadm
, dan saya baru tahu caranya.Untuk mendapatkan
DEVNAME
dari yangudevadm
Anda butuhkan hanya lakukan:Misalnya, jika Anda ingin tahu
/dev
nama/sys/dev/char/5:1
yang akan Anda lakukan:KELUARAN
The
-r
pilihan adalah untuk menentukan--root
jalur ed - tanpa itu hasilnya di atas akan hanya membacaconsole
. The-q
pilihan menentukan database--query
dan dibutuhkan operanname
di sini - karena kami inginDEVNAME
.Cara yang sangat sederhana untuk menemukan jalur ke perangkat arang dan / atau blok yang hanya diberi nilai mayor: minor mungkin terlihat seperti:
Jadi berlari:
cetakan ...
Ini yang pertama saya tulis.
Ini hanya memindai
udevadm info --export-db
output untuk nomor yang cocok. Outputnya terlihat seperti:Alur kerjanya seperti:
mencoba untuk mengupas
[^=]*DEVNAME=
string dari kepala setiap barisjika suatu garis tidak memiliki karakter pertama atau karakter pertamanya adalah
/
salin garis itu di atash
ruang lamajika suatu baris cocok
MAJOR=
tambahkanN
baris input ekst ke ruang polajika ada 2 garis dalam ruang pola yang cocok
=$1\n.*=$2$
maka salinh
ruang lama di atas ruang pola dan cetak-otomatis; lain menghapus ruang polaJadi jika saya lakukan:
KELUARAN
Tetapi, seperti yang ditunjukkan oleh @xae, perangkat tipe blok / char dapat berbagi kombinasi maj: min, dan karenanya ini mungkin mencetak lebih dari satu jalur per panggilan.
sumber
Sayangnya ,
/sys/dev
hierachy hanya ditambahkan ke kernel selambat-lambatnya 2.6.27 ( lih. Komit terkait terhadap basis kode kernel), jadi kita membutuhkan pendekatan "bifurcated".Biarkan
$M
dan$m
, masing-masing, menjadi nomor utama dan kecil dari file perangkat kami.Posting 2.6.27 kernel
Seperti yang disarankan oleh orang lain, pendekatan paling sederhana melepaskan kekuatan dari
sysfs
sistem file "virtual", dengan mengejar langsung untuk file yang dinamai di$M:$m
bawah folder/sys/dev
(lebih dari satu file diharapkan jika kita tidak tahu apakah perangkat kita adalah karakter- atau yang berbasis blok), dan kemudian sumberuevent
file (dalam subkulit untuk mencegah polusi namespace):Pra 2.6.27 kernel
Mari kita asumsikan, demi kesederhanaan, bahwa file kita adalah perangkat blok (pendekatan serupa berlaku untuk perangkat karakter). Kami akan mencari string di
$M:$m
seluruh/sys/block
hierarki, dengan memeriksa (di bawah folder itu) konten dari setiap file yang namanya kebetulandev
. Jika/sys/block/<...>/<DEV>/dev
salah satu file tersebut, makaDEV
itu pasti nama perangkat kami:sumber
Di Linux dimungkinkan untuk mengambil keuntungan dari file-file tertentu dalam
/proc
sistem file virtual.Bentuk sederhana dari pola sudah memberikan informasi tentang perangkat yang diinginkan dalam output, namun pemfilteran tambahan untuk mengekstrak hanya satu string tertentu juga dimungkinkan.
sumber
Ada fungsi perpustakaan:
makedev()
Diberikan ID perangkat utama dan kecil, makedev () menggabungkan ini untuk menghasilkan ID perangkat, dikembalikan sebagai hasil fungsi.
Untuk detail lebih lanjut kunjungi: http://man7.org/linux/man-pages/man3/major.3.html
sumber