OS 파티션이 있는 디스크를 식별합니까(스크립팅용)?

OS 파티션이 있는 디스크를 식별합니까(스크립팅용)?

운영 체제가 있는 디스크(파티션 아님)를 자동으로 식별하려고 하면 프로그램이 많은 추가 디스크를 포맷합니다(실수로 운영 체제 디스크를 포맷하지 않도록).

현재 사용 중이지만 dmidecode -s system-uuid이것이 파티션 UUID를 제공한다고 생각합니다.

사용자에게 물어볼 수도 있지만 번거로울 것입니다.

스크립트 형식으로 사용할 수 있는 디스크(예: /dev/sdX)와 UUID를 식별할 수 있는 방법이 있습니까?

다음과 같이 정확한 결과를 생성하면 더 좋을 것입니다. 실행하여 CODE_HERE결과 얻기 /dev/sdX:)

System:
  Host: MidnightStarSign Kernel: 5.12.9-1-MANJARO x86_64 bits: 64 compiler: gcc 
  v: 11.1.0 Desktop: KDE Plasma 5.21.5 Distro: Manjaro Linux base: Arch Linux 
Machine:
  Type: Desktop Mobo: ASUSTeK model: PRIME X570-PRO v: Rev X.0x 
  serial: <superuser required> UEFI: American Megatrends v: 3001 
  date: 12/04/2020 
CPU:
  Info: 16-Core model: AMD Ryzen 9 5950X bits: 64 type: MT MCP arch: Zen 3 
  rev: 0 cache: L2: 8 MiB 
  flags: avx avx2 lm nx pae sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3 svm 
  bogomips: 217667 
  Speed: 3728 MHz min/max: 2200/3400 MHz boost: enabled Core speeds (MHz): 
  1: 3728 2: 3664 3: 4122 4: 3754 5: 3678 6: 3659 7: 3682 8: 3661 9: 3670 
  10: 3683 11: 3664 12: 3658 13: 3660 14: 4580 15: 3660 16: 4585 17: 3668 
  18: 4585 19: 3662 20: 3671 21: 3662 22: 3670 23: 3660 24: 3662 25: 3661 
  26: 3661 27: 3732 28: 3662 29: 4573 30: 3721 31: 4575 32: 3681 
Graphics:
  Device-1: NVIDIA GA104 [GeForce RTX 3070] vendor: ASUSTeK driver: nvidia 
  v: 465.31 bus-ID: 0b:00.0 
  Device-2: Microdia USB 2.0 Camera type: USB driver: snd-usb-audio,uvcvideo 
  bus-ID: 7-1:2 
  Display: x11 server: X.Org 1.20.11 driver: loaded: nvidia resolution: 
  1: 1920x1080~60Hz 2: 1920x1080 3: 1920x1080 
  OpenGL: renderer: NVIDIA GeForce RTX 3070/PCIe/SSE2 v: 4.6.0 NVIDIA 465.31 
  direct render: Yes 
Audio:
  Device-1: NVIDIA vendor: ASUSTeK driver: snd_hda_intel v: kernel 
  bus-ID: 0b:00.1 
  Device-2: AMD Starship/Matisse HD Audio vendor: ASUSTeK driver: snd_hda_intel 
  v: kernel bus-ID: 0e:00.4 
  Device-3: JMTek LLC. Plugable USB Audio Device type: USB 
  driver: hid-generic,snd-usb-audio,usbhid bus-ID: 3-1:2 
  Device-4: Schiit Audio Schiit Modi 3+ type: USB driver: snd-usb-audio 
  bus-ID: 3-2:3 
  Device-5: ASUSTek ASUS AI Noise-Cancelling Mic Adapter type: USB 
  driver: hid-generic,snd-usb-audio,usbhid bus-ID: 5-5:3 
  Device-6: Microdia USB 2.0 Camera type: USB driver: snd-usb-audio,uvcvideo 
  bus-ID: 7-1:2 
  Sound Server-1: ALSA v: k5.12.9-1-MANJARO running: yes 
  Sound Server-2: JACK v: 0.125.0 running: no 
  Sound Server-3: PulseAudio v: 14.2 running: yes 
  Sound Server-4: PipeWire v: 0.3.30 running: yes 
Network:
  Device-1: Realtek RTL8125 2.5GbE driver: r8169 v: kernel port: d000 
  bus-ID: 05:00.0 
  IF: enp5s0 state: up speed: 1000 Mbps duplex: full mac: 3c:7c:3f:a6:c3:22 
  Device-2: Intel I211 Gigabit Network vendor: ASUSTeK driver: igb v: kernel 
  port: c000 bus-ID: 07:00.0 
  IF: enp7s0 state: down mac: 24:4b:fe:5b:08:2a 
Bluetooth:
  Device-1: Cambridge Silicon Radio Bluetooth Dongle (HCI mode) type: USB 
  driver: btusb v: 0.8 bus-ID: 3-5.3:6 
  Report: rfkill ID: hci0 rfk-id: 0 state: up address: see --recommends 
