Bab 3. Inisialisasi sistem

Daftar Isi

3.1. Ringkasan proses boot strap
3.1.1. Tahap 1: UEFI
3.1.2. Tahap 2: boot loader
3.1.3. Tahap 3: sistem mini-Debian
3.1.4. Tahap 4: sistem Debian normal
3.2. Systemd
3.2.1. Init systemd
3.2.2. Systemd login
3.3. Pesan kernel
3.4. Pesan sistem
3.5. Manajemen sistem
3.6. Pemantau sistem lainnya
3.7. System configuration
3.7.1. Nama host
3.7.2. Sistem berkas
3.7.3. Inisialisasi antarmuka jaringan
3.7.4. Cloud system initialization
3.7.5. Customization example to tweak sshd service
3.8. Sistem udev
3.9. Inisialisasi modul kernel

Adalah bijaksana bagi Anda sebagai administrator sistem untuk mengetahui kira-kira bagaimana sistem Debian dimulai dan dikonfigurasi. Meskipun rincian yang tepat ada di berkas sumber paket yang dipasang dan dokumentasinya, itu agak membuat kewalahan bagi kebanyakan dari kita.

Berikut adalah gambaran kasar dari poin-poin penting dari inisialisasi sistem Debian. Karena sistem Debian adalah target yang bergerak, Anda harus merujuk ke dokumentasi terbaru.

Sistem komputer mengalami beberapa fase proses boot strap dari peristiwa daya dinyalakan sampai menawarkan sistem operasi (OS) yang berfungsi penuh kepada pengguna.

Untuk kesederhanaan, saya membatasi diskusi ke platform PC umum dengan instalasi baku.

Proses boot strap yang umum itu seperti roket empat tahap. Setiap tahap roket menyerahkan kontrol sistem ke tahap berikutnya.

Tentu saja, ini dapat dikonfigurasi secara berbeda. Misalnya, jika Anda menyusun kernel Anda sendiri, Anda mungkin melewatkan langkah dengan sistem mini-Debian. Jadi tolong jangan berasumsi ini adalah kasus untuk sistem Anda sampai Anda memeriksanya sendiri.

Unified Extensible Firmware Interface (UEFI) mendefinisikan boot manager sebagai bagian dari spesifikasi UEFI. Ketika komputer dinyalakan, boot manager adalah tahap pertama dari proses boot yang memeriksa konfigurasi boot dan berdasarkan pengaturannya, kemudian mengeksekusi boot loader OS atau kernel sistem operasi yang ditentukan (biasanya boot loader). Konfigurasi boot didefinisikan oleh variabel yang disimpan dalam NVRAM, termasuk variabel yang menunjukkan path sistem berkas ke loader OS atau kernel OS.

EFI system partition (ESP) adalah partisi perangkat penyimpanan data yang digunakan dalam komputer yang mengikuti spesifikasi UEFI. Diakses oleh firmware UEFI ketika komputer dinyalakan, ia menyimpan aplikasi UEFI dan berkas-berkas yang perlu dijalankan aplikasi ini, termasuk boot loader sistem operasi. (Pada sistem PC warisan, BIOS yang disimpan dalam MBR dapat digunakan sebagai gantinya.)

Boot loader adalah tahap ke-2 dari proses boot yang dimulai oleh UEFI. Ini memuat image kernel sistem dan image initrd ke memori dan memindahkan kontrol kepada mereka. Image initrd ini adalah image sistem berkas root dan dukungannya tergantung pada bootloader yang digunakan.

Sistem Debian biasanya menggunakan kernel Linux sebagai kernel sistem baku. Image initrd untuk kernel Linux 5.x saat ini secara teknis adalah image initramfs (sistem berkas RAM awal).

Ada banyak boot loader dan opsi konfigurasi yang tersedia.


[Awas] Awas

Jangan bermain dengan boot loader tanpa media penyelamatan yang bisa di-boot (flash disk USB, CD, atau floppy) yang dibuat dari image dalam paket grub-rescue-pc. Itu membuat Anda mem-boot sistem Anda bahkan tanpa bootloader yang berfungsi pada hard disk.

