Jurnal Linuxku: Error lagi ketika upgrade Arch Linux

Pagi ini, aku mau melakukan upgrade Arch Linux, sekalian mau isi baterainya. Aku belajar dari pengalaman sebelumnya, biar gak mati di tengah upgrade. Nah.., waktu itu aku melakukan upgrade, ternyata muncul file yang konflik. Kondisi ini tidak biasa, apalagi jumlah file yang mengalami konflik itu banyak. Haruskah file-file itu dihapus langsung? Apa langkah yang harus ditempuh?

Tentu saja, kita melakukan pencarian pemecahannya di Google. Menurut Google, sebetulnya masalah itu sederhana, bahkan Gemini atau kecerdasan buatan yang dibuat oleh Google dapat menjawabnya dengan mudah. Jadi aku memasukkan kata kuncinya "error: failed to commit transaction (conflicting files)", karena output dari Pacman sebagai package manager dari Arch Linux seperti itu. Jawaban dari Google adalah terdapat konflik file dan Pacman memiliki karakteristik untuk tidak melakukan overwrite atau menimpa file yang sudah ada. Tujuan dari karakter Pacman yang seperti ini adalah untuk menghindari kehilangan data atau ketidakstabilan sistem.

Penyebab umum terjadinya masalah ini adalah karena adanya penginstallan secara manual tanpa menggunakan manajer paket, penggunaan manajer paket pihak ketiga (misalnya pip, anaconda atau miniconda, make)1 yang dampaknya meletakkan file yang digunakan software ke dalam direktori sistem; sehingga rawan konflik, paket AUR yang konflik dengan paket repositori resmi dan paket meta data yang korup. Lantas bagaimana solusi untuk menyelesaikan permasalahan ini?

Berdasarkan pengalamanku pagi ini, aku melakukan setidaknya 3 hal. Pertama, aku melakukan identifikasi file dan paket yang berkonflik. Kedua, aku melakukan penanganan terhadap file dan paket yang berkonflik itu. Ketiga melakukan upgrade sistem.

  1. Identifikasi file dan paket yang berkonflik, dapat dilakukan dari pesan yang keluar. Pesan tersebut berisi error dan daftar file yang berkonflik. Setelah itu, pada setiap file yang berkonflik itu dilakukan pemeriksaan dengan cara mengetikkan pada terminal perintah ini: sudo pacman -Qo /path/to/file.
  2. Memberikan tindakan pada file-file tersebut. Jika file-file tersebut tidak berhubungan apapun dengan paket manapun, maka dapat dilakukan penghapusan secara manual. Sebaliknya, apabila file-file tersebut berhubungan dengan paket tertentu, maka penghapusan secara manual dapat membuat sistem tidak stabil.
  3. Melakukan upgrade sistem.

Kondisi yang aku alami adalah file yang berkonflik cukup banyak, sehingga memasukkan perintah satu per satu untuk menghapusnya memakan waktu. Selain itu, output layar dari terminal tidak hanya menyebutkan direktori file, juga menyebutkan kata-kata lain. Akibat dari kondisi itu ekstraksi data direktori file cukup menantang untuk dilakukan. Isi file errornya seperti ini:

linux-firmware-intel: /usr/lib/firmware/e100/d101m_ucode.bin.zst exists in filesystem
linux-firmware-intel: /usr/lib/firmware/e100/d101s_ucode.bin.zst exists in filesystem
linux-firmware-intel: /usr/lib/firmware/e100/d102e_ucode.bin.zst exists in filesystem
linux-firmware-intel: /usr/lib/firmware/hfi1_dc8051.fw.zst exists in filesystem
...

Bagian yang kita perlukan adalah cukup direktorinya. Seandainya hanya ada 3 baris saja, tindakan menghapus tulisan yang tidak diperlukan secara manual dapat dilakukan. Aku menggunakan skrip Python untuk mengekstrak direktori dan melakukan editing atau pembuatan skrip bash untuk memudahkan eksekusi perintahnya.

Mengekstrak direktori dan membuat skrip bash dengan Python

Ide ini muncul dari pengalamanku dalam melakukan pengolahan data yang menggunakan Python. Seingatku, kurang lebih terdapat sekitar 200 titik yang perlu diolah. Untuk menyelesaikan permasalahan ini, aku mencari inspirasi dari Gemini yang selanjutnya aku edit dan sesuaikan. Skrip Python yang aku pakai sebagai berikut.

import os

#Deklarasi variabel dan pengisian nilai dari variabel
file_path = "pesanerror"
target_directory = None
store = []
pekmen = "sudo pacman -Qo "
remove = "sudo rm "
addedlist = []
addedlist1 = []

#Membuka file dan memasukkan file direktori dalam list
try:
    with open(file_path, 'r') as f:
        for line in f:
            if "linux-firmware-intel: " in line:
                target_directory = line.split()[1]
                store.append(target_dirctory)
except FileNotFoundError:
    print(f"Error: The file'{file_path}' was not found.")
except Exception as e:
    print(f"An error occurred: {e}")

#Proses manipulasi
for item in store:
    addedlist.append(pekmen + item)
    addedlist1.append(remove + item)

#Ekspor file untuk pemeriksaan paket
with open("pacman_directory_check.sh", "w") as file:
    file.write("#!/bin/bash" + "\n")
    for item in addedlist:
        file.write(item + "\n")

#Ekspor file untuk penghapusan file
with open("hapus_directory.sh", "w") as file:
    file.write("#!/bin/bash" + "\n")
    for item in addedlist1:
        file.write(item + "\n")

Pada skrip tersebut, aku merasa yakin bahwa file itu tidak ada hubungan dengan paket manapun, setelah mencoba satu directori dan memberikan output seperti ini:

error: No package owns /path/to/file

Kemungkinan besar, file lain juga memberikan yang sama. Setelah script bash dijalankan, ternyata memberikan output yang sama. Langkah berikutnya dilakukan penghapusan dengan skrip bash hasil keluaran skrip python itu dan upgrade seperti biasa.

Itu saja yang bisa saya sampaikan, terima kasih sudah menyimak dan membaca sampai selesai. Semoga bisa bermanfaat buatmu.


  1. File berkonflik yang disebabkan oleh penggunaan manajer paket pihak ketiga jarang terjadi. Sebab manajer paket pihak ketiga selalu meminta mendefinisikan di mana mau diletakkan program atau environment dan menghindari penggunaan direktori sistem. 

0 comments: