Linux'ta hangi cihazın / dev / root'u temsil ettiğini öğrenin?


17

Linux'ta bir /dev/rootcihaz düğümü vardır. Bu, başka bir cihaz düğümü ile aynı blok cihazı olacaktır /dev/sdaX. /dev/rootBir kullanıcıya mantıklı bir aygıt adı gösterebilmem için bu durumda 'gerçek' aygıt düğümüne nasıl çözüm bulabilirim ?

Örneğin, ayrıştırırken bu durumla karşılaşabilirim /proc/mounts.

Bir kabuk / python betiğinden çalışacak ancak C değil çözümler arıyorum.


buraya baktın mı linux-diag.sourceforge.net/Sysfsutils.html Bu, aradığınız her türlü bağlı aygıtlar hakkında çekirdeği sorgulamanın yolunu önerir, emin değilseniz, ne aradığınızı!

Yanıtlar:


14

Ayrıştırma root=parametresini /proc/cmdline.


Vay canına, yıldırım reaksiyonları :-)

1
Sembolik bir bağın kaydının kaldırılmasından çok daha güvenli. +1 :)
Tim Post

1
Bu, baktığım üç dağıtımda (fc14, rhel5, ubuntu 11.04), root = UUID = type argümanlarıyla başa çıkmak için ekstra bir adım olduğu konusunda hafif bir uyarıyla çalışıyor.
kdt

Bunun neden readlink çözümünden daha güvenli olduğu ile ilgileniyorum, biri ayrıntılandırabilir mi?
opello

readlink her zaman işe yaramaz, şu anda bu sorun üzerinde çalışıyorum ve sistemi hiçbir sonuç göstermeyen bir kullanıcı buldum: readlink / dev / root - çalıştığım programda bir aksaklık attı, bu yüzden geldim bu konuya. Doğru test ilk olarak yapılacaktır: readlink / dev / root, sonra boşsa / proc / cmdline içinde bulun, ancak ayrıştırma / proc / cmdline daha iyi bir çözüm kadar kolay değildir, bu yüzden aramaya devam edeceğim.
Lizardx

12

Baktığım sistemlerde /dev/root, gerçek cihaza bir sembolik bağlantı, yani readlink /dev/root(veya readlink -f /dev/roottam yolu istiyorsanız) bunu yapacak.


Veya sadece ls -l /dev/root- yazmak için daha kısa :)
rozcietrzewiacz

@jankes, ama sonra çıktısını ayrıştırmak zorunda ls(bir senaryoda kullanmak için bir şey istedi).
cjm

Ah, üzgünüm - bunu gözardı ettim.
rozcietrzewiacz

Hayır - RHEL5 makinemde kesinlikle bir symlink değil, FC14 veya ubuntu 11.04 makinesinde olmasına rağmen.
kdt

1
Archlinux üzerinde çalışmaz.
g33kz0r

7

Peki /dev/root, gerçek cihaza sembolik bir bağlantıdır, bu yüzden readlink(2)bir programdan nereye işaret ettiğini bulmak veya readlink(1)aynı şeyi bir kabuk komut dosyasından yapmak için kullanabilirsiniz.


Hayır.
Archlinux