Untuk sistem UEFI, GRUB2 terlebih dahulu membaca partisi ESP dan menggunakan UUID yang ditentukan untuk search.fs_uuid di "/boot/efi/EFI/debian/grub.cfg" untuk menentukan partisi berkas konfigurasi menu GRUB2 "/boot/grub/grub.cfg".

Bagian penting dari berkas konfigurasi menu GRUB2 terlihat seperti:

menuentry 'Debian GNU/Linux' ... {
        load_video
        insmod gzio
        insmod part_gpt
        insmod ext2
        search --no-floppy --fs-uuid --set=root fe3e1db5-6454-46d6-a14c-071208ebe4b1
        echo    'Loading Linux 5.10.0-6-amd64 ...'
        linux   /boot/vmlinuz-5.10.0-6-amd64 root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-5.10.0-6-amd64
}

Untuk bagian /boot/grub/grub.cfg ini, entri menu ini berarti sebagai berikut.


[Tip] Tip

Anda dapat mengaktifkan untuk melihat pesan log boot kernel dengan menghapus quiet di "/boot/grub/grub.cfg". Untuk perubahan terus-menerus, harap sunting baris "GRUB_CMDLINE_LINUX_DEFAULT="quiet"" di "/etc/default/grub".

[Tip] Tip

Anda dapat menyesuaikan citra splash GRUB dengan mengatur variabel GRUB_BACKGROUND di "/etc/default/grub" menunjuk ke berkas gambar atau menempatkan berkas gambar itu sendiri di "/boot/grub".

Lihat "info grub" dan grub-install(8).

Sistem mini-Debian adalah tahap ke-3 dari proses boot yang dimulai oleh boot loader. Ini menjalankan kernel sistem dengan sistem berkas root pada memori. Ini adalah tahap persiapan opsional dari proses boot.

[Catatan] Catatan

Istilah "sistem mini-Debian" diciptakan oleh penulis untuk menggambarkan proses boot tahap ke-3 ini untuk dokumen ini. Sistem ini sering disebut sebagai sistem initrd atau initramfs. Sistem serupa pada memori digunakan oleh Debian Installer.

Program "/init" dijalankan sebagai program pertama dalam sistem berkas root ini pada memori. Ini adalah program yang menginisialisasi kernel di ruang pengguna dan mewariskan kendali ke tahap berikutnya. Sistem mini-Debian ini menawarkan fleksibilitas untuk proses boot seperti menambahkan modul kernel sebelum proses boot utama atau mengait sistem berkas root sebagai yang dienkripsi.

  • Program "/init" adalah program skrip shell jika initramfs dibuat oleh initramfs-tools.

    • Anda dapat menginterupsi bagian dari proses boot ini untuk mendapatkan shell root dengan memberikan "break=init" dll. bagi parameter boot kernel. Lihat skrip "/init" untuk kondisi istirahat lainnya. Lingkungan shell ini cukup canggih untuk melakukan inspeksi yang baik terhadap perangkat keras mesin Anda.

    • Perintah yang tersedia dalam sistem mini-Debian ini adalah yang dirampingkan dan terutama disediakan oleh alat GNU yang disebut busybox(1).

  • Program "/init" adalah program biner systemd jika initramfs diciptakan oleh dracut.

    • Perintah yang tersedia dalam sistem mini-Debian adalah lingkungan systemd(1) yangn dirampingkan.

[Perhatian] Perhatian

Anda perlu menggunakan opsi "-n" untuk perintah mount saat Anda berada di sistem berkas root yang hanya-baca.

Sistem Debian normal adalah tahap ke-4 dari proses boot yang dimulai oleh sistem mini-Debian. Kernel sistem untuk sistem mini-Debian terus berjalan di lingkungan ini. Sistem berkas root dialihkan dari yang ada di memori ke yang ada di sistem berkas hard disk nyata.

