사용을 고려해보세요/dev/disk/by-{path,id}/

사용을 고려해보세요/dev/disk/by-{path,id}/

나는 종종 /dev/sdX로 등록된 USB 드라이브 포맷을 처리합니다. 여기에는 일반적으로 루트로 실행되는 실행 명령 mkfsfdisk기타 명령이 포함됩니다. mount그런데 혹시 실수로 문자를 잘못 입력해서 하드 드라이브를 포맷할까봐 걱정이 됩니다.

이상적으로 는 수동 명령을 통해 장치를 "읽기-쓰기" 모드로 전환하지 않으면 /dev/sdX*모든 장치가 실패하도록 장치를 "읽기 전용" 모드로 설정하고 싶습니다 .fdisk mkfs wipefs

나는 chmod ugo-w /dev/sdX그것이 그렇게 작동할 것이라고 생각했다. 그러나 놀랍게도 chmod 0000 /dev/sdc1다음 mkfs /dev/sdc1작품은 완전히 괜찮았습니다.

모든 사용자(루트 포함)가 하드 드라이브와 해당 파티션 테이블을 수정하고, 하드 드라이브를 분할하고, 마운트된 파일 시스템을 통하지 않고 파티션에 쓰는 것을 방지하는 방법은 무엇입니까? 원할 경우 이 방법을 사용하여 드라이브에 쓰기를 어떻게 활성화할 수 있습니까?

장치를 사용자 소유로 만들 수 있다는 것을 알고 있습니다. 그러나 이렇게 하려면 chroot또는 같은 mount명령을 실행하려면 사용자와 루트 간에 전환해야 하는데 umount, 이는 보안상의 허점입니다. 모든 USB 저장 장치를 사용자가 소유하는 것을 원하지 않습니다. 더 나은 솔루션을 찾고 있습니다. 이상적으로는 루트를 유지하되 잘못된 디스크를 포맷하지 않는 것이 좋습니다.

답변1

사용을 고려해보세요/dev/disk/by-{path,id}/

/dev/disk/by-path/블록 장치에 대한 기호 링크가 있습니다. 여기서 기호 링크의 이름은 장치(하위 시스템, 버스, 컨트롤러, 포트 등)에 대한 "하드웨어 경로"를 설명합니다. 내 시스템의 편집된 목록에는 NVME 장치, SATA 장치 및 USB 드라이브(및 각 드라이브의 첫 번째 파티션)가 표시됩니다.

/dev/disk/by-path
├── pci-0000:00:14.0-usb-0:1:1.0-scsi-0:0:0:0 -> ../../sdc
├── pci-0000:00:14.0-usb-0:1:1.0-scsi-0:0:0:0-part1 -> ../../sdc1
├── pci-0000:00:17.0-ata-2 -> ../../sda
├── pci-0000:00:17.0-ata-2-part1 -> ../../sda1
├── pci-0000:02:00.0-nvme-1 -> ../../nvme0n1
└── pci-0000:02:00.0-nvme-1-part1 -> ../../nvme0n1p1

/dev/disk/by-id유사하게 작동하지만 하위 시스템, 장치 제조업체/모델 및 일련 번호가 있습니다. 삼성 스토리지가 많이 있는 것 같습니다.

/dev/disk/by-id
├── ata-Samsung_SSD_860_EVO_500GB_XXXXXXXXXXXXXXX -> ../../sda
├── ata-Samsung_SSD_860_EVO_500GB_XXXXXXXXXXXXXXX-part1 -> ../../sda1
├── nvme-Samsung_SSD_980_PRO_1TB_XXXXXXXXXXXXXXX -> ../../nvme0n1
├── nvme-Samsung_SSD_980_PRO_1TB_XXXXXXXXXXXXXXX-part1 -> ../../nvme0n1p1
├── usb-Samsung_Flash_Drive_FIT_XXXXXXXXXXXXXXXX-0:0 -> ../../sdc
└── usb-Samsung_Flash_Drive_FIT_XXXXXXXXXXXXXXXX-0:0-part1 -> ../../sdc1

연결된 USB 드라이브를 (Sata/nvme) 시스템 드라이브와 혼동하지 않는 것이 목표라고 가정하면 이러한 이름이 도움이 될 수 있습니다. 다음 명령의 이름을 사용하면 예상대로 작동합니다.

fdisk /dev/disk/by-id/usb-Samsung_Flash_Drive_FIT_XXXXXXXXXXXXXXXX-0:0
mke2fs /dev/disk/by-id/usb-Samsung_Flash_Drive_FIT_XXXXXXXXXXXXXXXX-0:0-part1

이것이 여러분의 관심을 끌고 멈추기에 충분하기를 바랍니다.

mke2fs /dev/disk/by-id/nvme-Samsung_SSD_980_PRO_1TB_XXXXXXXXXXXXXXX-part1

답변2