Ayrıca Debian, openSUSE, CentOS (eksik liste) :(
pevik

Listeye ubuntu ekleyin.
Lizardx

3

Belki bir şey eksik, ama ne olacak:

mount|grep ' / '|cut -d' ' -f 1

3

Bu muhtemelen güncellenmelidir, çünkü burada verilen bilgilerin çoğu yanıltıcıdır ve aslında hiçbir zaman kapsamlı bir şekilde doğru olmayabilir.

https://bootlin.com/blog/find-root-device/

/ Mount noktası için, aradığınız gerçek aygıt olmayan / dev / root'a karşılık geldiği söylenir.

Tabii ki, çekirdek komut satırına bakabilir ve hangi başlangıç ​​kök dosya sistemi Linux'a önyükleme yapıldığını (root parametresi) görebilirsiniz:

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

Ancak bu, gördüğünüz şeyin mevcut kök cihaz olduğu anlamına gelmez. Birçok Linux sistemi, sonuncusuna erişmek için kullanılan ara kök dosya sistemlerinde (initramdisks ve initramfs gibi) önyükleme yapar.

Bu noktaya dikkat çeken şeylerden biri, / proc / cmdline'daki şeyin, gerçekte canlı gerçek nihai aygıt kökü olmamasıdır.

Bu, önyükleme durumları söz konusu olduğunda nelerden bahsettiklerini bildiğim meşgul kutusu insanlarından.

https://www.linuxquestions.org/questions/slackware-14/slackware-current-dev-root-688189/page2.html

Bulduğum ikinci yararlı kaynak, / dev / root sorusu hakkında çok eski bir Slackware iş parçacığı, bu iş parçacığının yaşından itibaren, tüm varyantların her zaman mevcut olduğunu görebiliriz, ancak 'en' dağıtımların sembolik kullandığına inanıyorum bağlantı yöntemi, ancak bu basit bir çekirdek derleme anahtarıydı, posterleri doğru anladıysam, bir tane yapabilir ya da yapamazdım, yani, bir yöne geçin ve readlink / dev / root gerçek cihaz adını bildirir, değiştirir diğeri ve öyle değil.

Bu iş parçacığının ana konusu / dev / root'tan nasıl kurtulacağı olduğundan, aslında ne olduğuna, onu yapanlara vb. Girmek zorundaydılar, yani ondan kurtulmak için onu anlamak zorundaydılar.

gnashly iyi açıkladı:

/ dev / root, fstab içinde kullanılabilen genel bir aygıttır. Bir de 'rootfs' kullanılabilir. Bunu yapmak, daha az spesifik olmanıza izin vermesi açısından bazı avantajlar sunar. Demek istediğim, kök bölüm harici bir sürücüde ise, her zaman aynı cihaz olarak görünmeyebilir ve / veya başarılı bir şekilde monte edilebileceği için fstab'ın doğru cihaza uyacak şekilde değiştirilmesi gerekebilir. / Dev / root kullanıldığında, lilo veya grub'un çekirdek önyükleme parametrelerinde belirtilen aygıtla her zaman eşleşir.

/ dev / root, daha önce hiç görmeseniz bile, sanal bir bağlama noktası olarak her zaman mevcuttur. Yani rootfs var (bunu proc ve tmpfs gibi özel sanal cihazlarla karşılaştırın.

/ dev / root, 'proc' veya / dev / tcp 'gibi sanal bir cihazdır. Bu şeyler için / dev'de cihaz düğümü yok - zaten sanal bir cihaz olarak çekirdekte.

Bu, sembolik bir bağlantının neden gerekli olmadığını açıklar. Bu bilgiyi bilmem gereken bazı programları sürdürdüğüm için, ancak bu konuyu daha önce hiç vurmadığım için şaşırdım, ama hiç olmadığı kadar geç.

Burada sunulan çözümlerin bazılarının 'sık sık' işe yarayacağına ve muhtemelen yapacağım olduğuna inanıyorum, ancak meşgul kutusu yazarının belirttiği gibi, çok pratik bir şekilde uygulanması daha karmaşık olan soruna gerçek bir çözüm değiller. sağlam bir şekilde.

[UPDATE:} Bazı kullanıcı test verileri aldıktan sonra, en azından bazı durumlarda iyi görünen mount yöntemiyle gidiyorum. / Proc / cmdline çok fazla değişken olduğu için kullanışlı değildi. İlk örnekte eski yöntemi görüyorsunuz. Bu daha az yaygındır, çünkü kullanımı kesinlikle önerilmez (orijinal / dev / sdx [0-9] türü sözdizimi), çünkü bu yollar dinamik olarak değişebilir (disk sırasını değiştirin, yeni disk takın, vb. Ve aniden / dev / sda1, / dev / sdb1 olur).

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

VS çok temiz ve ayrıştırılması kolay:

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

Cmdline durumunda, teoride doğru 'cevap' olan tek varyant ilk, kullanımdan kaldırılmış olanıdır, çünkü / dev / sdxy gibi hareketli bir hedefe kök göndermemelisiniz.

Sonraki ikisi, / dev / disk / by-uuid veya / dev / disk / by-label içindeki o dizeden sembolik bağlantı almak için daha fazla işlem yapılmasını gerektirir.

Sonuncusu ben ayrıştırılmış kimliğin ne işaret ettiğini bulmak için parted -l kullanarak inanıyorum gerektirir.

Bu sadece bildiğim ve gördüğüm varyantlar, örneğin GPTID gibi başkaları da olabilir.

Yani kullandığım çözüm şudur:

önce / dev / root'un sembolik bir bağlantı olup olmadığına bakın. Öyleyse, / dev / disk / by-uuid veya by-label için olmadığını doğrulayın, eğer öyleyse, son gerçek yolu elde etmek için ikinci bir işlem adımı yapmanız gerekir. Kullandığınız araca bağlıdır.

Eğer bir şeyiniz yoksa, o zaman montaja gidin ve bunun nasıl olduğunu görün. Son bir geri dönüş vakası olarak kullanmıyorum, çünkü buna karşı verilen argümanlar söz konusu bölüm veya cihaz olması gerekmiyor bile, bu çözümü programım için reddetmem için yeterince iyi. mount tam olarak sağlam bir çözüm değil ve yeterince örnek verildiğinden eminim, hiç de doğru olmadığı durumlar bulmak kolay olurdu, ancak bu iki vakanın 'en' kullanıcıları kapsadığına inanıyorum, tüm ihtiyacım olan bu.

En güzel, en temiz ve en güvenilir çözüm, çekirdeğin her zaman, hiçbir şeye veya kimseye zarar vermeyecek ve iyi olarak adlandırmayacak olan sembolik bağlantıyı yapması olurdu, ancak gerçek dünyada böyle çalışmadı. .

Bunlardan hiçbirini 'iyi veya sağlam' çözümler olarak görmüyorum, ancak montaj seçeneği 'yeterince iyi' tatmin edici görünüyor ve gerçekten sağlam bir çözüm gerekiyorsa, meşgul kutusunun önerdiği şeyleri kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.