Untuk Tujuan Pembelajaran Sahaja

Dari semasa ke semasa, saya menyemak tatacara yang masih relevan dalam pemasangan distribusi atau sistem operasi seperti Arch. Jika terdapat sebarang perubahan, mestilah dikemaskini maklumat dan perkembangannya.

Terbaharu, saya dapati terdapat sedikit isu dalam penggunaan arch-chroot. Arahan lsblk dengan opsyen output seperti ‘FSTYPE, UUID dan LABEL’ tidak memaparkan tanda-tanda atau maklumat blok yang ada. Begini gambarannya:-

Barangkali, adanya pepijat (bugs) dalam arch-chroot yang terkini sehingga menyebabkan fail sistem (API filesystems) yang diperlukan tidak lagi mounted secara automatik.

Maka saya usahakan mencari cara yang lebih mudah dan cepat sebagai eksperimen untuk menggantikannya dengan chroot tanpa perlu boot LIVE CD atau sebarang VM.

Caranya adalah dengan mencipta blok dami (dummy) melalui peranti loop.

Amaran: Di dalam situasi sebenar, pemasangan GRUB pada partition ESP akan menemui kegagalan dengan cara chroot di bawah. arch-chroot semula untuk tujuan ini.

Sebagai root:

  1. Buat imej RAW disk bersaiz 2.5 GiB (pemasangan asas sistem Arch Linux memakan kurang daripada 2 GiB ruang cakera):

    bash
    dd if=/dev/zero of=disk.img bs=256M count=10
    10+0 records in
    10+0 records out
    2684354560 bytes (2.7 GB, 2.5 GiB) copied, 2.73313 s, 982 MB/s 
    
  2. Gunakan perintah losetup untuk set up peranti loop dari imej yang terhasil di atas:

    bash
    losetup -f --show disk.img
    dev/loop0 (contoh output) 
    
  3. Format blok ini (berdasarkan output peranti loop daripada arahan #2 di atas):

    bash
    mkfs.ext4 -L TEST /dev/loop0
  4. Mount ke direktori yang dihajati e.g. /mnt/tmp (opsyen -m adalah untuk mencipta direktori berkenaan sekiranya belum ada):

    bash
    mount -m /dev/loop0 /mnt/tmp
  5. Pasang pakej asas melalui pacstrap:

    bash
    pacstrap -K /mnt/tmp base
  6. cd ke dalam direktori dan mount sistem fail API yang diperlukan:

    bash
    cd /mnt/tmp
    mount -t proc /proc proc/
    mount -t sysfs /sys sys/
    mount -o bind /dev dev/
    mount -o bind /run run/
  7. Chroot:

    bash
    chroot /mnt/tmp /bin/bash
  8. Jalankan perintah lsblk sebagaimana sebelumnya:

    bash
    lsblk -o NAME,FSTYPE,SIZE,UUID,LABEL,MOUNTPOINTS
    Maklumat (tags) blok loop seperti 'FSTYPE,UUID dan LABEL' kini terpapar.
  9. Keluar dari chroot, unmount (--lazy), dan pisahkan (detach) peranti loop ini:

    bash
    exit
    umount -l /mnt/tmp
    losetup -d /dev/loop0
  10. Selesai.


Dengan Btrfs

Oh ya, memandangkan saya menggunakan sistem fail Btrfs, saya boleh cipta subvolume baru dan mount-nya dalam usaha untuk memperolehi matlamat yang sama sebagaimana di atas.

Menggunakan mountpoint yang sama yakni (/mnt/tmp):

  • Mount root partition (e.g. /dev/mapper/cryptarch, iaitu peranti blok LUKS yang menempatkan sistem hos Arch saya ini);

    bash
    mount -o defaults,compress=zstd,ssd /dev/mapper/cryptarch /mnt/tmp
  • Tambah subvolume btrfs e.g. @dummy_arch;

    bash
    btrfs subvolume c /mnt/tmp/@dummy_arch
  • (Optional) seandainya rajin, buat direktori /var/lib serta tambahkan subvolume machines dan portables;

    bash
    mkdir -p /mnt/tmp/@dummy_arch/var/lib
    btrfs subvolume c /mnt/tmp/@dummy_arch/var/lib/machines
    btrfs subvolume c /mnt/tmp/@dummy_arch/var/lib/portables

    Hal ini adalah untuk mengelakkan daripada serabut mata melihatkan ralat di bawah selepas melaksanakan perintah pacstrap nanti (walaubagaimanapun pepijat systemd ini selamat untuk dibiarkan berdasarkan bacaan saya);

    Failed to adjust quota for subvolume "/var/lib/portables": Bad file descriptor 
    Failed to adjust quota for subvolume "/var/lib/machines": Bad file descriptor
  • Unmount kembali root partitition sebelum langkah seterusnya;

    bash
    umount /mnt/tmp
  • Mount subvolume yang dicipta tadi (baris kedua dan ketiga adalah pilihan, seandainya langkah optional yang diterangkan di atas diaplikasikan).

    bash
    mount -o defaults,compress=zstd,ssd,subvol=@dummy_arch /dev/mapper/cryptarch /mnt/tmp
    mount -o defaults,compress=zstd,ssd,subvol=@dummy_arch/var/lib/machines /dev/mapper/cryptarch /mnt/tmp/var/lib/machines
    mount -o defaults,compress=zstd,ssd,subvol=@dummy_arch/var/lib/portables /dev/mapper/cryptarch /mnt/tmp/var/lib/portables 
  • Ulangi langkah bernombor 5 sehingga 8 dari penerangan tentang RAW disk di atas.

  • Apabila selesai, keluar dari chroot dan unmount (--lazy):

    bash
    exit
    umount -l /mnt/tmp
  • Jikalau tidak ingin menyimpan subvolume ini lagi dan mahu membuangnya, dapatkan senarai kesemua subvolumes yang berkaitan (i.e. @dummy_arch):

    bash
    btrfs subvolume l /
    # Sampel pengeluaran:
    ID 933 gen 291364 top level 5 path @dummy_arch
    ID 934 gen 291359 top level 933 path @dummy_arch/var/lib/portables 
    ID 935 gen 291360 top level 933 path @dummy_arch/var/lib/machines
    
  • Padam subvolumes tersebut melalui ID masing-masing:

    bash
    btrfs subvolume d -i subvolume_ID /

    Berbanding dengan menggunakan nama (laluan) subvolume i.e. @dummy_arch, kaedah ini dapat mengelakkan ralat yang memaparkan bahawa subvolume ini tidak wujud.

    ERROR: Could not statfs: No such file or directory 
    

    Misalannya dengan mengambil ID subvolume utama daripada output arahan di atas:

    bash
    btrfs subvolume d -i 933 /
    Delete subvolume (no-commit): '//@dummy_arch'
    ERROR: Could not destroy subvolume/snapshot: Directory not empty 
    

    Ralat ini terjadi adalah kerana subvolume @dummy_arch berkenaan mempunyai fail / direktori lain di dalamnya.

    Oleh yang demikian, pastikan memadam kandungan-kandungan ini terlebih dahulu sebelum membuang subvolume utama.

    bash
    btrfs subvolume d -i 935 /
    Delete subvolume (no-commit): '//@dummy_arch/var/lib/machines' 
    
  • Selesai.


Kali terakhir dikemaskini:

Tentang Blog & Penulis

Topik perbincangan dalam blog ini merangkumi Linux & perisian sumber terbuka, Virtual Machine, serta Typesetting system.
Fokus semasa: Full Stack Development
Minat sampingan: Analisis Data
Bakat tersembunyi hamba: Menyanyi dan melukis.