rm /dev/sda /dev/sda1 실수로 이러한 장치를 참조하는 것을 방지하려는 경우 간단한 전략은 부팅 후 기다리는 것입니다. mknod /dev/sda1 b 8 1필요한 경우 언제든지 등을 사용하여 inode를 다시 만들 수 있지만 umount /dev/sda1적절한 정보가 어딘가에 있을 수 있으므로 inode 없이도 작동합니다.

그러나 실제로는 위생상의 문제입니다. 루트로 로그인하지 말고, 루트로 로그인하지 않는 것이 좋습니다. 또는 빨간색 배경의 터미널에서만 수행해야 하는 경우에는 복사하여 붙여넣지 마십시오. 반복 작업 스크립트를 작성하고 매개변수를 확인하고 기타 온전한 검사를 수행하는지 확인하세요.

답변3

blockdev --setro음, 읽기 전용( --setrw읽기 및 쓰기에 사용되는) 블록 장치 가 있습니다 .

# blockdev --setro /dev/sdx3
# mkfs.ext4 /dev/sdx3
mke2fs 1.47.0 (5-Feb-2023)
/dev/sdx3 contains a vfat file system
Proceed anyway? (y,N) y
/dev/sdx3: Operation not permitted while setting up superblock
# wipefs -a /dev/sdx3
wipefs: /dev/sdcx3: failed to erase vfat magic string at
  offset 0x00000052: Operation not permitted

그렇다면 블록 장치를 루트까지 읽기 전용으로 만들 수 있습니까? 예. 글쎄요.

그러나 그다지 신뢰할 수는 없습니다. 예를 들어, 어떤 이유로든 커널이 파티션 테이블을 다시 읽는 경우입니다. 파티션이 실제로 변경되지 않았더라도 다시 읽은 후에는 기술적으로 새 장치이며 /dev/sdx3이 ro 플래그는 설정되지 않았습니다.

따라서 최소한 읽기 전용 플래그를 항상 관리하고 유지하려면 몇 가지 udev 규칙이 필요합니다. (기본적으로 블록 장치를 읽기 전용으로 만드는 플래그가 어디에 있는지는 알 수 없습니다.)

또한 이미 쓰기 모드에서 장치를 사용하고 있는 모든 장치는 계속해서 쓰기 모드를 사용할 수 있습니다. 따라서 이것은 마운트된 파일 시스템에 영향을 미치지 않습니다... 해당 파일 시스템이 어떤 이유로든 장치를 다시 열려고 시도할 때까지(재설치 중 마운트 플래그가 변경되는 경우 등).

물론 파티션을 읽기 전용으로 설정해도 오프셋에서 기본 장치에 무언가가 기록되는 것을 방지할 수 없으며 그 반대의 경우도 마찬가지입니다. 정확히 동일한 저장 영역을 가리키는 여러 블록 장치가 있는 것은 정상입니다. 하나만이 아니라 모두 읽기 전용으로 설정해야 합니다.

그래서 가능합니다. 예, 그다지 실용적이지는 않습니다.

이 플래그를 설정하면 다른 프로그램에서 오류가 발생할 수 있으며 이러한 오류로 인해 다양한 유형의 데이터 손실이 발생할 수 있습니다. 일반적으로 쓰기가 성공하거나 기록되어야 하는 모든 내용이 손실되기를 원합니다.

따라서 이 접근 방식은 해결하는 것보다 더 많은 문제를 일으킬 가능성이 있습니다. 마지막으로, 여전히 USB 스틱을 포맷하고 싶고, 그렇게 하려면 쓰기 가능하게 만들어야 하며, 그러기 위해서는 올바른 장치 이름을 인식하고 사용할 수 있어야 하며 잘못된 이름과 혼동하지 않아야 합니다.

내부 드라이브를 지칭할 가능성이 없는 /dev/disk/by-*/* 이름과 같이 더 적절한 이름이 있는지 확인할 수 있습니다 ./dev/disk/by-id/usb-Flash…

답변4

귀하는 컴퓨터에서 나쁜 일을 하는 것을 방지하기 위한 기술적 솔루션을 찾고 있습니다.

우리 중 많은 사람들이 이러한 문제를 피하는 방법 중 하나는 잘못된 일을 하고 데이터를 잃는 것입니다. 우리는 속도를 늦추고 사물을 주의 깊게 살펴보는 법을 배웁니다.

다른 사람의 실수로부터 배울 수 있다면 정말 좋습니다. 나는 내 실수로부터 많은 것을 배웠습니다.

기술적 솔루션이 잘 작동할 수 있음당신의컴퓨터가 지금의 모습입니다. 위험한 행동에 대한 접근 방식을 개선하면 도움이 될 것입니다.어느미래의 컴퓨터.

유닉스는 작은 작업을 수행하는 작은 도구입니다. 날카로운 칼, 가위, 끌과 마찬가지로 사용자가 어떻게 사용하느냐에 따라 모든 것이 달라집니다.

도구에 익숙해지되 결코 안주하지 마세요.

관련 정보