Linux에서 / dev / root가 나타내는 장치는 무엇입니까?


17

리눅스에는 /dev/root장치 노드가 있습니다. 이것은 같은 다른 장치 노드와 동일한 블록 장치 /dev/sdaX입니다. /dev/root이 상황에서 사용자에게 합리적인 장치 이름을 표시 할 수 있도록 '실제'장치 노드로 어떻게 해결할 수 있습니까?

예를 들어 구문 분석 할 때이 상황이 발생할 수 있습니다 /proc/mounts.

쉘 / 파이썬 스크립트에서 작동하지만 C에서는 작동하지 않는 솔루션을 찾고 있습니다.


여기서 확인 했습니까? linux-diag.sourceforge.net/Sysfsutils.html 커널이 원하는 장치인지 확실하지 않은 모든 종류의 연결된 장치에 대해 커널에 쿼리하는 방법을 권장합니다!

답변:


14

에서 root=매개 변수를 구문 분석하십시오 /proc/cmdline.


와우, 번개 반응 :-)

1
심볼릭 링크를 역 참조하는 것보다 훨씬 안전합니다. +1 :)
Tim Post

1
이것은 내가 본 세 가지 배포판 (fc14, rhel5, ubuntu 11.04)에서 작동하며 root = UUID = 유형 인수를 처리하는 데 필요한 추가 단계가 있다는 약간의 경고가 있습니다.
kdt

이것이 왜 readlink 솔루션보다 안전한지에 관심이 있습니다.
opello

readlink가 항상 작동하지는 않지만 지금이 문제에 대해 작업하고 있으며 시스템에서 결과가 표시되지 않는 사용자를 발견했습니다. readlink / dev / root-작업중 인 프로그램에서 결함이 발생하여 내가 온 이유 이 스레드에. 올바른 테스트는 먼저 수행하는 것입니다 : readlink / dev / root, null 인 경우 / proc / cmdline에서 찾으십시오. 그러나 / proc / cmdline을 파싱하는 것이 더 나은 솔루션만큼 쉽지는 않으므로 계속 살펴 보겠습니다.
Lizardx

12

내가 본 시스템 /dev/root에서 실제 장치에 대한 심볼릭 링크이므로 readlink /dev/root(또는 readlink -f /dev/root전체 경로를 원한다면) 그렇게 할 것입니다.


또는 ls -l /dev/root:-짧게 입력 :)
rozcietrzewiacz

@jankes,하지만 출력을 구문 분석해야합니다 ls(스크립트에서 사용할 것을 요청했습니다).
CJM

아 죄송합니다. 간과했습니다.
rozcietrzewiacz

아니, 내 RHEL5 컴퓨터에서는 FC14 또는 우분투 11.04 컴퓨터이지만 확실히 심볼릭 링크가 아닙니다.
kdt

1
archlinux에서는 작동하지 않습니다.
g33kz0r

7

그럼 /dev/root당신이 사용할 수 있도록, 실제 장치에 불과 심볼릭 링크 readlink(2)가 프로그램에서 가리키는 곳을 찾기 위해, 또는 readlink(1)쉘 스크립트에서 같은 일을 할 수 있습니다.


아니오. archlinux에서 작동하지 않습니다
g33kz0r

