Sejak peluncuran Steam Deck pada tahun 2022, para pengguna telah menikmati portabilitas gaming berbasis Linux. Seiring perkembangan sistem, berbagai peningkatan di balik layar terus dilakukan. Artikel ini membahas tentang pembaruan sistem dengan fokus pada tantangan yang dihadapi dan bagaimana solusinya.
SteamOS menggunakan skema partisi A/B untuk pembaruan sistemnya. Tata letak ini berarti memelihara dua partisi terpisah, A dan B, di mana partisi utama menyimpan sistem operasi saat ini dan partisi sekunder dicadangkan untuk pembaruan sistem. Gambar OS aktual bersifat atomik dan diterapkan menggunakan RAUC dan Casync.
Sistem ini bekerja dengan sangat baik. Saat menerbitkan gambar baru, kami dapat memastikan bahwa semua pengguna akhir akan menerima pembaruan yang persis sama, bahkan jika mereka menonaktifkan bendera read-only dan mengedit beberapa file (komplikasi muncul dengan file di /etc dan /var yang tidak tidak berubah, tetapi itu cerita untuk lain waktu).
Namun, kami mengidentifikasi beberapa poin utama yang dapat ditingkatkan di Casync:
Menghitung seed gambar saat ini dilakukan dengan cepat dan merupakan operasi single-thread. Pada Steam Deck, ini biasanya berarti bahwa ketika Anda menekan tombol “terapkan pembaruan”, hampir satu menit penuh dihabiskan untuk membagi dan melakukan hash seluruh gambar yang sedang digunakan, dengan satu inti CPU pada penggunaan 100%.
Mengingat cara kerja Casync, memperkirakan ukuran unduhan pada perangkat memerlukan penggunaan CPU satu menit yang sama.
Casync tidak mengizinkan beberapa operasi HTTP(S) GET paralel, setidaknya tidak tanpa menerapkan patch downstream. Bahkan setelah menulis ulang logika unduhan untuk menggunakan curl multi, masih ada keinginan untuk meningkatkan waktu keseluruhan yang diperlukan untuk menerapkan pembaruan sistem.
Jika unduhan terputus, upaya berikutnya akan dimulai kembali dari awal. Hal ini dapat dihindari dengan juga menggunakan tujuan sebagai seed, dengan mengorbankan dua kali lipat jumlah waktu yang dihabiskan pada fase “persiapan”.
Rilis publik terbaru Casync adalah pada tahun 2017 dan, meskipun belum resmi, rasanya pengembangan terhenti. Beberapa patch yang kami tulis di masa lalu masih dibiarkan sebagai PR terbuka tanpa daya tarik apa pun dari pengelola (ini terjadi pada tahun 2021).
Pada titik itu pilihan kami pada dasarnya adalah sebagai berikut:
- Mencari pengganti drop-in untuk Casync yang mengatasi kekurangan yang disebutkan di atas.
- Memberikan patch tambahan untuk meningkatkan Casync, meskipun semua patch tersebut kemungkinan besar hanya akan berakhir di downstream.
- Ganti Casync dengan alat yang berbeda sama sekali.
Pilihan ketiga hanya merupakan tindakan terakhir karena itu akan memerlukan penandaan titik pemisah antara gambar lama dan baru. Artinya pengguna akhir harus melalui dua pembaruan sistem back to back di luar kotak, setidaknya sampai pabrik mulai memproduksi Steam Deck baru dengan gambar dasar yang melewati titik pemisah itu.
Untungnya kami menemukan Desync, yang merupakan implementasi ulang dari sebagian besar Casync, dan memastikan untuk menjadi pengganti drop-in Casync dalam “banyak kasus penggunaan”. Proyek ini sedang dalam pengembangan aktif dan, yang terpenting, ada beberapa poin penjualan menarik di README proyek, seperti dukungan beberapa permintaan HTTP(S) paralel dan chunking multi-threaded.
Setelah beberapa evaluasi yang cermat, kami memutuskan bahwa beralih ke Desync pada akhirnya akan membawa beberapa peningkatan.
Patch Upstream untuk Desync
Sebelum menyebutkan apa saja manfaat utama yang dibawa Desync, kita harus membicarakan tentang pekerjaan yang diperlukan bagi kita untuk benar-benar melakukan peralihan.
Seperti yang disebutkan sebelumnya, Desync adalah pengganti drop-in untuk Casync dalam “banyak kasus penggunaan”. Meskipun pasti memungkinkan Anda untuk menginstal pembaruan sistem yang dibuat dengan Casync dan sebaliknya, ada beberapa perbedaan utama dalam cara mereka menerapkan pembaruan yang memerlukan jumlah pekerjaan yang tidak sepele.
Peningkatan utama yang harus kami lakukan adalah:
- Seed diperlakukan berbeda dibandingkan dengan Casync. Mengingat bahwa dengan pengguna Steam Deck diizinkan untuk menonaktifkan mode read-only, kami tidak memiliki jaminan bahwa file indeks yang telah dihitung sebelumnya Desync untuk seed akan benar. Untuk alasan ini kami harus menerapkan “rencana” yang telah ditentukan sebelumnya tentang cara menyusun pembaruan, opsi untuk meregenerasi indeks seed yang tidak valid, memvalidasi apa yang telah ditulis saat mengambil potongan dari seed, dan berusaha lebih keras jika potongan seed tidak valid.
- Gambar tidak terletak di jalur URL tunggal, jadi kami harus menyertakan dukungan untuk pola glob dalam file konfigurasi.
- Tambahkan kemampuan untuk memperkirakan ukuran unduhan pembaruan dengan cepat.
- Tambahkan dukungan Desync di RAUC.
Manfaat Aktual
Setelah semua pekerjaan ini, apa manfaat nyata bagi pengguna akhir?
Sekarang secara signifikan lebih cepat untuk menerapkan pembaruan sistem. Seberapa “cepat” sangat tergantung pada ukuran pembaruan dan kecepatan koneksi Internet. Dari pengujian kami, biasanya proses pembaruan keseluruhan secara konsisten setidaknya 30%-50% lebih cepat.
Jika unduhan pembaruan gagal di tengah jalan, mis. jika ada kesalahan koneksi, upaya unduhan kedua akan dapat melanjutkan dengan cepat dari titik yang dicapai sebelumnya.
Persentase kemajuan unduhan lebih tepat dan lebih sering disegarkan.
Ini memungkinkan kami untuk dengan cepat memeriksa apakah gambar saat ini asli atau telah diubah. Berguna misalnya selama operasi reset pabrik untuk menghindari keharusan mengunduh gambar dari Internet kecuali diperlukan.
Menjelaskan dasar untuk memungkinkan di masa mendatang kemampuan bagi klien untuk memperkirakan ukuran unduhan pembaruan sistem dengan cepat.
Kapan Saya Dapat Mencobanya?
Sekarang juga! Perubahan ini telah disertakan dalam SteamOS 3.6, yang saat ini berada di saluran “Pratinjau”. Anda dapat memilih ikut serta dari Pengaturan > Sistem > Saluran Pembaruan Steam.
Harap dicatat bahwa saluran Pratinjau menyertakan fitur baru yang masih diuji, sehingga Anda mungkin mengalami masalah.