Tìm hiểu thiết bị / dev / root đại diện cho Linux là gì?


17

Trên linux, có một /dev/rootnút thiết bị. Đây sẽ là thiết bị khối giống như một nút thiết bị khác, như thế /dev/sdaX. Làm cách nào tôi có thể giải quyết /dev/rootnút thiết bị 'thực' trong tình huống này để tôi có thể hiển thị cho người dùng một tên thiết bị hợp lý?

Ví dụ, tôi có thể gặp tình huống này khi phân tích cú pháp /proc/mounts.

Tôi đang tìm giải pháp hoạt động từ tập lệnh shell / python nhưng không phải C.


bạn đã kiểm tra ở đây chưa? linux-diag.sourceforge.net/Sysfsutils.html Khuyến nghị cách truy vấn kernel về các thiết bị đính kèm các loại, không chắc chắn, nếu đó là những gì bạn đang tìm kiếm!

Câu trả lời:


14

Phân tích root=tham số từ /proc/cmdline.


Wow, phản ứng chớp nhoáng :-)

1
Vì vậy, an toàn hơn nhiều so với hội thảo một liên kết tượng trưng. +1 :)
Tim Post

1
Điều này hoạt động trên ba distro (fc14, rhel5, ubfox 11.04) mà tôi đã xem xét, với một cảnh báo nhỏ rằng có thêm một bước cần thiết để xử lý các đối số root = UUID = type.
kdt

Tôi quan tâm đến việc tại sao điều này an toàn hơn giải pháp readlink, ai đó có thể giải thích không?
opello

readlink không phải lúc nào cũng hoạt động, tôi đang xử lý vấn đề này ngay bây giờ và tìm thấy một người dùng có hệ thống không hiển thị kết quả từ: readlink / dev / root - điều này đã gây ra một trục trặc trong chương trình tôi đang làm việc, đó là lý do tôi đến đến chủ đề này. Thử nghiệm chính xác là trước tiên hãy thực hiện: readlink / dev / root, sau đó nếu null, tìm nó trong / Proc / cmdline, nhưng phân tích cú pháp / Proc / cmdline không dễ dàng như một giải pháp tốt hơn, vì vậy tôi sẽ tiếp tục tìm kiếm.
Lizardx 18/03/18

12

Trên các hệ thống tôi đã xem, /dev/rootlà một liên kết tượng trưng đến thiết bị thực, vì vậy readlink /dev/root(hoặc readlink -f /dev/rootnếu bạn muốn đường dẫn đầy đủ), sẽ thực hiện.


Hoặc chỉ ls -l /dev/root- ngắn hơn để gõ :)
rozcietrzewiacz

@jankes, nhưng sau đó bạn phải phân tích đầu ra của ls(anh ấy đã yêu cầu một cái gì đó để sử dụng trong một kịch bản).
cjm

Ah, xin lỗi - bỏ qua điều đó.
rozcietrzewiacz

Không - trên máy RHEL5 của tôi, nó chắc chắn không phải là một liên kết tượng trưng, ​​mặc dù trên máy FC14 hoặc ub Ubuntu 11.04.
kdt

1
Không hoạt động trên archlinux.
g33kz0r

7

Vâng /dev/rootchỉ là một liên kết tượng trưng đến thiết bị thực, vì vậy bạn có thể sử dụng readlink(2)để tìm ra nơi nó trỏ đến từ một chương trình hoặc readlink(1)để làm điều tương tự từ một tập lệnh shell.


Không. Không hoạt động trên archlinux
g33kz0r

Cũng không có trên Debian, openSUSE, CentOS (danh sách không đầy đủ) :(
pevik

Thêm ubfox vào danh sách.
Lizardx 18/03/18

2

Có lẽ tôi đang thiếu một cái gì đó, nhưng những gì về:

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

2

Điều này có lẽ nên được cập nhật, bởi vì rất nhiều thông tin được cung cấp ở đây là sai lệch, và thực sự có thể chưa bao giờ được chính xác toàn diện.

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

Đối với điểm / mount, bạn được thông báo rằng nó tương ứng với / dev / root, đây không phải là thiết bị thực mà bạn đang tìm kiếm.

Tất nhiên, bạn có thể nhìn vào dòng lệnh kernel và xem hệ thống tập tin gốc ban đầu mà Linux được hướng dẫn để khởi động (tham số gốc):

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

Tuy nhiên, điều này không có nghĩa là những gì bạn thấy là thiết bị gốc hiện tại. Nhiều hệ thống Linux khởi động trên các hệ thống tập tin gốc trung gian (như initramdisks và initramfs), vốn chỉ được sử dụng để truy cập vào hệ thống cuối cùng.

Một điều mà điều này chỉ ra là thứ trong / Proc / cmdline không nhất thiết phải là gốc thiết bị cuối cùng thực sự tồn tại.

Đó là từ những người bận rộn, những người mà tôi cho là biết họ đang nói gì khi nói đến tình huống khởi động.

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

Tài nguyên hữu ích thứ hai tôi tìm thấy là một chủ đề Slackware rất cũ về câu hỏi / dev / root, từ thời đại của chủ đề này, chúng ta có thể thấy rằng tất cả các biến thể luôn có mặt, nhưng tôi tin rằng 'hầu hết' đều sử dụng biểu tượng Phương thức liên kết, nhưng đó là một công cụ biên dịch kernel đơn giản, nó có thể tạo một hoặc không tạo một nếu tôi hiểu đúng về áp phích, nghĩa là chuyển đổi một chiều và readlink / dev / root báo cáo tên thiết bị thực, chuyển đổi nó khác, và nó không.

Vì chủ đề chính của chủ đề đó là làm thế nào để thoát khỏi / dev / root, nên họ phải tìm hiểu xem nó thực sự là gì, điều gì tạo ra nó, v.v., có nghĩa là, họ phải hiểu nó để thoát khỏi nó.

gnashly giải thích nó tốt:

/ dev / root là một thiết bị chung có thể được sử dụng trong fstab. Người ta cũng có thể sử dụng 'rootfs'. Làm điều này cung cấp một số lợi thế ở chỗ nó cho phép bạn ít cụ thể hơn. Ý tôi là, nếu phân vùng gốc nằm trên một ổ đĩa ngoài, nó không phải lúc nào cũng hiển thị như cùng một thiết bị và gắn thành công nó như / sẽ yêu cầu thay đổi fstab để khớp với thiết bị chính xác. Bằng cách sử dụng / dev / root, nó sẽ luôn khớp với bất kỳ thiết bị nào được chỉ định trong các tham số khởi động kernel từ lilo hoặc grub.

/ dev / root luôn có mặt như một điểm gắn kết ảo, ngay cả khi bạn chưa bao giờ nhìn thấy nó. Các rootfs cũng vậy (so sánh với các thiết bị ảo đặc biệt như Proc và tmpfs không có tiền đề / dev)

/ dev / root là một thiết bị ảo như 'Proc' hoặc / dev / tcp '. Không có nút thiết bị nào trong / dev cho những thứ này - nó đã có trong kernel dưới dạng thiết bị ảo.

Điều này giải thích tại sao một liên kết tượng trưng không nhất thiết tồn tại. Tôi ngạc nhiên tôi chưa bao giờ gặp phải vấn đề này trước đây, vì tôi duy trì một số chương trình cần biết thông tin này, nhưng muộn còn hơn không.

Tôi tin rằng một số giải pháp được cung cấp ở đây sẽ 'thường xuyên' hoạt động và có lẽ là những gì tôi sẽ làm, nhưng chúng không phải là giải pháp thực sự cho vấn đề, như tác giả của busybox lưu ý, rất phức tạp để thực hiện trong một cách mạnh mẽ.

[CẬP NHẬT:} Sau khi nhận được một số dữ liệu thử nghiệm của người dùng, tôi sẽ sử dụng phương thức gắn kết, có vẻ như sẽ ổn đối với một số trường hợp. / Proc / cmdline không hữu ích vì có quá nhiều biến thể. Trong ví dụ đầu tiên, bạn thấy phương thức cũ. Điều này ngày càng ít phổ biến hơn vì nó không khuyến khích sử dụng nó (cú pháp loại gốc / dev / sdx [0-9]) vì những đường dẫn đó có thể thay đổi linh hoạt (thứ tự trao đổi đĩa, chèn đĩa mới, v.v. sda1 trở thành / dev / sdb1).

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

VS rất sạch sẽ và dễ dàng phân tích cú pháp:

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

Trong trường hợp của cmdline, bạn sẽ thấy, biến thể duy nhất là 'câu trả lời' đúng trong lý thuyết là biến thể đầu tiên, không dùng nữa, vì bạn không nên chuyển root đến một mục tiêu di động như / dev / sdxy

Hai yêu cầu tiếp theo thực hiện hành động tiếp theo là lấy liên kết tượng trưng từ chuỗi đó trong / dev / đĩa / by-uuid hoặc / dev / đĩa / by-nhãn

Cái cuối cùng yêu cầu tôi tin rằng sử dụng parted -l để tìm id mà parted đang trỏ đến.

Đó chỉ là các biến thể mà tôi biết và đã thấy, cũng có thể có các biến thể khác, như GPTID, chẳng hạn.

Vì vậy, giải pháp tôi đang sử dụng là đây:

đầu tiên, xem nếu / dev / root là một liên kết tượng trưng. Nếu đúng, hãy xác minh nó không phải / dev / đĩa / by-uuid hoặc by-nhãn, nếu có, bạn phải thực hiện bước xử lý thứ hai để có được đường dẫn thực cuối cùng. Phụ thuộc vào công cụ bạn sử dụng.

Nếu bạn không có gì, sau đó đi đến gắn kết, và xem đó là như thế nào. Như một trường hợp dự phòng cuối cùng, một trường hợp tôi không sử dụng vì các đối số được đưa ra chống lại nó thậm chí không nhất thiết là phân vùng thực tế hoặc thiết bị được đề cập là đủ tốt để tôi từ chối giải pháp đó cho chương trình của mình. mount không phải là một giải pháp hoàn toàn mạnh mẽ và tôi chắc chắn đã cung cấp đủ các mẫu, có thể dễ dàng tìm thấy các trường hợp không đúng chút nào, nhưng tôi tin rằng hai trường hợp này bao gồm 'hầu hết' người dùng, đó là tất cả những gì tôi cần.

Giải pháp tốt nhất, sạch nhất và đáng tin cậy nhất là hạt nhân luôn luôn tạo liên kết tượng trưng, ​​không gây tổn hại gì cho bất cứ ai, và gọi nó là tốt, nhưng đó không phải là cách nó hoạt động trong thế giới thực. .

Tôi không coi bất kỳ giải pháp nào trong số này là giải pháp 'tốt hoặc mạnh mẽ', nhưng tùy chọn gắn kết dường như đáp ứng 'đủ tốt' và nếu cần giải pháp thực sự mạnh mẽ, hãy sử dụng công cụ mà busybox khuyến nghị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.