Mudah Mount & Unmount File ISO Image dengan Ruby Script (feat. udisksctl)
Latar Belakang
Sejak 2018 hingga saat ini (2020), saya sudah jarang sekali memanfaatkan file manager GUI, seperti Thunar, PCMANFM, ataupun Nautlius untuk mengurusi pekerjaan manajemen file. Hal-hal seperti explorasi file dokumen, file gambar, video, audio, semuanya dapat saya lakukan di ranger –baca tentang ranger.
Masalah
Namun, ada beberapa hal yang salah satunya masih saya kerjakan menggunakan file manager GUI, yaitu mount & unmount file ISO image.
Kadang saya perlu untuk melakukan inspeksi terhadap file ISO yang akan saya jalankan di Virt-Manager. Untuk melihat apakah terdapat hal-hal yang janggal atau tidak.
Pemecahan Masalah
Pada catatan ini, saya akan menunjukkan 2 cara.
1. Manual dengan mount & umount command
Cara ini adalah cara yang menjadi hal dasar sebagai pengguna sistem operasi GNU/Linux atau Unix like.
Kita perlu mengetahui bagaimana cara menggunakan command mount & umount.
Mount ISO image
$ sudo mount -l -o loop /source/path/iso /target/path
$ sudo mount -l -o loop archlinux.iso /run/media/bandithijo
$ lsblk
NAME   FSTYPE    SIZE TYPE LABEL       MOUNTPOINT
loop0  iso9660   681M loop ARCH_202010 /run/media/bandithijo
sda            447.1G disk
└─sda1 ext4    447.1G part             /
Maka, isi dari direktori /run/media/bandithijo/ adalah
$ ls -l /run/media/bandithijo
total 697396
-rw-r--r-- 1 bandithijo users 714080256 Oct 20 02:11 archlinux-2020.10.01-x86_64.iso
drwxr-xr-x 2 bandithijo users      4096 May  3 08:54 Backup
-rw-r--r-- 1 bandithijo users        66 Feb 14  2019 cek_md5
-rwxr-xr-x 1 bandithijo users       246 Oct  9 18:57 lazymigrate.rb
drwxr-xr-x 3 bandithijo users     12288 May  3 08:54 Manual
Keterangan perintah:
-l, untuk memberikan label yang disertakan oleh ISO image.
-o loop, untuk option menggunakan loopback device.
Unmount ISO image
$ sudo umount /target/path
$ sudo umount /run/media/bandithijo
Atau, bisa juga menggunakan ISO image yang dimount sebelumnya.
$ sudo umount archlinux.iso
PERHATIAN!
Perlu diperhatikan, perintah yang digunakan untuk melakukan proses unmount.
Bukan
unmounttapiumount.
2. Otomatis dengan Ruby script
Kalau teman-teman perhatikan, proses mount & unmount menggunakan file manager GUI, akan memberikan path dengan nama label sebagai akhirnya.
Misal, file archlinux.iso sebelumnya, maka nama pathnya akan menjadi seperti ini.
/run/media/bandithijo/ARCH_202010/
Cantik bukan.
Sedangkan kalau kita mount manual, kita perlu membuat direktori dengan nama label atau nama tertentu terlebih dahulu. Tidak praktis.
Maka dari itu, agar proses tersebut dapat saya tiru, tanpa perlu repot, saya buat Ruby script saja.
1#!/usr/bin/env ruby23target_image = ARGV[0].strip4request      = ARGV[1]&.strip56ARGV.clear78# mount & unmount method9def mount_process(request, target_image)10  username     = `echo $USER`&.strip11  target_path  = "/run/media/#{username}"12  target_label = `file '#{target_image}' | cut -d \\\' -f2`&.strip13  if request == 'm'14    system "15    if [[ ! -d #{target_path}/#{target_label} ]]; then16      sudo mkdir -p #{target_path}/#{target_label}17      sudo mount -l -o loop '#{target_image}' #{target_path}/#{target_label} 1> /dev/null 2>&118      echo '=> MOUNTED on #{target_path}/#{target_label}'19    elif [[ -d #{target_path}/#{target_label} ]]; then20      sudo mount -l -o loop '#{target_image}' #{target_path}/#{target_label} 1> /dev/null 2>&121      echo '=> MOUNTED on #{target_path}/#{target_label}'22    else23      echo '=> WAS MOUNTED'24    fi25    "26  elsif request == 'u'27    system "28    if [[ -d #{target_path}/#{target_label} ]];29    then30      sudo umount '#{target_image}'31      sudo rm -rf #{target_path}/#{target_label}32      echo '=> UNMOUNTED'33    else34      echo '=> NOT MOUNTED'35    fi36    "37  else38    puts '=> WRONG REQUEST'39    exit40  end41end4243# interface44begin45  if request46    mount_process(request, target_image)47  elsif target_image48    puts "49  Options:5051    press m for mount52    press u for unmount53    "54    print '=> '55    request = gets.chomp5657    mount_process(request, target_image)58  else59    puts "60  => YOU SHOULD ADD IMAGE AS ATTRIBUTE6162  Example:6364    $ imagemounter <image_name.iso>    (interactive)6566    OR6768    $ imagemounter <image_name.iso> m  (mounting)69    $ imagemounter <image_name.iso> u  (unmount)70    "71    exit72  end73rescue Interrupt74  puts "\b" * 2 + 'Exit...'75  exit76endOutput
$ isomounter archlinux.iso
Options:
  press m for mount
  press u for unmount
