Apakah kunci USB memiliki nama yang sama setiap kali saya memasangnya?

9

Saya memiliki kunci USB yang akan digunakan untuk menyimpan data setiap hari melalui skrip bash. Saya berhasil memasangnya untuk pengguna tertentu agar dapat menulis folder di dalamnya menggunakan perintah:

mount /dev/sdc1 /media/usb -o rw,uid=sysop,gid=sysop

Script dapat menjalankan dan membuat direktori sesuai keinginan dan sempurna. Pada titik tertentu, kunci USB akan dicabut dan diganti dengan yang baru (model yang sama). Apakah kunci USB baru masih memiliki nama /dev/sdc1atau akan berbeda?

Jika berbeda, bagaimana saya bisa memasukkan bagian pemasangan pada skrip saya agar dibuat secara otomatis?

Gudrun
sumber
2
Jawabannya adalah tidak, tetapi Anda bisa mengatasinya dengan aturan udev . Lihat di sini untuk penjelasan yang lebih baik tetapi sedikit ketinggalan jaman.
Satō Katsura
@AlexTartan Jika Anda mencolokkan disk usb lain di port usb lain sebelum mungkin mendapatkan sdc. Jadi kendala Anda "dan tidak ada yang lain adalah asistensi ke sdc1" adalah benar. Secara umum ini adalah asumsi yang sangat berbahaya yang tidak pernah dapat dibuat. Tidak pernah merupakan ide yang baik untuk menggunakan sd [az] sebagai nama perangkat yang persisten. Ini adalah warisan dari masa ketika kami memiliki pengontrol IDE dengan empat port statis yang dapat diatur dengan mengatur jumper perangkat keras dan memilih steker kabel yang tepat.
ikrabbe
1
@ Ikrabbe, saya tahu, itu sebabnya saya memposting jawaban berdasarkan identifikasi label (ini dapat dikelola sedikit lebih mudah).
Alex Tartan

Jawaban:

6

Meskipun mengaksesnya /dev/sdXyberisiko, identifikasi yang lebih akurat dapat dilakukan oleh UUID.

Karena Anda menyebutkan (pada titik tertentu) mengganti stik usb, untuk mempertahankan kompatibilitas, Anda mungkin ingin mengidentifikasi stik usb Anda dengan label. Untuk melakukannya, Anda dapat: /dev/disk/by-label/YourLabelHere.

Perhatikan bahwa Anda perlu mengatur label ke stik USB baru sebelum menjalankan skrip, dan juga, /dev/disk/by-labelhanya tersedia jika (setidaknya) satu stik usb terhubung (jika tidak akan dihapus).

Detail tentang cara mengatur label usb dapat ditemukan di sini: /ubuntu/194510/how-to-edit-label-of-usb-drive

Alex Tartan
sumber
1
Jika filesystem Anda tidak memiliki label, maka /dev/disk/by-id/mungkin dapat digunakan sebagai gantinya (itu yang saya gunakan untuk filesystem saya).
Toby Speight
3

Inilah cara saya mengatasi masalah ini, tetapi secara umum seperti yang dikatakan Sato Katsura kepada Anda, Anda perlu menulis aturan udev.

  1. Hubungkan perangkat Anda, periksa perangkat mana yang didapat (misalnya dengan menonton dmesg).
  2. Sebagai panggilan pengguna super udevadm info --query all /dev/sdc(atau apa pun).
  3. Siapkan aturan udev, berikut adalah contoh untuk dompet saya. Kolom ID_SERIAL_SHORTdan ID_FS_UUIDsaya baca dari info di langkah 2:

    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="3878-D432", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook", OWNER="ingo"
    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YT440900877400W000Y0", ENV{ID_FS_UUID}=="9016-4EF8", ENV{DEVTYPE}=="disk", SYMLINK+="pocketbook-sd", OWNER="ingo"
    

    Saya mengatur PEMILIK di sini, bahwa saya dapat memasangnya dengan akun pengguna utama saya. Juga dengan dompet saya, saya tidak memiliki partisi tetapi mount disk biasa. Jika Anda memiliki perubahan partisi:

    ENV{ID_PART_ENTRY_NUMBER}=="1", ENV{DEVTYPE}=="partition",
    

    untuk partisi Nomor 1, pada baris aturan udev.

Aturan udev ditemukan di /etc/udev/rules.d, jika Anda memiliki sistem waras.

  1. Sekarang kamu bisa

    udevadm control --reload
    

    untuk memuat kembali aturan dan

    udevadm monitor
    

    untuk memantau apa yang terjadi selama langkah 5.

  2. Plugout dan Plugin perangkat usb Anda (tentu saja setelah unmount sebelumnya jika Anda memasangnya). Monitor harus memberi tahu Anda tentang perangkat baru saat diinisialisasi.

  3. Periksa apakah /dev/mengandung symlink yang tepat. Dalam contoh saya, saya mendapatkan ini:

    brw-rw---- 1 ingo disk    8,  48 Aug  3 10:32 sdd
    brw-rw---- 1 ingo disk    8,  32 Aug  3 10:32 sdc
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook-sd -> sdd
    lrwxrwxrwx 1 root root         3 Aug  3 10:32 pocketbook -> sdc
    

Sekarang Anda dapat mendefinisikan aturan persisten dengan symlinks /dev/pocketbookdan /dev/pocketbook-sd, atau apa pun nama Anda di bidang SYMLINK file aturan udev.

ikrabbe
sumber
1
Terima kasih atas jawaban Anda. Namun saya tidak akan bisa menggunakannya. Perangkat yang saya kerjakan diinstal pada gunung berapi dan tongkat usb digunakan untuk menyimpan data yang diperoleh di sana. Kami hanya akan pergi ke sana setiap tiga bulan untuk mengganti stik usb. Saya hanya memiliki akses jarak jauh untuk itu, tanpa antarmuka "layar". Karena usb akan berbeda setiap saat, tetapi terpasang pada port usb yang sama, saya pikir cara yang lebih mudah adalah menjaga jalur sdc1. Saya akan melihat dengan aturan udev apa yang bisa saya lakukan.
Gudrun
0

Hanya untuk menambahkan jawaban @ alextartan.

Saya menggulung sistem cadangan saya sendiri yang menggunakan drive USB untuk target. Saya harus yakin apa yang terjadi di mana. Karena UUID tidak ramah pengguna, saya mengandalkan label disk.

UUID juga agak bermasalah karena setiap kali Anda memformat ulang sebuah partisi, ia akan mendapatkan UUID yang unik, jadi setiap skrip yang menggunakan UUID itu harus dimodifikasi. Saya dapat menetapkan label yang sama seperti sebelumnya ke partisi yang diformat ulang (atau bahkan ke partisi pada drive baru / pengganti) dan membiarkan skrip saya sendiri.

Saya datang dengan konvensi pelabelan (ramah manusia) saya sendiri yang unik dan menggunakan gparted untuk melabeli berbagai partisi ketika saya membuatnya.

Ketika skrip saya perlu mengakses partisi tertentu, saya mencari nama perangkat menggunakan label.

function get_dev {
  ## Return the device name of a partition
  ## In DEV
  ## Given its label
  ## Partition does not need to be mounted
  ## Usage get_dev <partition_label>
  ## Copyleft 04/28/2014 JPmicrosystems
  local LINE
  local VERBOSE=1  ## Verbose version
  local USAGE="ERROR Usage is: get_dev <partition_label>"
  unset DEV

  if [ -z "${1}" ]
  then
    (( VERBOSE )) && echo $USAGE
    return 1
  fi

  LINE=$(ls -l /dev/disk/by-label | grep " ${1} ")
  if (( $? ))
  then
    (( VERBOSE )) && echo "ERROR Partition [${1}] not found"
    return 1
  fi

  DEV="/dev/${LINE##*/}"
  return 0
}
Joe
sumber