Làm thế nào để có được tên thiết bị khối từ tên thiết bị phân vùng?


12

Tôi đang tìm kiếm một cách di động để có được tên thiết bị khối cha mẹ (ví dụ /dev/sda) được đặt tên thiết bị phân vùng (ví dụ /dev/sda1). Tôi biết tôi chỉ có thể bỏ nhân vật cuối cùng, nhưng điều đó sẽ không hoạt động trong một số trường hợp:

  • Đầu đọc thẻ MMC thường có tên như thế /dev/mmcblk0, trong khi phân vùng của chúng có tên như /dev/mmcblk0p1(chú ý thêm p).
  • tùy chọn: một số thiết bị khối không có bảng phân vùng nào cả và được định dạng dưới dạng một phân vùng. Trong trường hợp này, thiết bị phân vùng và thiết bị khối cha là như nhau.

Khối lượng LVM là một ấm cá hoàn toàn khác nhau. Tôi không cần phải hỗ trợ họ ngay bây giờ, nhưng nếu tính đến họ cần ít nỗ lực hơn, tôi sẽ không phiền.


Làm thế nào di động? Máy tính xách tay của tôi có phân vùng gốc của nó vào /dev/sd0anhưng không có /dev/sd0thiết bị (có một /dev/sd0c...)
thrig

@don_crissti /dev/sda1/dev/mmcblk0p1dù sao cũng là dành riêng cho Linux. lsblklà tương đối gần đây mặc dù.
Stéphane Chazelas

lsblkcũng sử dụng số nút thiết bị để tìm đúng số, thay vì chỉ sử dụng tên. Dường như giải pháp đơn giản nhất cho Linux và tiện ích linux có thể luôn luôn có sẵn.
ilkkachu

1
@don_crissti lsblk -dpno pkname $devnameđã vượt qua tất cả các bài kiểm tra của tôi! Có lẽ bạn nên thêm một câu trả lời.
Dmitry Grigoryev

@thrig Vâng vâng, tôi chắc chắn mong đợi kịch bản trở lại /dev/sd0ctrong trường hợp đó. Làm các câu trả lời dưới đây làm việc cho bạn?
Dmitry Grigoryev

Câu trả lời:


15

Nếu bạn đang dùng linux, bạn có thể sử dụng lsblk(là một phần của util-linux):

lsblk -no pkname /dev/sda1

2
Của tôi lsblk( util-linux: 2.20.1, Ubuntu 14.04) không có pknamecột, chỉ kname.
heemayl

3
@heemayl - nó đã được bổ sung chỉ bốn năm trước nên không có sẵn trên distro sử dụng phiên bản cũ hơn ...
don_crissti

$ lsblk -no pkname /dev/nvme0n1p3trả về 7 dòng trên hệ thống của tôi Đúng, phân vùng này được mã hóa và chứa LVM, đây không phải là một tình huống nhỏ. Tôi không biết làm thế nào bạn đáng tin cậy để chọn đúng dòng từ một kịch bản.
elboulangero

16

Nếu một thiết bị là phân vùng của một thiết bị khác thì /sys/class/block/$devsẽ chứa một tệp có tên partition(có nội dung là số phân vùng).

Nếu đó là trường hợp, bạn có thể nhận được tên của thiết bị mẹ với:

basename "$(readlink -f "/sys/class/block/$dev/..")"

Hoặc với zsh:

echo /sys/class/block/$dev(:A:h:t)

Thí dụ:

$ dev=sda1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
sda
$ dev=nbd0p1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
nbd0

Khối lượng LVM hoàn toàn khác nhau, chúng không phải là phân vùng ngoại trừ trong trường hợp đặc biệt khi chúng là một linearánh xạ liền kề của một PV vật lý.

Nếu bạn ở trong trường hợp như vậy, bạn có thể lấy tên của PV đó bằng:

ls "/sys/class/block/$dev/slaves"

Trường hợp $devgiống như dm-2(mà bạn có thể lấy từ đâu "$(basename "$(readlink -f /dev/VG/LV)")").


Tôi đã chấp nhận câu trả lời của don_crissti's vì tôi tình cờ có lsblk và cú pháp ngắn, nhưng tôi thừa nhận rằng câu trả lời của bạn chung chung và dễ mang theo hơn. Cảm ơn!
Dmitry Grigoryev
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.