Menyelamatkan Sistem Setelah rm -vr /usr

  •  02 Jul 2017
  •   Linux  

Shit happens.
Alkisah, kemarin ketika saya sedang menuangkan ide membandingkan kecepatan HDD, SSD, dan RAM disk ke dalam tulisan untuk blog, shit happens. Sebagai pendukung artikel, saya mengadakan pengukuran kecepatan secara sederhana dengan cara menguraikan (extracting) map /usr dari berkas ISO Ubuntu 17.04 ke HDD, SSD, dan RAM disk untuk kemudian dilakukan pengukuran seek time.

Secara garis besar berikut urutan pengukurannya:

  • Uraikan map usr dari berkas ISO ke HDD, SSD, atau RAM disk 
  • Pindah ke direktori di mana map usr hasil uraian berada
  • Lakukan pengukuran menggunakan perintah berikut

    # find usr/ -type f -printf "%s %p\n" | sort -R | awk '{ printf $2; printf "\n" }' > /sort  
    # time cpio -o --quiet -H newc < /sort > /dev/null
  • Selesai pengukuran, map usr pun dihapus.
Pengukuran kecepatan RAM disk saya lakukan di /tmp karena kebetulan ia dikaitkan ke tmpfs yang adalah RAM disk. Pengukuran berjalan lancar dan dilanjutkan ke pengukuran kecepatan HDD dengan cara mengurai usr ke HDD external. Ini juga berjalan lancar.
Yang terakhir, mengukur kecepatan SSD dengan cara mengurai map usr ke /opt. Pengukurannya berjalan lancar. But, have I told you that's shit happens? Yeah, the shit happens. Fast. Biang keroknya adalah ketika menghapus map usr saya bukannya menggunakan perintah rm -vr usr melainkan rm -vr /usr!.
Lihat bagaimana beda usr dan /usr? That's when the real shit happens. In pronto.
Alih-alih menghapus map usr yang berada dalam direktori yang sama, saya malah menghapus map /usr. Prosesnya berlangsung sangat cepat, as fast as flipping state on SSD.

...

Shocking.
Keep calm they say.

Setelah termenung berusaha mencerna apa yang sedang terjadi, saya berusaha tetap tenang. Yang pertama terlintas tentu saja apakah data selamat. Sistem boleh raib, tapi data jangan sampai.
Untungnya, sebagai orang Indonesia yang selalu beruntung, tidak ada folder lain yang terkait dengan /usr jadi data yang terletak di /home aman. Anda yang dihapus adalah /media bisa lain cerita, soalnya HDD external dikaitkan di sana.
OK, data aman. Apa langkah selanjutnya? Teringat katanya jika berkas yang dihapus sebenarnya tidak benar-benar dihilangkan dari diska, melainkan hanya diputus "penghubungnya" dan ada kemungkinan akses ke node yang dihapus ini masih ada dalam sistem dan bisa dipulihkan. Sialnya cara tersebut hanya bisa jika kita menghapus suatu berkas sementarea berkas tersebut sedang diubuka oleh suatu aplikasi, sementara isi /usr ini hanya biner yang tidak dibuka suatu aplikasi, malah isinya adalah aplikasi yang membuka berkas lain.

Thing is getting worse.
Semua aplikasi lenyap. Desktop kosong, bahkan tulisan pun tidak tampak. Tapi Firefox dan Telegram masih bisa terhubung ke internet, mungkin karena cached.
Well, I'm A Linuxer. Tiada GUI bukanlah masalah. Mari kita coba recovery melalui tty.

Apa yang lebih sial dari sial?
Yes, I can switch to tty. Tapi internet kemudian mati, hendak balik ke GUI pun tidak bisa. Yang tersisa hanya bash dan cp, mungkin karena mereka terletak di /bin.

Beruntung lagi, HDD external selepas pengujian tidak langsung dicabut, jadi masih bisa diakses. Kebetulan di dalamnya ada backup root system, walau sudah lama tidak synced. Rencananya saya akan salin isi /usr backup ke /usr dan reinstall semua paket.

Baiklah kita buat daftar seluruh paket yang terpasang dulu.
sudo dpkg --clear-selections
sudo dpkg --get-selections > /installed
Salin map usr dari backup ke root system (/):
sudo cp -a /media/iza/DATA/backup/sid/usr /usr
Reinstall paket-paket tersebut:
sudo dpkg --set-selection < /installed
Oh. My. Fukin. Shit.
Nothing happens. Well, actually, more shit happens.

OK, mari coba cara lain. Gunakan aptitude untuk mendaftar seluruh paket yang terpasang.
sudo aptitude search -F '%p' '~i ~M' > /installed
Install ulang paket-paket tersebut.
while read IFS= read -r paket; do sudo aptitude reinstall $paket; done < <(echo $(</installed))
Selesai reinstall, komputer pun rebooted.
Aaahh... In the name of lord of the shit, sistem macet selepas GRUB.
Dari log terlihat systemd gagal menjalankan NetworManager dan ModemManager. OK, ga masalah. Mungkin sebaiknya disabled saja dulu, yang penting asal bisa login. Internet bisa menyusul.
Komputer pun rebooted. Sunting entri kernel dengan menambahkan string single agar bisa  boot ke recovery mode. Setelah masuk recovery mode, NetworkManager dan ModemManager pun dimatikan.
systemctl disable NetworkManager.service
systemctl disable ModemManager.service
Komputer rebooted. Nah, sekarang tidak ada error soal network dan modem. Tapi ujung-ujungnya macet juga. Kali ini terlihat soal policy atau apalah. I hate this shit.

Okeeeee.... Kita coba cara lain. Kali ini pindahkan isi root system kecuali /home dan salin semua backup untuk kemudian upgraded. Cara ini tidak bisa dari partisi yang sedang dipakai (online), jadi harus dilakukan melalui live environment. No problem. Mari kita boot LiveDVD Ubuntu 17.04 dan jalankan rencana dari sana.

Live environment Ubuntu 17.04 is up and running. Saatnya memindahkan isi root partition Sid ke map sementara.
Pertama, pindahkan semua direktori kecuali /home ke map sementara. Karena boot ISO dari HDD, saya tidak perlu mengaitkan partisi sistem Sid karena ia telah mounted di direktori /isodevice live Ubuntu.
sudo mkdir /isodevice/OLD
sudo rsync -aAXvh /isodevice/{bin,boot,dev,etc,initrd.img,initrd.img.old,lib,lib64,media,mnt,opt,proc,root,run,sbin,srv,sys,tmp,usr,var,vmlinuz,vmlinuz.old} /isodevice/OLD
/home tidak dipindahkan karena ia berisi banyak data dan "mengkhawatirkan" jika dipindah.
Saatnya menyalin isi backup.
sudo rsync -aAXvh --progress --exclude=home /media/ubuntu/DATA/backup/sid /isodevice
OK. Done. Lets reboot.
...
Alhamdulillah. Rejeki jalma sabar dibarung jembar ku panalar, akhirnya bisa login juga.

Demikian saya cukupkan sampai di sini ceritanya. Soal update, upgrade, pengaturan ulang setelan desktop dan lainnya tidak akan saya ceritakan.
Intinya, hati-hati dalam menjalankan perintah sebagai root, jangan lupa backup, backup secara rutin, dan pastikan backup bekerja dengan baik.

Semoga artikel ini ada faedahnya. Maaf jika bahasanya acakadut, maklum masih lelah. Urutan kejadian yang dikisahkan di atas juga hanya ditulis berdasar ingatan, senyatanya lebih repot daripada yang ditulis.
Permiosss...