Switch Boot Berbasis Pico: Pilih OS Anda Sebelum Menyalakan
Pilih OS yang akan boot, bahkan sebelum menyalakan komputer dengan mengubah saklar. Sekarang Anda tidak perlu menunggu untuk memilih os.
Cerita
Melayani Hackaday.io untuk proyek, saya menemukan proyek ini(klik) oleh Stephen Holdaway. Dalam proyek ini, ia telah menyelesaikan tugas yang mengganggu dihadapi oleh setiap pengguna dual boot, yaitu duduk dan menunggu untuk memilih os (Windows) dari menu GRUB setiap kali kita ingin beralih ke windows. Ia berhasil menambahkan saklar hardware untuk menentukan OS yang akan boot setiap kali komputer dihidupkan.
Ia mencapai ini dengan mengonfigurasi Mikrokontroler STM32 sebagai perangkat mass-storage USB. Ia telah mendokumentasikan perjalanannya melalui penelitian dan implementasi proyek dalam posting hackaday(klik). Silakan melalui postingnya untuk mendapatkan pemahaman yang lebih baik tentang implementasi.
Dalam proyek ini, saya akan menunjukkan bagaimana saya berhasil mem-port perubahan ke Raspberry Pi Pico. Anda dapat menemukan versi saya di Repo GitHub ini (Klik).
Konsep
GNU GRUB adalah program yang berjalan sebelum Sistem Operasi apa pun dimuat. Melalui menu ini, kita dapat memilih OS mana yang akan dimuat. GRUB menawarkan modul yang sangat terbatas untuk bekerja. Ini berarti ia tidak dapat membaca data dari mikrokontroler yang terhubung melalui USB. Tetapi ia dapat membaca data dari disk penyimpanan.
Jadi kita dapat menipu GRUB untuk membaca data dari mikrokontroler, dengan meng- enumerate mikrokontroler kami sebagai perangkat mass-storage.
Hence we enumerate our raspberry pi pico as a mass-storage device, via tinyUSB library, which will be having a file switch.cfg file, to which pico will write the switch position i.e 1 for ON 0 for OFF.
We have to add a script in GRUB, that’s functions to read switch.cfg file and set the default to 0(Ubuntu )/2(Windows).
GRUB when loads, runs our custom scripts, which in turn searches for our device by its UUID identifiers, and if exits read the switch.cfg file. After getting the switch position it sets the default os selection respectively.
In summary,
pico will configure itself as a mass-storage device.
grub menu calls our script and asks for the particular file.
Pico responds to the read request by adding the switch position in the switch.cfg file.
the script in grub extracts the info from the file and sets the default option from the extracted data.
Mengonfigurasi Pico sebagai Perangkat Mass-storage
Saya telah menggunakan contoh cdc_msc oleh tinyUSB untuk mencapai ini. Contoh ini mengonfigurasi pico sebagai perangkat mass-storage dan membuat sistem berkas FAT12 serta meng-enumerate file README.txt.
Saya mengubah README.txt menjadi switch.cfg dan menambahkan baris “set os_hw_switch=0\n” ke dalam file.
Sekarang kita telah mengonfigurasi pico sebagai perangkat mass-storage. Setelah menyalin file uf2 ke pico, ia di-enumerate sebagai perangkat penyimpanan. Kita akan membutuhkan UUID id perangkat untuk skrip GRUB, yang adalah UUID=”0000-1234″.
//configure pin as INPUT gpio_set_dir(SWITCH_PIN, false);
//configure pin as PULL_DOWN gpio_set_pulls (SWITCH_PIN,false,true);
Untuk menulis posisi saklar ke switch.cfg, saya telah menggunakan readGRUBConfig() yang memanggil fungsi read_switch_value, dan mengatur output buffer dengan posisi saklar.
Saya menemukan saat membaca block3 lba diatur ke 3, sehingga menyadap panggilan dan memanggil readGrubConfig dan melewatkan buffer di mana isi file akan disalin.
Saya telah menambahkan perubahan ini di Ubuntu 20.10 saya.
$ sudo vim /etc/grub.d/40_custom
.... # Look for hardware switch device by its hard-coded filesystem ID search --no-floppy --fs-uuid --set hdswitch 0000-1234
# If found, read dynamic config file and select appropriate entry for each position if [ "${hdswitch}" ] ; then source ($hdswitch)/switch.cfg
if [ "${os_hw_switch}" == 0 ] ; then # Boot Linux set default="0" elif [ "${os_hw_switch}" == 1 ] ; then # Boot Windows set default="2" else # Fallback to default set default="${GRUB_DEFAULT}" fi
else set default="${GRUB_DEFAULT}" fi
Pertama, kita mencari sistem berkas kami. GRUB memiliki subcommand search hanya untuk ini.
-no-floppy option mencegah pencarian perangkat floppy
-fs–uuid 0000-1234 mencari sistem berkas dengan UUID 0000-1234.
Jika perangkat apa pun ditemukan, perangkat pertama yang ditemukan ditetapkan sebagai nilai variabel lingkungan.
–set hdswitchhdswitch adalah variabel lingkungan kami dan ditetapkan dengan nama disk jika ditemukan.
Selanjutnya, kita sourcing file switch.cfg jika variabel hdswitch diatur, yang menciptakan variabel lingkungan lain os_hw_switch dengan posisi saklar yaitu 0/1.
Kita membaca nilai dari os_hw_switch dan menetapkan default ke 0 atau 2 masing-masing. 0 karena Ubuntu berada di posisi ke-0 dan windows di posisi ke-2 dalam menu GRUB.
Terakhir, jika hdswitch tidak diatur, kita menetapkan default ke GRUB_DEFAULT.