또한 데비안, openSUSE, CentOS (불완전한 목록)에는 없습니다 :(
pevik

목록에 우분투를 추가하십시오.
Lizardx

3

여기에 제공된 많은 정보가 오해의 소지가 있으며 실제로 전체적으로 정확한 정보는 없었기 때문에 이것은 아마도 업데이트되어야합니다.

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

/ 마운트 지점의 경우, 이것이 실제 장치가 아닌 / dev / root에 해당한다고 알려줍니다.

물론, 커널 명령 행을보고 어떤 초기 루트 파일 시스템 리눅스에서 부팅을 지시했는지 확인할 수 있습니다 (루트 파라미터) :

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

그러나 이것이 현재 루트 장치라는 것을 의미하지는 않습니다. 많은 Linux 시스템은 최종 루트에 액세스하는 데 사용되는 중간 루트 파일 시스템 (initramdisk 및 initramfs 등)으로 부팅합니다.

이것이 지적한 것 중 하나는 / proc / cmdline에있는 것이 반드시 실제 최종 장치 루트 일 필요는 없다는 것입니다.

그것은 부트 박스 사람들에 관한 것입니다. 부팅 상황에 관해서는 그들이 말하는 것에 대해 알고 있다고 가정합니다.

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

내가 찾은 두 번째 유용한 리소스는이 스레드의 나이부터 / dev / root 문제에 관한 매우 오래된 슬랙웨어 스레드입니다. 모든 변형이 항상 존재한다는 것을 알 수 있지만 '가장 많이'인 배포판이 기호를 사용하고 있다고 생각합니다 링크 방법이지만 간단한 커널 컴파일 스위치였습니다. 포스터를 올바르게 이해했다면 즉, 한 가지 방법으로 전환하면 readlink / dev / root가 실제 장치 이름을보고 스위치를 만들 수 있습니다. 다른, 그렇지 않습니다.

이 스레드의 주요 주제는 / dev / root를 제거하는 방법 이었으므로 실제로 무엇인지, 무엇을 만드는지 등을 알아 내야했습니다. 즉,이를 제거하기 위해 이해해야했습니다.

gnashly 잘 설명했다.

/ dev / root는 fstab에서 사용할 수있는 일반 장치입니다. 'rootfs'를 사용할 수도 있습니다. 이렇게하면 덜 구체적 일 수 있다는 장점이 있습니다. 루트 파티션이 외장 드라이브에있는 경우 항상 동일한 장치로 표시되지 않고 올바른 장치와 일치하도록 fstab을 변경해야하는 것처럼 성공적으로 마운트 할 수 있습니다. / dev / root를 사용하면 lilo 또는 grub의 커널 부트 매개 변수에 지정된 장치와 항상 일치합니다.

/ dev / root는 본 적이없는 경우에도 항상 가상 마운트 지점으로 존재했습니다. rootfs도 있습니다 (/ dev가없는 proc 및 tmpfs와 같은 특수 가상 장치와 비교)

/ dev / root는 'proc'또는 / dev / tcp '와 같은 가상 장치입니다. / dev에는 장치 노드가 없습니다. 이미 커널에 가상 장치로 존재합니다.

이것은 심볼릭 링크가 반드시 존재하지 않는 이유를 설명합니다. 이 정보를 알아야하는 프로그램은 유지하지만 결코 늦지 않는 것이 더 좋다는 점을 감안하면 지금까지이 문제를 겪지 않은 것에 놀랐습니다.

여기에 제공된 솔루션 중 일부는 '종종'작동하고 아마도 내가 할 일이라고 생각하지만 busybox 저자가 지적한 것처럼 문제에 대한 실제 솔루션은 아닙니다. 견고한 방식.

[UPDATE :} 사용자 테스트 데이터를 얻은 후 mount 메소드를 사용하고 있는데, 적어도 일부 경우에는 괜찮은 것 같습니다. 변형이 너무 많아서 / proc / cmdline은 유용하지 않았습니다. 첫 번째 예에서는 이전 방법을 볼 수 있습니다. 경로가 동적으로 변경 (디스크 순서 교체, 새 디스크 삽입 등)하고 갑자기 / dev /를 사용할 수 있기 때문에 사용하지 않는 것이 좋습니다 (원래 / dev / sdx [0-9] 형식 구문). sda1은 / dev / sdb1이됩니다).

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

매우 깨끗하고 파싱하기 쉬운 VS :

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

cmdline의 경우 이론상 올바른 '답변'인 유일한 변형은 사용되지 않는 첫 번째 변형입니다. 루트는 / dev / sdxy와 같은 이동 대상을 참조해서는 안되기 때문에

다음 두 개는 / dev / disk / by-uuid 또는 / dev / disk / by-label의 해당 문자열에서 기호 링크를 가져 오는 추가 조치를 수행해야합니다.

마지막으로 parted -l을 사용하여 parted ID가 가리키는 것을 찾으십시오.

그것은 내가 알고 알고 보았던 변형 일뿐입니다. 예를 들어 GPTID와 같은 다른 것들도있을 수 있습니다.

그래서 내가 사용하는 솔루션은 다음과 같습니다.

먼저 / dev / root가 기호 링크인지 확인하십시오. 그렇다면 / dev / disk / by-uuid 또는 by-label이 아닌지 확인하십시오. 그렇다면 실제 실제 경로를 얻기 위해 두 번째 처리 단계를 수행해야합니다. 사용하는 도구에 따라 다릅니다.

아무것도 얻지 못했다면 마운트로 가서 그 상태를 확인하십시오. 마지막 대체 사례로, 실제로 사용중인 파티션이나 장치가 아니라도 반대 주장이 내 프로그램에 대한 솔루션을 거부하기에 충분하기 때문에 사용하지 않는 것입니다. mount는 완전히 강력한 솔루션이 아니며 충분한 샘플을 제공한다고 확신 할 수 있지만, 옳지 않은 경우를 쉽게 찾을 수 있지만이 두 경우는 '가장 많은'사용자를 포함한다고 생각합니다.

가장 좋고, 깨끗하고, 가장 신뢰할 수있는 솔루션은 커널이 항상 심볼릭 링크를 만들어서 아무거나 다른 사람에게 해를 끼치 지 않고 좋게 부르는 것이었을 것입니다. .

나는 이들 중 어느 것도 '좋은 또는 강력한'솔루션으로 생각하지 않지만 마운트 옵션은 '충분한'좋은 것을 만족시키는 것처럼 보이며 진정으로 강력한 솔루션이 필요한 경우 busybox가 권장하는 것을 사용하십시오.


2

어쩌면 나는 뭔가를 놓치고 있지만 어떨까요?

mount|grep ' / '|cut -d' ' -f 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.