Viết hình ảnh thô an toàn vào thẻ nhớ USB


7

Thử nhiều bản phân phối Linux khác nhau trên tất cả các loại phần cứng, tôi thấy mình gõ các lệnh như thế này khá thường xuyên:

sudo dd if=xubuntu-13.10-desktop-amd64.iso of=/dev/sdc bs=10240

Không cần phải nói, sớm hay muộn tôi sẽ gõ nhầm đích và xóa một ổ cứng thay vì ổ USB dự định. Tôi muốn không sử dụng sudomỗi lần ở đây.

Trên hệ thống của tôi, một Ubuntu khá hiện đại, các quyền trên /dev/sdcgiống như: (khi có một thanh):

$ ls -al /dev/sdc*
brw-rw---- 1 root disk 8, 32 Apr  6 22:10 /dev/sdc

Làm cách nào để tôi cấp cho người dùng thường xuyên quyền truy cập ghi vào các thẻ USB ngẫu nhiên nhưng không phải các đĩa khác có trong hệ thống của tôi?

Câu trả lời:


11

Tôi nghĩ bạn có thể sử dụng UDEV để làm những gì bạn muốn. Tạo một tệp quy tắc, chẳng hạn như /etc/udev/rules.d/99-thumbdrives.rulesbạn chỉ cần thêm một quy tắc sẽ cho phép nhóm Unix hoặc người dùng truy cập vào các ổ USB tùy ý.

KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="<user>", GROUP="<group>", MODE="0660"

Sẽ tạo ra thiết bị bằng cách sử dụng người dùng <user>và nhóm <group>.

