Cari tahu apa yang mewakili perangkat / dev / root di Linux?

17

Di linux, ada /dev/rootsimpul perangkat. Ini akan menjadi perangkat blok yang sama dengan simpul perangkat lain, seperti /dev/sdaX. Bagaimana saya bisa menyelesaikan /dev/rootke 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.

kdt
sumber
sudahkah kamu memeriksanya di sini? linux-diag.sourceforge.net/Sysfsutils.html Ini merekomendasikan cara untuk menanyakan kernel tentang perangkat yang dilampirkan dari semua jenis, tidak yakin, jika itu yang Anda cari!

Jawaban:

14

Pisahkan root=parameter dari /proc/cmdline.

Ignacio Vazquez-Abrams
sumber
Wow, reaksi kilat :-)
1
Jauh lebih aman daripada melakukan dereferencing pada tautan simbolik. +1 :)
Pos Tim
1
Ini berfungsi pada tiga distro (fc14, rhel5, ubuntu 11.04) yang telah saya lihat, dengan sedikit peringatan bahwa ada langkah ekstra yang diperlukan untuk berurusan dengan argumen root = UUID = type.
kdt
Saya tertarik mengapa ini lebih aman daripada solusi readlink, bisakah seseorang menguraikan?
opello
readlink tidak selalu berfungsi, saya sedang mengerjakan masalah ini sekarang dan menemukan pengguna yang sistemnya tidak menunjukkan hasil dari: readlink / dev / root - yang membuat kesalahan dalam program yang sedang saya kerjakan, itulah sebabnya saya datang ke utas ini. Tes yang benar adalah pertama lakukan: readlink / dev / root, kemudian jika null, temukan di / proc / cmdline, tetapi parsing / proc / cmdline tidak semudah solusi yang lebih baik, jadi saya akan terus mencari.
Lizardx
12

Pada sistem yang saya lihat, /dev/rootadalah symlink ke perangkat nyata, jadi readlink /dev/root(atau readlink -f /dev/rootjika Anda ingin path lengkap), akan melakukannya.

cjm
sumber
Atau hanya ls -l /dev/root- lebih pendek untuk mengetik :)
rozcietrzewiacz
@ jankes, tetapi kemudian Anda harus mengurai output ls(dia meminta sesuatu untuk digunakan dalam skrip).
cjm
Ah, maaf - mengabaikannya.
rozcietrzewiacz
Tidak - pada mesin RHEL5 saya itu jelas bukan symlink, meskipun pada mesin FC14 atau ubuntu 11.04 itu.
kdt
1
Tidak berfungsi di archlinux.
g33kz0r
7

Yah /dev/roothanyalah tautan simbolis ke perangkat nyata, sehingga Anda dapat menggunakannya readlink(2)untuk mencari tahu di mana itu menunjuk dari suatu program, atau readlink(1)untuk melakukan hal yang sama dari skrip shell.

TomH
sumber
Tidak. Tidak berfungsi di archlinux
g33kz0r
Juga tidak pada Debian, openSUSE, CentOS (daftar tidak lengkap) :(
pevik
Tambahkan ubuntu ke daftar.
Lizardx
2

Mungkin saya kehilangan sesuatu, tetapi bagaimana dengan:

mount|grep ' / '|cut -d' ' -f 1
g33kz0r
sumber
2

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/

Untuk titik / mount, Anda baru saja diberitahu bahwa itu berhubungan dengan / dev / root, yang bukan perangkat nyata yang Anda cari.

Tentu saja, Anda dapat melihat baris perintah kernel dan melihat sistem file root awal mana yang diinstruksikan untuk di-boot (parameter root):

$ cat / proc / cmdline mem = 512M konsol = ttyS2,115200n8 root = / dev / mmcblk0p2 rw rootwait

Namun, ini tidak berarti bahwa apa yang Anda lihat adalah perangkat root saat ini. Banyak sistem Linux mem-boot pada sistem file root menengah (seperti initramdisks dan initramfs), yang hanya digunakan untuk mengakses yang terakhir.

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:

/ dev / root adalah perangkat generik yang dapat digunakan di fstab. Anda juga dapat menggunakan 'rootfs'. Melakukan hal ini menawarkan beberapa keuntungan karena memungkinkan Anda untuk kurang spesifik. Yang saya maksud adalah, jika partisi root berada di drive eksternal, mungkin tidak selalu muncul sebagai perangkat yang sama dan berhasil memasangnya sebagai / akan membutuhkan mengubah fstab agar sesuai dengan perangkat yang benar. Dengan menggunakan / dev / root akan selalu cocok dengan perangkat apa pun yang ditentukan dalam parameter boot kernel dari lilo atau grub.

/ dev / root selalu hadir sebagai titik mount virtual, bahkan jika Anda tidak pernah melihatnya. Begitu juga dengan rootfs (bandingkan dengan perangkat virtual khusus seperti proc dan tmpfs yang tidak memiliki pendahuluan / dev)

/ dev / root adalah perangkat virtual seperti 'proc' atau / dev / tcp '. Tidak ada simpul perangkat di / dev untuk hal-hal ini - sudah ada di kernel sebagai perangkat virtual.

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).

root=/dev/sda1
root=UUID=5a25cf4a-9772-40cd-b527-62848d4bdfda
root=LABEL=random string
root=PARTUUID=a2079bfb-02

VS sangat bersih dan mudah diurai:

mount
/dev/sda1 on / type ext4 (rw,noatime,data=ordered)

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.

Lizardx
sumber