=> m
=> MOUNTED on /run/media/bandithijo/ARCH_202010
$ isomounter archlinux.iso
Options:
  press m for mount
  press u for unmount
=> u
=> UNMOUNTED
Kekurangan
Kekurangan terbesar dari Ruby wrapper script ini adalah proses dari script ini memerlukan hak akses root.
Karena terdapat perintah mkdir untuk membuat direktori di alamat /run/media/<username>/, serta mount ke alamat tersebut juga memerlukan hak akses root sehingga mau tidak mau, kita harus menggunakan sudo.
Alternatif (Recommended)
1. Memanfaatkan Udisks2
Kalau proses mount memerlukan hak akses root, kita dapat memanfaatkan udisks2 (udisksctl) –baca tentang udisks.
Selain untuk Disk/Drive, Udisks juga dapat kita gunakan untuk melakukan mount & unmount file ISO.
Sebelumnya, kita samakan persepsi dulu yaa.
NAME
loop0        ← disebut block_devices
├─loop0p1    ← disebut block_partition
└─loop0p2    ← disebut block_partition
Mount file ISO
Sekenario untuk proses mount dengan udiskctl, adalah:
- Setup loop block device dengan 
loop-setup -p - Mounting block partition dengan 
mount -p 
1. Setup loop block device dengan loop-setup
$ udisksctl loop-setup -f file_image.iso
$ udisksctl loop-setup -f archlinux.iso
$ lsblk
NAME      FSTYPE    SIZE TYPE LABEL       MOUNTPOINT
loop0     iso9660   681M loop ARCH_202010
├─loop0p1 iso9660   681M part ARCH_202010
└─loop0p2 vfat       56M part ARCHISO_EFI
Terlihat bahwa hasil yang diberikan berbeda dengan perintah mount biasa.
Pada konidisi ini, label dari ARCH_202010 sudah muncul di File Manager GUI, namun belum dimount.
Proses ini mirip saat kita melakukan, klik kanan pada ISO image dan memilih menu “Open With Disk Image Mounter (Nautilus)”.
Bisa langsung diklik untuk mount.
2. Mounting block partition dengan mount
Atau, kalau kita tidak ingin membuka file manager, atau tidak memiliki aplikasi file manager GUI, kita juga dapat menggunakan udisksctl saja untuk melakukan proses mounting.
$ udisksctl mount -p block_devices/block_partition
$ udisksctl mount -p block_devices/loop0p1
$ lsblk
NAME      FSTYPE    SIZE TYPE LABEL       MOUNTPOINT
loop0     iso9660   681M loop ARCH_202010
├─loop0p1 iso9660   681M part ARCH_202010 /run/media/bandithijo/ARCH_202010
└─loop0p2 vfat       56M part ARCHISO_EFI
Maka, udisks secara otomatis membuat mount point ke path tersebut.
Unmount File ISO
Sekenario yang sama berlaku untuk proses unount, namun kebalikan dari proses mount.
- Unmounting block partition dengan 
unmount -p - Delete loop block device dengan 
loop-delete -b 
1. Unmounting block partition dengan unmount
$ udisksctl unmount -p block_devices/block_partition
$ udisksctl unmount -p block_devices/loop0p1
Pilih block partition yang memiliki mount point.
$ lsblk
NAME      FSTYPE    SIZE TYPE LABEL       MOUNTPOINT
loop0     iso9660   681M loop ARCH_202010
├─loop0p1 iso9660   681M part ARCH_202010
└─loop0p2 vfat       56M part ARCHISO_EFI
Terlihat bahwa loop0p1 sudah tidak lagi memiliki mount point.
2. Delete loop block device dengan loop-delete
Sekarang tinggal melepaskan block device loop0.
Dengan cara.
$ udisksctl loop-delete -b block_devices/block_device
$ udisksctl loop-delete -b block_devices/loop0
2. Memanfaatkan Udiskie
Udiskie adalah udisks2 front-end yang ditulis dengan bahasa Python.
Tujuan dari dibuatnya udiskie adalah untuk mengautomatisasi proses mount removable media, seperti CD atau flash drive.
Saat ini, udiskie belum dapat digunakan untuk memounting file ISO.
Link repo: coldfix/udiskie.
3. Memanfaatkan udiskie-dmenu
Udiskie-dmenu adalah front-end dari udiskie yang menggunakan dmenu sebagai interfacenya.
Link repo: fogine/udiskie-dmenu.
Pesan Penulis
Sepertinya, segini dulu yang dapat saya tuliskan.
Mudah-mudahan dapat bermanfaat.
Terima kasih.
(^_^)
Referensi
- linuxize.com/post/how-to-mount-iso-file-on-linux/
Diakses tanggal: 2020/10/22