將原始圖像安全寫入 U 盤
在各種硬體上嘗試了許多不同的 Linux 發行版,我發現自己經常輸入這樣的命令:
sudo dd if=xubuntu-13.10-desktop-amd64.iso of=/dev/sdc bs=10240
不用說,遲早我會打錯目的地並擦除硬碟驅動器而不是預期的 USB 驅動器。我不想
sudo
每次都在這裡使用。在我的系統上,一個相當現代的 Ubuntu,權限
/dev/sdc
如下:(當存在棒時):$ ls -al /dev/sdc* brw-rw---- 1 root disk 8, 32 Apr 6 22:10 /dev/sdc
如何授予我的普通使用者對隨機 USB 記憶棒的寫入權限,但不授予我係統中存在的其他磁碟的權限?
我認為你可以使用 UDEV 來做你想做的事。創建一個規則文件,例如
/etc/udev/rules.d/99-thumbdrives.rules
您只需添加一個允許 Unix 組或使用者訪問任意 USB 拇指驅動器的規則。KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="<user>", GROUP="<group>", MODE="0660"
將使用 user
<user>
和 group創建設備<group>
。例子
- 將此行添加到我的系統後。
KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", OWNER="saml", GROUP="saml", MODE="0660"
- 並重新載入我的規則:
$ sudo udevadm control --reload-rules
- 如果我現在將拇指驅動器插入我的系統,我的
/var/log/messages
顯示如下:$ 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
- 現在檢查下
/dev
顯示的設備文件如下:$ 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
所以它似乎奏效了。
更明確
以上將起作用,但可能會將這些規則應用於並非我們想要的每個塊設備。為了稍微縮小它的焦點,您可以使用
ATTRS{..}==...
屬性規則將應用程序限制在特定的硬體上。就我而言,我只希望它應用於單個 USB 拇指驅動器。步驟 #1 - 唯一 id 設備
因此,一旦我們安裝了特定的拇指驅動器,我們就可以開始使用這個命令,這樣我們就可以
udevadm
用來檢查它,摸索它的特定屬性。在這裡,我將重點關注“製造商”和“產品”屬性。
$ 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"
注意:
ATTRS{..}==..
屬性是該設備的設備文件最終派生的層次結構中父設備的屬性。所以在我們的例子中,被添加的塊設備/dev/sdb
來自一個 USB 父設備,所以我們正在尋找這個父設備的屬性,ATTRS{manufacturer}=...
例如。所以在這個例子中,我選擇了製造商“JMTek”和產品“USBDrive”。
步驟 #2 - 修改 .rules fly
因此,有了這些額外的位,讓我們將它們添加到我們的原始
.rules
文件中。KERNEL=="sd*", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ATTRS{manufacturer}=="JMTek", ATTRS{product}=="USBDrive", OWNER="saml", GROUP="saml", MODE="0660"
第 3 步 - 嘗試一下
現在,當我們重新載入規則並再次解除安裝/刪除/重新插入 USB 拇指驅動器時,我們會得到以下規則:
$ 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
但是,如果我插入一個完全不同的設備:
$ 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
參考