Program init dijalankan sebagai program pertama dengan PID=1 untuk melakukan proses boot utama yang memulai banyak program. Path berkas baku untuk program init adalah "/usr/sbin/init" tetapi dapat diubah oleh parameter boot kernel sebagai "init=/path/ke/program_init".

"/usr/sbin/init" di-symlink ke "/lib/systemd/systemd" setelah Debian 8 Jessie (dirilis pada tahun 2015).

[Tip] Tip

Perintah init yang sebenarnya pada sistem Anda dapat diverifikasi oleh perintah "ps --pid 1 -f".


[Tip] Tip

Lihat Wiki Debian: BootProcessSpeedup bagi tips terbaru untuk mempercepat proses boot.

Ketika sistem Debian mulai berjalan, /usr/sbin/init yang di-symlink ke /usr/sbin/init dimulai sebagai proses init sistem (PID=1) yang dimiliki oleh root (UID=0). Lihat systemd(1).

Proses init systemd men-spawn proses secara paralel berdasarkan berkas konfigurasi unit (lihat systemd.unit(5)) yang ditulis dalam gaya deklaratif, bukan gaya prosedural seperti SysV.

Proses yang di-spawn ditempatkan dalam kelompok kontrol Linux individu yang dinamai sesuai dengan unit yang mereka miliki dalam hierarki sistem pribadi (lihat cgroup dan Bagian 4.7.5, “Fitur keamanan Linux”).

Unit-unit untuk mode sistem dimuat dari "Path Pencarian Unit Sistem" yang diuraikan dalam systemd.unit(5). Yang utama adalah sebagai berikut dalam urutan prioritas:

  • "/etc/systemd/system/*": System units created by the administrator

  • "/run/systemd/system/*": Runtime units

  • "/lib/systemd/system/*": System units installed by the distribution package manager

Inter-dependensi mereka ditentukan oleh arahan "Wants=", "Requires=", "Before=", "After=", … (lihat "PEMETAAN PROPERTI UNIT UNTUK INVERSI MEREKA" dalam systemd.unit(5)). Kontrol sumber daya juga didefinisikan (lihat systemd.resource-control(5)).

Akhiran berkas konfigurasi unit mengodekan jenisnya sebagai:

  • *.service menjelaskan proses yang dikendalikan dan diawasi oleh systemd. Lihat systemd.service(5).

  • *.device menggambarkan perangkat yang terpapar dalam sysfs(5) sebagai pohon perangkat udev(7). Lihat systemd.device(5).

  • *.mount menggambarkan titik kait sistem berkas yang dikendalikan dan diawasi oleh systemd. Lihat systemd.mount(5).

  • *.automount menggambarkan titik kait otomatis sistem berkas yang dikendalikan dan diawasi oleh systemd. Lihat systemd.automount(5).

  • *.swap menggambarkan perangkat atau berkas swap yang dikontrol dan diawasi oleh systemd. Lihat systemd.swap(5).

  • *.path menggambarkan path yang dipantau oleh systemd untuk aktivasi berbasis-path. Lihat systemd.path(5).

  • *.socket menjelaskan soket yang dikendalikan dan diawasi oleh systemd untuk aktivasi berbasis soket. Lihat systemd.socket(5).

  • *.timer menjelaskan timer yang dikendalikan dan diawasi oleh systemd untuk aktivasi berbasis timer. Lihat systemd.timer(5).

  • *.slice mengelola sumber daya dengan cgroup(7). Lihat systemd.slice(5).

  • *.scope dibuat secara pemrograman menggunakan antarmuka bus systemd untuk mengelola serangkaian proses sistem. Lihat systemd.scope(5).

  • *.target kelompok berkas konfigurasi unit lainnya untuk membuat titik sinkronisasi selama start-up. Lihat systemd.target(5).

Saat sistem mulai dijalankan (yaitu, init), proses systemd mencoba untuk memulai "/lib/systemd/system/default.target (biasanya di-symlink ke "graphical.target"). Pertama, beberapa unit target khusus (lihat systemd.special(7)) seperti "local-fs.target", "swap.target", dan "cryptsetup.target" ditarik untuk mengait sistems berkas. Kemudian, unit target lainnya juga ditarik oleh dependensi unit target. Untuk detailnya, baca bootup(7).

systemd menawarkan fitur kompatibilitas mundur. Skrip boot gaya SysV dalam "/etc/init.d/rc[0123456S].d/[KS]nama" masih diurai dan telinit(8) diterjemahkan ke dalam permintaan aktivasi unit systemd.

[Perhatian] Perhatian

Runlevel 2 hingga 4 yang diemulasi semuanya di-symlink ke "multi-user.target" yang sama.

Pesan kesalahan kernel yang ditampilkan ke konsol dapat dikonfigurasi dengan mengatur tingkat ambang batasnya.

# dmesg -n3

Di bawah systemd, baik kernel dan pesan sistem dicatat oleh layanan jurnal systemd-journald.service (alias journald) baik ke dalam data biner persisten di bawah "/var/log/journal" atau ke dalam data biner volatile di bawah "/run/log/journal/". Data log biner ini diakses oleh perintah journalctl(1). Misalnya, Anda dapat menampilkan log dari boot terakhir sebagai:

$ journalctl -b

Di bawah systemd, utilitas log sistem rsyslogd(8) dapat dihapus. Jika terpasang, ia mengubah perilakunya untuk membaca data log biner volatil (bukan "/dev/log" baku pra-systemd) dan untuk membuat data log sistem ASCII permanen tradisional. Ini dapat disesuaikan dengan "/etc/default/rsyslog" dan "/etc/rsyslog.conf" baik untuk berkas log maupun tampilan layar. Lihat rsyslogd(8) dan rsyslog.conf(5). Lihat juga Bagian 9.3.2, “Penganalisis log”.

systemd ini tidak hanya menawarkan sistem init tetapi juga operasi manajemen sistem generik dengan perintah systemctl(1).

Tabel 3.6. Daftar cuplikan perintah systemctl umum

Operasi Cuplikan perintah
List all available unit types "systemctl list-units --type=help"
List all target units in memory "systemctl list-units --type=target"
List all service units in memory "systemctl list-units --type=service"
List all device units in memory "systemctl list-units --type=device"
List all mount units in memory "systemctl list-units --type=mount"
Daftar semua unit soket dalam memori "systemctl list-sockets"
Daftar semua unit timer dalam memori "systemctl list-timers"
Start "$unit" "systemctl start $unit"
Stop "$unit" "systemctl stop $unit"
Memuat ulang konfigurasi spesifik layanan "systemctl reload $unit"
Menghentikan dan memulai semua "$unit" "systemctl restart $unit"
Memulai "$unit" dan menghentikan yang lainnya "systemctl isolate $unit"
Beralih ke "grafis" (sistem GUI) "systemctl isolate graphical"
Beralih ke "multi-user" (sistem CLI) "systemctl isolate multi-user"
Beralih ke "penyelamatan" (sistem CLI pengguna tunggal) "systemctl isolate rescue"
Mengirim sinyal kill ke "$unit" "systemctl kill $unit"
Memeriksa apakah layanan "$unit" aktif "systemctl is-active $unit"
Memeriksa apakah layanan "$unit" gagal "systemctl is-failed $unit"
Memeriksa status "$unit|$PID|device" "systemctl status $unit|$PID|$device"
Menampilkan properti "$unit|$job" "systemctl show $unit|$job"
Me-reset "$unit" yang gagal "systemctl reset-failed $unit"
Menampilkan daftar dependensi semua layanan unit "systemctl list-dependencies --all"
Menampilkan daftar berkas unit yang dipasang pada sistem "systemctl list-unit-files"
Memfungsikan "$unit" (menambahkan symlink) "systemctl enable $unit"
Menonaktifkan "$unit" (menghapus symlink) "systemctl disable $unit"
Membuka mask "$unit" (menghapus symlink ke "/dev/null") "systemctl unmask $unit"
Me-mask "$unit" (menambahkan symlink ke "/dev/null") "systemctl mask $unit"
Mendapatkan pengaturan target baku "systemctl get-default"
Mengatur target baku ke "grafis" (sistem GUI) "systemctl set-default graphical"
Mengatur target baku ke "multi-user" (sistem CLI) "systemctl set-default multi-user"
Tampilkan lingkungan kerja "systemctl show-environment"
Menata "variabel" lingkungan pekerjaan ke "nilai" "systemctl set-environment variable=value"
Menghapus tatanan "variabel" lingkungan pekerjaan "systemctl unset-environment variable"
Memuat ulang semua berkas unit dan daemon "systemctl daemon-reload"
Mematikan sistem "systemctl poweroff"
Mematikan dan reboot sistem "systemctl reboot"
Suspensikan sistem "systemctl suspend"
Hibernasikan sistem "systemctl hibernate"

Di sini, "$unit" dalam contoh di atas mungkin nama unit tunggal (akhiran seperti .service dan .target adalah opsional) atau, dalam banyak kasus, beberapa spesifikasi unit (glob gaya shell "*", "?", "[]" menggunakan fnmatch(3) yang akan dicocokkan dengan nama-nama utama dari semua unit yang saat ini dalam memori).

Perintah yang mengubah keadaan sistem dalam contoh-contoh di atas biasanya didahului oleh "sudo" untuk mendapatkan hak administratif yang diperlukan.

Keluaran dari "systemctl status $unit|$PID|$device" menggunakan warna titik ("●") untuk meringkas keadaan unit secara sekilas.

  • "●" putih mengindikasikan keadaan "tidak aktif" atau "menonaktifkan".

  • "●" merah mengindikasikan keadaan "gagal" atau "galat".

  • "●" hijau mengindikasikan keadaan "aktif", "memuat ulang", atau "mengaktifkan".

Berikut adalah daftar cuplikan perintah pemantauan lain di bawah systemd. Silakan baca halaman man yang bersangkutan termasuk cgroups(7).


Opsi kait disk normal dan sistem berkas jaringan diatur dalam "/etc/fstab". Lihat fstab(5) dan Bagian 9.6.7, “Optimalisasi sistem berkas dengan opsi mount”.

Konfigurasi sistem berkas terenkripsi diatur dalam "/etc/crypttab". Lihat crypttab(5)

Konfigurasi perangkat lunak RAID dengan mdadm(8) diatur dalam "/etc/mdadm/mdadm.conf". Lihat mdadm.conf(5).

[Awas] Awas

Setelah mengait semua sistem berkas, berkas-berkas sementara di "/tmp", "/var/lock", dan "/var/run" dibersihkan setiap kali boot.

The cloud system instance may be launched as a clone of "Debian Official Cloud Images" or similar images. For such system instance, personalities such as hostname, filesystem, networking, locale, SSH keys, users and groups may be configured using functionalities provided by cloud-init and netplan.io packages with multiple data sources such as files placed in the original system image and external data provided during its launch. These packages enable the declarative system configuration using YAML data.

See more at "Cloud Computing with Debian and its descendants", "Cloud-init documentation" and Bagian 5.4, “The modern network configuration for cloud”.

Dengan instalasi baku, banyak layanan jaringan (lihat Bab 6, Aplikasi jaringan) dimulai sebagai proses daemon setelah network.target pada waktu boot oleh systemd. "sshd" tidak terkecuali. Mari kita ubah ini menjadi memulai "sshd" saat dibutuhkan sebagai contoh kustomisasi.

Pertama, nonaktifkan unit layanan yang dipasang sistem.

 $ sudo systemctl stop sshd.service
 $ sudo systemctl mask sshd.service

Sistem aktivasi soket on-demand dari layanan Unix klasik adalah melalui superserver inetd (atau xinetd). Di bawah systemd, yang setara dapat diaktifkan dengan menambahkan berkas konfigurasi unit *.socket dan *.service.

sshd.socket untuk menentukan soket tempat mendengarkan

[Unit]
Description=SSH Socket for Per-Connection Servers

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target

