리눅스에는 /dev/root
장치 노드가 있습니다. 이것은 같은 다른 장치 노드와 동일한 블록 장치 /dev/sdaX
입니다. /dev/root
이 상황에서 사용자에게 합리적인 장치 이름을 표시 할 수 있도록 '실제'장치 노드로 어떻게 해결할 수 있습니까?
예를 들어 구문 분석 할 때이 상황이 발생할 수 있습니다 /proc/mounts
.
쉘 / 파이썬 스크립트에서 작동하지만 C에서는 작동하지 않는 솔루션을 찾고 있습니다.
리눅스에는 /dev/root
장치 노드가 있습니다. 이것은 같은 다른 장치 노드와 동일한 블록 장치 /dev/sdaX
입니다. /dev/root
이 상황에서 사용자에게 합리적인 장치 이름을 표시 할 수 있도록 '실제'장치 노드로 어떻게 해결할 수 있습니까?
예를 들어 구문 분석 할 때이 상황이 발생할 수 있습니다 /proc/mounts
.
쉘 / 파이썬 스크립트에서 작동하지만 C에서는 작동하지 않는 솔루션을 찾고 있습니다.
답변:
에서 root=
매개 변수를 구문 분석하십시오 /proc/cmdline
.
내가 본 시스템 /dev/root
에서 실제 장치에 대한 심볼릭 링크이므로 readlink /dev/root
(또는 readlink -f /dev/root
전체 경로를 원한다면) 그렇게 할 것입니다.
ls -l /dev/root
:-짧게 입력 :)
ls
(스크립트에서 사용할 것을 요청했습니다).
여기에 제공된 많은 정보가 오해의 소지가 있으며 실제로 전체적으로 정확한 정보는 없었기 때문에 이것은 아마도 업데이트되어야합니다.
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가 권장하는 것을 사용하십시오.