Drives:
  Local Storage: total: 3.89 TiB used: 1.83 TiB (47.1%) 
  ID-1: /dev/nvme0n1 vendor: Western Digital model: WDS100T3X0C-00SJG0 
  size: 931.51 GiB 
  ID-2: /dev/nvme1n1 vendor: Western Digital model: WDS100T2B0C-00PXH0 
  size: 931.51 GiB 
  ID-3: /dev/sda vendor: Seagate model: ST2000LM015-2E8174 size: 1.82 TiB 
  ID-4: /dev/sdb type: USB vendor: Generic model: USB3.0 CRW -SD 
  size: 119.08 GiB 
  ID-5: /dev/sdd type: USB vendor: Samsung model: Flash Drive FIT 
  size: 119.51 GiB 
  ID-6: /dev/sde type: USB vendor: Toshiba model: TransMemory size: 14.92 GiB 
  ID-7: /dev/sdf type: USB vendor: SanDisk model: Gaming Xbox 360 size: 7.48 GiB 
Partition:
  ID-1: / size: 767 GiB used: 726.35 GiB (94.7%) fs: btrfs dev: /dev/dm-0 
  mapped: luks-466d5812-64c7-4a28-bcc4-a1a5adfa9450 
  ID-2: /boot/efi size: 511 MiB used: 26.1 MiB (5.1%) fs: vfat 
  dev: /dev/nvme0n1p1 
  ID-3: /home size: 767 GiB used: 726.35 GiB (94.7%) fs: btrfs dev: /dev/dm-0 
  mapped: luks-466d5812-64c7-4a28-bcc4-a1a5adfa9450 
Swap:
  ID-1: swap-1 type: partition size: 64 GiB used: 128.2 MiB (0.2%) 
  dev: /dev/dm-1 mapped: luks-81b2dc57-06f5-4471-b484-77c3a516f307 
Sensors:
  System Temperatures: cpu: 79.6 C mobo: 0 C gpu: nvidia temp: 41 C 
  Fan Speeds (RPM): N/A gpu: nvidia fan: 0% 
Info:
  Processes: 964 Uptime: 1d 4h 28m Memory: 62.78 GiB used: 39.02 GiB (62.2%) 
  Init: systemd Compilers: gcc: 11.1.0 clang: 12.0.0 Packages: 2014 Shell: Bash 
  v: 5.1.8 inxi: 3.3.04 

답변1

전반적인 상황은 쉽게 해결될 수 없을 것 같습니다. 하지만 아주 기본적인 경우에는 그리 어렵지 않습니다. 루트 파티션을 얻는 것은 를 실행하는 것만큼 간단합니다 df -h /. 이제 파티션은 /dev/sdXdigit(결국 /dev/hdXdigit) 또는 입니다. /dev/xxxxxpdigit여기서 xxxxx는 nvme0n1또는 과 같습니다 mmcblk0. 따라서 간단한 경우에는 시스템 디스크를 얻는 것이 비교적 간단합니다.

  1. /파티션 이름 가져오기
    • 부품 이름이 다음으로 끝나면 digitpdigits삭제pdigits
    • 그렇지 않으면 후행 숫자를 제거하십시오.

다음을 수행할 수 있습니다.

df -h / | awk '
  NR == 2 && $1 ~ /[0-9]p[0-9]+$/ {
    disk=$1
    sub( /p[0-9]+$/, "", disk )
    print disk
  }
  NR == 2 && $1 ~ /[sh]d.[0-9]+$/ {
    disk=$1
    sub( /[0-9]+$/, "", disk )
    print disk
  }
'

그러나 일반적인 그림은 정말 복잡합니다. /는 최소 2개의 디스크(또는 lvm < raid < crypto)가 포함된 일부 raid 장치 위에 자체적으로 구축된 암호화 장치 위에 구축된 lvm 볼륨에 있을 수 있거나 다중 경로 장치(2 컨트롤러)에 있을 수 있습니다. 동일한 컨트롤러에 액세스) 중복성을 위한 장치 및 궁극적으로 하나의 물리적 장치에 2개의 장치 이름이 있음) 또는 zfs raid에 있거나 잘 모르겠습니다...

따라서 시스템이 EFI 모드로 부팅한다고 가정하면 아마도 /boot/efi가 있는 부팅 디스크에 관심이 있을 것입니다. 이 경우에는 df -h /로 교체하면 됩니다 df -h /boot/efi. 왜 사용합니까 /boot/efi? EFI 펌웨어는 단순 파티션만 부팅할 수 있기 때문에 zfs raid, luks, linux raid 또는 Linux에서 사용할 수 있는 기타 이상한 것들을 부팅할 수 없습니다. 시스템 디스크를 감지하는 데 여전히 문제가 있습니다. /boot/efi가 zfs raid, lvm, linux raid 등의 어딘가에 있을 가능성이 있습니다 /dev/sda./dev/sdb

답변2

시도해 보거나 해당 형식의 버전을 사용해 볼 수 있습니다 stat /.

출력은 다음과 같습니다.

File: /
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 10302h/66306d   Inode: 2           Links: 19
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
[...]

장치 정보: - 16진수 10302는 10진수 103h = 259(nvme 장치) 및 02h = 파티션 2로 디코딩될 수 있습니다.

lsblk확인함(소수점)

nvme0n1     259:0    0 238.5G  0 disk 
├─nvme0n1p1 259:1    0   260M  0 part /boot/efi
├─nvme0n1p2 259:2    0  48.8G  0 part /
└─nvme0n1p3 259:3    0  48.8G  0 part /mnt/linux

이 두 명령에서 보다 스크립트 친화적인 출력을 얻는 것이 가능해야 합니다.

blkid파티션 UUID를 얻는 데 사용할 수 있습니다.

관련 정보