BASH: tìm phân vùng từ đầu ra của Diskutil


1

Tôi đang cố gắng tìm kiếm đầu ra của một lệnh liệt kê các ổ đĩa cục bộ để tìm phân vùng có tên EFI trên ổ cứng khởi động.

Tôi đã viết một oneliner thực sự bẩn vì dường như tôi không thể tìm ra cách tìm hiệu quả ổ cứng chính (có lẽ luôn luôn là Macintosh HD) và sau đó tìm hiểu phân vùng EFI trên cùng một ổ đĩa, rồi từ đó tìm ra đĩa # s # IDENTIFIER cho phân vùng EFI trên ổ đĩa Macintosh HD.

Đầu ra tiêu chuẩn từ diskutil listmột cái gì đó như thế này

$ diskutil list
/dev/disk0
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *500.1 GB   disk0
1:                        EFI EFI                     209.7 MB   disk0s1
2:                  Apple_HFS Macintosh HD            499.1 GB   disk0s2
3:                 Apple_Boot Recovery HD             784.2 MB   disk0s3

/dev/disk1
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *1.5 TB     disk1
1:                        EFI EFI                     209.7 MB   disk1s1
2:                  Apple_HFS Data                    1.5 TB     disk1s2

Vì vậy, đây là lớp lót bẩn tôi đã sử dụng. Có cách nào tốt hơn tôi có thể làm điều này? 

diskutil mount $(diskutil list | grep -i 'Macintosh\ HD' | awk '{print $6}' | grep -i 'disk0s')

Câu trả lời:


0

Tôi cho rằng / dev / đĩa0 luôn là ổ cứng "chính", phải không? Nếu không và bạn thực sự muốn tìm phân vùng EFI trên đĩa có tên "Macintosh HD" thì oneliner của bạn gần như chính xác.

Đối với tôi, 6 đô la trả về 'GB' và tôi cũng cho rằng phân vùng EFI luôn là đầu tiên của đĩa cụ thể đó, vì vậy hãy thử:

diskutil list | grep 'Macintosh HD' | awk '{print $(NF)}' | sed 's/s[0-9]/s1/'

hoặc một số mánh khóe awk nữa (cho biện pháp tốt):

diskutil list | awk '/Macintosh HD/ { sub(/s[0-9]/, "s1", $(NF)); print $(NF) }'

0

Bạn có thể thử và phát hiện thiết bị khối chính bằng cách sử dụng:

mount | awk '/on \/ / {print $1}'

Tôi dường như không thể tìm cách phát hiện âm lượng chính của mình vì đầu ra của tôi không liệt kê chúng, tôi chỉ có thể thấy thiết bị khối chính và một số mô tả nội dung:

/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 XXXXXXXX-XXXX-XXXX-XXXX-7C6C089FXXXX
                                 Unencrypted

Trong trường hợp của tôi, tôi có thể dễ dàng sử dụng awk '/Logical Volume/ {print $NF}'nhưng một tập lệnh mạnh mẽ hơn sẽ đưa phiên bản Mac vào tài khoản để kiểm tra tất cả các trường hợp có thể.

BTW, tôi đang sử dụng Yosemite 10.10.4 trên MBP 15 "giữa năm 2014.


0

Được rồi, điều này không hoàn thành, nhưng tôi đã hết thời gian.

Vì vậy, tôi sử dụng lệnh df, vì tôi biết rằng cái này sẽ có điểm gắn kết ở cuối. Sau đó, tôi grep nó với một mô hình mới gạch chéo. Và sau đó tôi muốn cắt mọi thứ sau khi đăng xuất không gian đầu tiên. Nhưng việc cắt bỏ không hoạt động ngay bây giờ. Không thực sự biết những gì tôi đang làm sai và tôi phải bắt đầu làm việc cho công việc của mình ngay bây giờ, nhưng có lẽ bạn có thể cải thiện việc cắt bỏ tính năng bash. Xin lỗi, không có thời gian để xem hướng dẫn sử dụng để tìm lỗi của tôi. Nhưng chúng ta gần như ở đó:

Đã sửa:

foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo

Bây giờ nó hoạt động. Thử nó :)

EDIT: Ồ, tôi mới nhận ra rằng tôi đang sử dụng lvg, do đó, đĩa0s [0-4] sẽ được dịch sang đĩa1. Vì vậy, hãy kiểm tra nó và cho tôi biết nếu điều này hiển thị chính xác cho bạn đúng đĩa bạn không sử dụng lvg.

EDIT 2: Vẫn không hoạt động cho nhóm âm lượng logic được mã hóa, nhưng nếu bạn có thể kiểm tra cái này mà không có FileVault, nó sẽ hoạt động

foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI)

Điều này sẽ tìm kiếm một EFI trên đĩa mà ist được gắn dưới dạng root, vì vậy thường là MacintoshHD

EDIT 3: Điều này thực sự tuyệt vời để giết thời gian tại nơi làm việc. Được rồi, tôi đoán điều này sẽ cung cấp cho bạn câu trả lời đúng. Nó có thể làm như vậy ngay cả khi nó được mã hóa FileVault.

#!/bin/bash

maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"}

if [ "$(diskutil list | grep Unlocked)" = "" ]
        then
                diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
                diskline_cut1=${diskline##*"B "}
                diskline_cut2=${diskline##*" "}
                echo "/dev/$diskline_cut2"

        else
                alldisk=$(diskutil list)
                alldisk_cut1=${alldisk##*${maindrive_reduced}}
                alldisk_cut2=${alldisk_cut1#*"Logical Volume on "}
                alldisk_cut3=${alldisk_cut2%%" "*}
                echo /dev/$alldisk_cut3
fi

Vì vậy, điều này sẽ cung cấp cho bạn phân vùng EFI trên cùng ổ cứng với thư mục gốc MacintoshHD của bạn.

EDIT 4 (Hy vọng phiên bản cuối cùng)

#!/bin/bash

maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"} 


function getdisknumber {
diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
                diskline_cut1=${diskline##*"B "}
                diskline_cut2=${diskline##*" "}
                echo "/dev/$diskline_cut2"
}

if [ "$(diskutil list | grep Unlocked)" = "" ] 
    then 
        getdisknumber   
    else 
        alldisk=$(diskutil list)
        alldisk_cut=${alldisk#*${maindrive_reduced}}
        alldisk_cut=${alldisk_cut#*"Logical Volume on "}
        alldisk_cut=${alldisk_cut%%" "*}
        alldisk_cut=${alldisk_cut%s*}
        maindrive_reduced=$alldisk_cut
        getdisknumber
fi

Và đây là lời giải thích

Okay, as ask in the comment, the explanation what %%,%,##,# means. 
All those symbols cut out information of a string.
%%pattern cuts out the biggest pattern matching part to the right.
%pattern cuts out the smallest pattern matching part to the right.
##pattern cuts out the biggest pattern matching part to the left
#pattern cuts out the smallest pattern matching part to the left

Phần khác của tập lệnh bây giờ cố gắng tìm đúng ổ cứng khi đối mặt với Tập tin mã hóa được tạo bởi FileVault. Sau đó, chức năng này sẽ cắt ổ cứng này xuống thông tin ổ đĩa trên ổ cứng này, tìm kiếm EFI làm từ khóa.

Đây là một liên kết về cắt chuỗi trong bash Cắt chuỗi

EDIT 5: Được rồi. Một lần lặp khác của kịch bản này. Rất, rất xuống cơ bản.

#!/bin/bash

## Find the main hard drive

maindrive=$(mount | grep -e " / ")
maindrive=${maindrive#/dev/}
maindrive=${maindrive%%" "*}


## Checking for FileVault

if [ "" != "$(diskutil list /dev/disk1 | grep "Unlocked Encrypted")" ]
        then
                maindrive=$(diskutil list | grep "Logical Volume on")
                maindrive=${maindrive#*"Logical Volume on "}
                maindrive=${maindrive%s*}
fi


## Checking for EFI

EFI_DRIVE=$(diskutil list /dev/$maindrive | grep EFI)
EFI_DRIVE=${EFI_DRIVE##*" "}
echo "/dev/$EFI_DRIVE"

Để hoàn thành, đó là danh sách đĩa của tôi:

/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *250.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         249.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *248.8 GB   disk1
                                 Logical Volume on disk0s2
                                 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                                 Unlocked Encrypted

Và điều này xảy ra khi tôi chạy tập lệnh:

Joes-MacBook-Pro:EFI_Script joe$ chmod +x EFI_Script
Joes-MacBook-Pro:EFI_Script joe$ ./EFI_Script
/dev/disk0s1
Joes-MacBook-Pro:EFI_Script joe$

Tôi đã nghĩ về lý do tại sao nó không làm việc cho bạn cho đến nay. Vì vậy, về cơ bản, nếu điều đó cũng không hoạt động, tôi cần hai thông tin từ bạn. Đầu tiên, tôi sẽ cần biết đầu ra của bạn cho lệnh 'mount'. Của tôi trông như thế này:

Joes-MacBook-Pro:EFI_Script joe$ mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)

Như bạn thấy, nó cho tôi điểm gắn kết '/' trên 'đĩa1'. Tôi chỉ đơn giản giả định, nếu FileVault bị tắt, nó sẽ cung cấp cho bạn điểm gắn kết của bạn trên đĩa0. Nhưng có lẽ tôi đã sai và tôi không có hệ thống nào tắt FileVault. Vì vậy, nếu điểm gắn kết của bạn cũng nằm trên đĩa1 trong khi EFI ở trên đĩa0, nó sẽ trả về sản phẩm nào hoặc chỉ có / dev / vì đây là những gì tôi đã thêm bằng tay. Mặt khác, nếu tôi nhớ chính xác, bạn cũng có phân vùng EFI trên đĩa1.

Dù sao, điều thứ hai tôi cần là bạn chạy tập lệnh này bằng lệnh 'bash -x script', để nó hiển thị những gì nó làm trong khi nó đang chạy. Bằng cách này, chúng ta có thể thấy những gì sai.

Dù sao, tôi hy vọng nó chỉ hoạt động và chúng ta không cần phải đi đến chiều dài này. Nhưng nếu không, chúng ta phải tìm ra một cách khác để tìm ổ cứng chính.

Dù sao, kiểm tra nó. Chúc mừng!


Wow @ TheCommoner282 bạn đã đi đến thị trấn đó. foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loovà `tạo ID ổ đĩa sai, foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI; echo $foocả sản xuất / dev / đĩa0s2 thay vì / dev / đĩa0s1. Tôi sẽ kiểm tra kịch bản dài hơn của bạn vào ngày mai. Bạn có thể giải thích những gì bạn quan tâm, việc sử dụng các ký tự %% và ## của bạn đang làm gì vì tôi không thể tìm thấy bất kỳ tài liệu nào về chúng trực tuyến. Tức là trong $ {maindrive %% "" *}? Tôi rất muốn học.
juliushibert

Tôi sẽ chỉnh sửa một lời giải thích. Ngoài ra, tôi đã tìm thấy một lỗi trong kịch bản của mình và sẽ sửa nó
TheCommoner282 24/07/2015

Ôi chúa ơi, bạn nói đúng. Tôi chỉ nhìn vào dòng thứ hai. Đây chỉ là bãi rác. Tôi 'echo $ foo', không thay đổi trong bước thứ hai. Và 'danh sách đĩa' trước đó có thể sẽ bị trống. Vâng, khởi đầu tồi tệ. Nhưng hãy hy vọng lần lặp thứ tư hoạt động
TheCommoner282

Xin lỗi, tôi phải mất một thời gian để kiểm tra đề xuất cuối cùng của bạn @ TheCommoner282 Vô tình kịch bản chỉ xuất ra /dev/. Cảm ơn bạn đã giải thích về việc cắt trong BASH. Thông tin thực sự tốt để biết.
juliushibert

Cách kỳ lạ. Tôi đoán, phải có một số khác biệt giữa đầu ra đĩa của chúng tôi mà tôi đã không tính đến. Tôi sẽ viết lại kịch bản và cố gắng tính toán. Ngoài ra, tôi sẽ cố gắng thêm sử dụng đầu ra của bạn mà bạn đã đăng cho mục đích thử nghiệm. Tôi có một hoặc hai ý tưởng làm thế nào để hạn chế điều này với ít thông tin hơn, có nghĩa là ít cắt hơn và do đó ít sai sót hoặc cơ hội hơn. Bạn có thể mong đợi phiên bản mới này cho đến ngày mai. Tôi sẽ làm điều đó tối nay (dựa trên Châu Âu, GMT + 1)
TheCommoner282
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.