Di linux, ada /dev/root
simpul perangkat. Ini akan menjadi perangkat blok yang sama dengan simpul perangkat lain, seperti /dev/sdaX
. Bagaimana saya bisa menyelesaikan /dev/root
ke node perangkat 'nyata' dalam situasi ini, sehingga saya bisa menunjukkan kepada pengguna nama perangkat yang masuk akal?
Sebagai contoh, saya mungkin menghadapi situasi ini ketika parsing /proc/mounts
.
Saya mencari solusi yang akan bekerja dari skrip shell / python tetapi tidak C.
Jawaban:
Pisahkan
root=
parameter dari/proc/cmdline
.sumber
Pada sistem yang saya lihat,
/dev/root
adalah symlink ke perangkat nyata, jadireadlink /dev/root
(ataureadlink -f /dev/root
jika Anda ingin path lengkap), akan melakukannya.sumber
ls -l /dev/root
- lebih pendek untuk mengetik :)ls
(dia meminta sesuatu untuk digunakan dalam skrip).Yah
/dev/root
hanyalah tautan simbolis ke perangkat nyata, sehingga Anda dapat menggunakannyareadlink(2)
untuk mencari tahu di mana itu menunjuk dari suatu program, ataureadlink(1)
untuk melakukan hal yang sama dari skrip shell.sumber
Mungkin saya kehilangan sesuatu, tetapi bagaimana dengan:
sumber
Ini mungkin harus diperbarui, karena banyak informasi yang diberikan di sini menyesatkan, dan mungkin sebenarnya tidak pernah benar secara komprehensif.
https://bootlin.com/blog/find-root-device/
Satu hal yang ditunjukkan adalah bahwa hal di / proc / cmdline belum tentu merupakan root perangkat akhir aktual.
Itu dari orang-orang kotak sibuk, yang saya asumsikan tahu apa yang mereka bicarakan ketika datang ke situasi boot.
https://www.linuxquestions.org/questions/slackware-14/slackware-current-dev-root-688189/page2.html
Sumber daya bermanfaat kedua yang saya temukan adalah utas Slackware yang sangat tua tentang pertanyaan / dev / root, sejak usia utas ini, kita dapat melihat bahwa semua varian selalu ada, tetapi saya percaya 'kebanyakan' distro menggunakan simbolik metode tautan, tapi itu adalah switch kompilasi kernel yang sederhana, bisa membuat satu, atau tidak membuat satu jika saya memahami poster dengan benar, yaitu, beralih satu arah, dan readlink / dev / root melaporkan nama perangkat yang sebenarnya, alihkan yang lain, dan itu tidak.
Karena topik utama utas itu adalah bagaimana menyingkirkan / dev / root, mereka harus masuk ke dalam apa itu sebenarnya, apa yang membuatnya, dll, yang berarti, mereka harus memahaminya untuk menyingkirkannya.
gnashly menjelaskannya dengan baik:
Ini menjelaskan mengapa tautan simbolik belum tentu ada. Saya terkejut saya tidak pernah mengalami masalah ini sebelumnya, mengingat bahwa saya memelihara beberapa program yang perlu mengetahui informasi ini, tetapi lebih baik terlambat daripada tidak sama sekali.
Saya percaya beberapa solusi yang ditawarkan di sini akan 'sering' bekerja, dan mungkin apa yang akan saya lakukan, tetapi mereka bukan solusi sebenarnya yang sebenarnya untuk masalah tersebut, yang seperti yang dicatat oleh penulis busybox, secara signifikan lebih rumit untuk diterapkan dalam cara yang kuat.
[UPDATE:} Setelah mendapatkan beberapa data uji pengguna, saya akan menggunakan metode mount, yang tampaknya ok untuk beberapa kasus setidaknya. The / proc / cmdline tidak berguna karena ada terlalu banyak varian. Pada contoh pertama, Anda melihat metode lama. Ini kurang dan kurang umum karena sangat tidak disarankan untuk menggunakannya (sintaks tipe asli / dev / sdx [0-9]) karena jalur tersebut dapat berubah secara dinamis (pertukaran disk, masukkan disk baru, dll, dan tiba-tiba / dev / sda1 menjadi / dev / sdb1).
VS sangat bersih dan mudah diurai:
Dalam kasus cmdline, Anda akan melihat, satu-satunya varian yang merupakan 'jawaban' yang benar dalam teori adalah yang pertama, yang sudah usang, karena Anda tidak boleh merujuk root ke target yang bergerak seperti / dev / sdxy
Dua berikutnya perlu melakukan tindakan lebih lanjut untuk mendapatkan tautan simbolik dari string itu di / dev / disk / by-uuid atau / dev / disk / oleh-label
Yang terakhir mengharuskan saya percaya menggunakan parted -l untuk menemukan apa yang menunjuk id berpisah.
Itu hanya varian yang saya tahu dan lihat, mungkin ada yang lain, seperti GPTID, misalnya.
Jadi solusi yang saya gunakan adalah ini:
pertama, lihat apakah / dev / root adalah tautan simbolik. Jika ya, verifikasi bukan ke / dev / disk / by-uuid atau by-label, jika ya, Anda harus melakukan langkah kedua pemrosesan untuk mendapatkan jalur nyata terakhir. Tergantung pada alat yang Anda gunakan.
Jika Anda tidak mendapat apa-apa, maka pergilah ke gunung, dan lihat bagaimana itu. Sebagai kasus fallback terakhir, yang saya tidak menggunakan karena argumen yang diberikan terhadapnya bahkan tidak perlu menjadi partisi atau perangkat yang sebenarnya cukup baik bagi saya untuk menolak solusi untuk program saya. mount bukanlah solusi yang sepenuhnya kuat, dan saya yakin diberikan cukup sampel, akan mudah untuk menemukan case yang tidak benar sama sekali, tapi saya percaya kedua case ini mencakup pengguna 'terbanyak', yang saya butuhkan.
Solusi terbaik, terbersih, dan paling dapat diandalkan adalah kernel akan selalu membuat tautan simbolik, yang tidak akan menyakiti apa pun atau siapa pun, dan menyebutnya baik, tetapi bukan itu yang berhasil di dunia nyata. .
Saya tidak menganggap semua ini sebagai solusi 'baik atau kuat', tetapi opsi mount tampaknya memuaskan 'cukup baik', dan jika solusi yang benar-benar kuat diperlukan, gunakan hal-hal yang direkomendasikan busybox.
sumber