sshd@.service sebagai berkas layanan pencocokan sshd.socket

[Unit]
Description=SSH Per-Connection Server

[Service]
ExecStart=-/usr/sbin/sshd -i
StandardInput=socket

Lalu muat ulang.

 $ sudo systemctl daemon-reload

Sistem udev menyediakan mekanisme untuk penemuan dan inisialisasi perangkat keras otomatis (lihat udev(7)) sejak kernel Linux 2.6. Setelah penemuan setiap perangkat oleh kernel, sistem udev memulai proses pengguna yang menggunakan informasi dari sistem berkas sysfs (lihat Bagian 1.2.12, “procfs dan sysfs”), memuat modul kernel yang diperlukan untuk mendukungnya menggunakan program modprobe(8) (lihat Bagian 3.9, “Inisialisasi modul kernel”), dan menciptakan simpul perangkat yang sesuai.

[Tip] Tip

Jika "/lib/modules/versi-kernel/modules.dep" tidak dihasilkan dengan benar oleh depmod(8) karena suatu alasan, modul mungkin tidak dimuat seperti yang diharapkan oleh sistem udev. Jalankan "depmod -a" untuk memperbaikinya.

Untuk aturan pengaitan di "/etc/fstab", simpul perangkat tidak perlu statis. Anda dapat menggunakan UUID untuk mengait perangkat menggantikan nama perangkat seperti "/dev/sda". Lihat Bagian 9.6.3, “Mengakses partisi menggunakan UUID”.

Karena sistem udev agak merupakan target bergerak, saya meninggalkan rincian ke dokumentasi lain dan menjelaskan informasi minimum di sini.

[Awas] Awas

Don't try to run long running programs such as backup script with RUN in udev rules as mentioned in udev(7). Please create a proper systemd.service(5) file and activate it, instead. See Bagian 10.2.3.2, “Mount event triggered backup”.

Program modprobe(8) memungkinkan kita untuk mengonfigurasi kernel Linux yang berjalan dari proses pengguna dengan menambahkan dan menghapus modul kernel. Sistem udev (lihat Bagian 3.8, “Sistem udev”) mengotomatiskan pemanggilannya untuk membantu inisialisasi modul kernel.

Ada modul non-perangkat keras dan modul driver perangkat keras khusus sebagai berikut yang perlu dimuat sebelumnya dengan mencantumkannya dalam berkas "/etc/modules" (lihat modules(5)).

Berkas konfigurasi untuk program modprobe(8) terletak di bawah direktori "/etc/modprobes.d/" seperti yang dijelaskan dalam modprobe.conf(5). (Jika Anda ingin menghindari beberapa modul kernel dimuat secara otomatis, pertimbangkan untuk memasukkannya ke dalam berkas "/etc/modprobes.d/blacklist".)

Berkas "/lib/modules/versi/modules.dep" yang dihasilkan oleh program depmod(8) menjelaskan dependensi modul yang digunakan oleh program modprobe(8).

[Catatan] Catatan

Jika Anda mengalami masalah pemuatan modul dengan pemuatan modul waktu boot atau dengan modprobe(8), "depmod -a" dapat menyelesaikan masalah ini dengan merekonstruksi "modules.dep".

Program modinfo(8) menunjukkan informasi tentang suatu modul kernel Linux.

Program lsmod(8) dengan baik memformat isi "/proc/modules", menunjukkan modul kernel apa yang saat ini dimuat.

[Tip] Tip

Anda dapat mengidentifikasi perangkat keras yang tepat pada sistem Anda. Lihat Bagian 9.5.3, “Identifikasi perangkat keras”.

Anda dapat mengonfigurasi perangkat keras pada waktu boot untuk mengaktifkan fitur perangkat keras yang diharapkan. Lihat Bagian 9.5.4, “Konfigurasi perangkat keras”.

Anda mungkin dapat menambahkan dukungan untuk perangkat khusus Anda dengan mengkompilasi ulang kernel. Lihat Bagian 9.10, “Kernel”.