Thí dụ

  1. Sau khi thêm dòng này vào hệ thống của tôi.

    KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="saml", GROUP="saml", MODE="0660"
    
  2. Và tải lại các quy tắc của tôi:

    $ sudo udevadm control --reload-rules
    
  3. Nếu bây giờ tôi chèn một ngón tay cái vào hệ thống của mình, thì tôi /var/log/messagessẽ hiển thị như sau:

    $ sudo tail -f /var/log/messages
    Apr 13 11:48:45 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000
    Apr 13 11:51:18 greeneggs udisksd[2249]: Cleaning up mount point /run/media/saml/HOLA (device 8:17 is not mounted)
    Apr 13 11:51:18 greeneggs udisksd[2249]: Unmounted /dev/sdb1 on behalf of uid 1000
    Apr 13 11:51:18 greeneggs kernel: [171038.843969] sdb: detected capacity change from 32768000 to 0
    Apr 13 11:51:39 greeneggs kernel: [171058.964358] usb 2-1.2: USB disconnect, device number 15
    Apr 13 11:51:46 greeneggs kernel: [171066.053922] usb 2-1.2: new full-speed USB device number 16 using ehci-pci
    Apr 13 11:51:46 greeneggs kernel: [171066.134401] usb 2-1.2: New USB device found, idVendor=058f, idProduct=9380
    Apr 13 11:51:46 greeneggs kernel: [171066.134407] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    Apr 13 11:51:46 greeneggs kernel: [171066.134410] usb 2-1.2: Product: USBDrive
    Apr 13 11:51:46 greeneggs kernel: [171066.134412] usb 2-1.2: Manufacturer: JMTek
    Apr 13 11:51:46 greeneggs kernel: [171066.135470] usb-storage 2-1.2:1.0: USB Mass Storage device detected
    Apr 13 11:51:46 greeneggs kernel: [171066.136121] scsi17 : usb-storage 2-1.2:1.0
    Apr 13 11:51:46 greeneggs mtp-probe: checking bus 2, device 16: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2"
    Apr 13 11:51:46 greeneggs mtp-probe: bus: 2, device: 16 was not an MTP device
    Apr 13 11:51:47 greeneggs kernel: [171067.139462] scsi 17:0:0:0: Direct-Access     JMTek    USBDrive         7.77 PQ: 0 ANSI: 2
    Apr 13 11:51:47 greeneggs kernel: [171067.140251] sd 17:0:0:0: Attached scsi generic sg2 type 0
    Apr 13 11:51:47 greeneggs kernel: [171067.142105] sd 17:0:0:0: [sdb] 64000 512-byte logical blocks: (32.7 MB/31.2 MiB)
    Apr 13 11:51:47 greeneggs kernel: [171067.144236] sd 17:0:0:0: [sdb] Write Protect is off
    Apr 13 11:51:47 greeneggs kernel: [171067.145988] sd 17:0:0:0: [sdb] No Caching mode page found
    Apr 13 11:51:47 greeneggs kernel: [171067.145998] sd 17:0:0:0: [sdb] Assuming drive cache: write through
    Apr 13 11:51:47 greeneggs kernel: [171067.153721] sd 17:0:0:0: [sdb] No Caching mode page found
    Apr 13 11:51:47 greeneggs kernel: [171067.153728] sd 17:0:0:0: [sdb] Assuming drive cache: write through
    Apr 13 11:51:47 greeneggs kernel: [171067.159028]  sdb: sdb1
    Apr 13 11:51:47 greeneggs kernel: [171067.164760] sd 17:0:0:0: [sdb] No Caching mode page found
    Apr 13 11:51:47 greeneggs kernel: [171067.164768] sd 17:0:0:0: [sdb] Assuming drive cache: write through
    Apr 13 11:51:47 greeneggs kernel: [171067.164775] sd 17:0:0:0: [sdb] Attached SCSI removable disk
    Apr 13 11:51:47 greeneggs kernel: [171067.635474] FAT-fs (sdb1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
    Apr 13 11:51:47 greeneggs udisksd[2249]: Mounted /dev/sdb1 at /run/media/saml/HOLA on behalf of uid 1000
    
  4. Bây giờ kiểm tra các tập tin thiết bị dưới đây /devcho thấy như sau:

    $ ls -l /dev/sd*
    brw-rw----. 1 root disk 8,  0 Apr 13 09:17 /dev/sda
    brw-rw----. 1 root disk 8,  1 Apr 13 09:17 /dev/sda1
    brw-rw----. 1 root disk 8,  2 Apr 13 09:17 /dev/sda2
    brw-rw----. 1 saml saml 8, 16 Apr 13 11:51 /dev/sdb
    brw-rw----. 1 root disk 8, 17 Apr 13 11:51 /dev/sdb1
    

Vì vậy, nó dường như đã làm việc.

Rõ ràng hơn

Những điều trên sẽ hoạt động nhưng có khả năng sẽ áp dụng các quy tắc này cho mọi thiết bị khối không hoàn toàn như những gì chúng ta muốn. Để thu hẹp trọng tâm của nó một chút, bạn có thể sử dụng ATTRS{..}==...các quy tắc thuộc tính để giới hạn ứng dụng vào phần cứng cụ thể. Trong trường hợp của tôi, tôi chỉ muốn nó được áp dụng cho một ngón tay cái USB duy nhất.

Bước # 1 - thiết bị id duy nhất

Vì vậy, để bắt đầu, chúng ta có thể sử dụng lệnh này một khi chúng ta đã gắn ổ đĩa ngón tay cái cụ thể để chúng ta có thể sử dụng udevadmđể xem xét kỹ lưỡng, dò dẫm nó cho các thuộc tính cụ thể của nó.

Ở đây tôi đang tập trung xem xét các thuộc tính "nhà sản xuất" và "sản phẩm".

$ udevadm info -a -p $(udevadm info -q path -n /dev/sdb)|grep -iE "manufacturer|product"
    ATTRS{manufacturer}=="JMTek"
    ATTRS{idProduct}=="9380"
    ATTRS{product}=="USBDrive"
    ATTRS{idProduct}=="0020"
    ATTRS{manufacturer}=="Linux 3.13.7-100.fc19.x86_64 ehci_hcd"
    ATTRS{idProduct}=="0002"
    ATTRS{product}=="EHCI Host Controller"

LƯU Ý: ATTRS{..}==.. các thuộc tính là các thuộc tính cho các thiết bị mẹ trong hệ thống phân cấp nơi tệp thiết bị của thiết bị này cuối cùng xuất phát từ đó. Vì vậy, trong trường hợp của chúng tôi, thiết bị khối được thêm vào, /dev/sdbđến từ thiết bị gốc USB, vì vậy, chúng tôi đang tìm kiếm các thuộc tính của phụ huynh này ATTRS{manufacturer}=..., ví dụ.

Vì vậy, trong ví dụ này tôi đang chọn nhà sản xuất "JMTek" và sản phẩm "USBDrive".

Bước # 2 - sửa đổi .rules flie

Vì vậy, với các bit bổ sung này trong tay, hãy thêm chúng vào .rulestệp gốc của chúng tôi .

KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ATTRS{manufacturer}=="JMTek", ATTRS{product}=="USBDrive", OWNER="saml", GROUP="saml", MODE="0660"

Bước # 3 - Dùng thử

Bây giờ khi chúng tôi tải lại các quy tắc của mình và ngắt kết nối / xóa / cài đặt lại ngón tay cái USB của chúng tôi, chúng tôi nhận được quy tắc này:

$ ls -l /dev/sdb*
brw-rw----. 1 saml saml 8, 16 Apr 13 12:29 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 13 12:29 /dev/sdb1

Tuy nhiên nếu tôi chèn một thiết bị hoàn toàn khác:

$ ls -l /dev/sdb*
brw-rw----. 1 root disk 8, 16 Apr 13 12:41 /dev/sdb
brw-rw----. 1 root disk 8, 17 Apr 13 12:41 /dev/sdb1

Người giới thiệu


Đây, đã, là câu trả lời đúng nhất. Bạn không thường xuyên thất vọng, slm.
mikeerv

Bạn không nên sử dụng hệ thống con khối? Nếu tôi không nhầm, quy tắc này sẽ khớp với thiết bị / dev / usb / xxx / yyy thay vì / dev / sdc. ATTRS chứ không phải ATTR phải phù hợp với các thiết bị mẹ (tức là khối).
Lekensteyn

@Lekensteyn - cảm ơn ban đầu nó không hoạt động cho tôi và tôi không thể hiểu tại sao. Với đầu mối lớn của bạn và chuyển quy tắc đến cùng ( 99-...) Bây giờ tôi có thể thực sự hiển thị một bản demo thực sự hoạt động. Cảm ơn một lần nữa cho hướng dẫn!
slm

Tôi đã phải chiến đấu một chút nhưng cuối cùng tôi đã sử dụng SUBSYSTEM=="block", ENV{ID_BUS}=="usb", GROUP="mogul"cái mà tôi đọc là "bất kỳ đĩa USB nào cũng sẽ nằm trong nhóm của ông trùm". sử dụng quy tắc 99 cũng giúp
mogul

@mogul - vâng, đó là một chút thử nghiệm và lỗi nhận được những thứ vuông 8-)
slm
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.