GNU/Linux >> Belajar Linux >  >> Linux

Menantikan konfigurasi jaringan Linux di ramdisk awal (initrd)

Sebuah initrd (ramdisk awal) adalah sistem file kecil yang dimuat selama proses boot pada sistem Linux. Salah satu tugas yang mungkin menjadi tanggung jawab initrd adalah konfigurasi jaringan.

Artikel ini menjelaskan kasus-kasus yang memerlukan konfigurasi jaringan di awal proses booting, cara penerapannya, dan peningkatan yang dibawa oleh Red Hat Enterprise Linux 8.3.

Perlunya initrd

Saat Anda menekan tombol daya mesin, proses booting dimulai dengan mekanisme yang bergantung pada perangkat keras yang memuat bootloader . Perangkat lunak bootloader menemukan kernel pada disk dan mem-boot-nya. Selanjutnya, kernel memasang sistem file root dan menjalankan init proses.

Proses ini terdengar sederhana, dan mungkin itulah yang sebenarnya terjadi pada beberapa sistem Linux. Namun, distribusi Linux modern harus mendukung sejumlah besar kasus penggunaan yang prosedur ini tidak memadai.

Pertama, sistem file root bisa berada di perangkat yang memerlukan driver khusus. Sebelum mencoba memasang sistem file, modul kernel yang tepat harus dimasukkan ke dalam kernel yang sedang berjalan. Dalam beberapa kasus, sistem file root berada di partisi terenkripsi dan oleh karena itu membutuhkan pembantu userspace yang meminta frasa sandi kepada pengguna dan memasukkannya ke kernel. Atau, sistem file root dapat dibagikan melalui jaringan melalui NFS atau iSCSI, dan pemasangannya mungkin memerlukan alamat IP dan rute yang dikonfigurasi pada antarmuka jaringan.

[ Anda mungkin juga menyukai: Jaringan Linux:13 kegunaan untuk netstat ]

Untuk mengatasi masalah ini, bootloader dapat meneruskan ke kernel gambar sistem file kecil (initrd) yang berisi skrip dan alat untuk menemukan dan memasang sistem file root yang sebenarnya. Setelah ini selesai, initrd beralih ke root asli, dan booting berlanjut seperti biasa.

Infrastruktur dracut

Di Fedora dan RHEL, initrd dibuat melalui dracut . Dari halaman berandanya, dracut adalah "infrastruktur initramfs yang digerakkan oleh peristiwa. dracut (alat) digunakan untuk membuat gambar initramfs dengan menyalin alat dan file dari sistem yang diinstal dan menggabungkannya dengan kerangka kerja dracut, biasanya ditemukan di /usr/lib/dracut/modules.d ."

Catatan tentang terminologi:Terkadang, nama initrd dan initramfs digunakan secara bergantian. Mereka sebenarnya mengacu pada berbagai cara membangun citra. Initrd adalah gambar yang berisi sistem file nyata (misalnya, ext2) yang dipasang oleh kernel. Initramfs adalah arsip cpio yang berisi pohon direktori yang dibongkar sebagai tmpfs. Saat ini, gambar initrd tidak digunakan lagi untuk mendukung skema initramfs. Namun, nama initrd masih digunakan untuk menunjukkan proses boot yang melibatkan sistem file sementara.

Baris perintah kernel

Mari kita tinjau kembali skenario root NFS yang disebutkan sebelumnya. Salah satu cara yang mungkin untuk boot melalui NFS adalah dengan menggunakan baris perintah kernel yang berisi root=dhcp argumen.

Baris perintah kernel adalah daftar opsi yang diteruskan ke kernel dari bootloader, dapat diakses oleh kernel dan aplikasi. Jika Anda menggunakan GRUB, itu dapat diubah dengan menekan tombol e key pada entri boot dan mengedit baris yang dimulai dengan linux .

Kode dracut di dalam initramfs mem-parsing baris perintah kernel dan memulai DHCP pada semua antarmuka jika baris perintah berisi root=dhcp . Setelah mendapatkan sewa DHCP, dracut mengkonfigurasi antarmuka dengan parameter yang diterima (alamat IP dan rute); itu juga mengekstrak nilai opsi DHCP root-path dari sewa. Opsi ini membawa alamat dan jalur server NFS (yang dapat berupa, misalnya, 192.168.50.1:/nfs/client ). Dracut kemudian me-mount share NFS di lokasi ini dan melanjutkan dengan boot.

Jika tidak ada server DHCP yang menyediakan alamat dan jalur akar NFS, nilainya dapat dikonfigurasi secara eksplisit di baris perintah:

root=nfs:192.168.50.1:/nfs/client ip=192.168.50.101:::24::ens2:none

Di sini, argumen pertama menentukan alamat server NFS, dan argumen kedua mengonfigurasi ens2 antarmuka dengan alamat IP statis.

Ada dua sintaks untuk menentukan konfigurasi jaringan untuk sebuah antarmuka:

ip=<interface>:{dhcp|on|any|dhcp6|auto6}[:[<mtu>][:<macaddr>]]

ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<mtu>][:<macaddr>]]

Yang pertama dapat digunakan untuk konfigurasi otomatis (DHCP atau IPv6 SLAAC), dan yang kedua untuk konfigurasi statis atau kombinasi otomatis dan statis. Berikut beberapa contohnya:

ip=enp1s0:dhcp
ip=192.168.10.30::192.168.10.1:24::enp1s0:none
ip=[2001:0db8::02]::[2001:0db8::01]:64::enp1s0:none

Perhatikan bahwa jika Anda memberikan ip= opsi, tetapi dracut tidak memerlukan jaringan untuk memasang sistem file root, opsi tersebut diabaikan. Untuk memaksa konfigurasi jaringan tanpa root jaringan, tambahkan rd.neednet=1 ke baris perintah.

Anda mungkin memperhatikan bahwa di antara metode konfigurasi otomatis, ada juga ibft . iBFT adalah singkatan dari iSCSI Boot Firmware Table dan merupakan mekanisme untuk meneruskan parameter tentang perangkat iSCSI dari firmware ke sistem operasi. iSCSI (Internet Small Computer Systems Interface) adalah protokol untuk mengakses perangkat penyimpanan jaringan. Menjelaskan iBFT dan iSCSI berada di luar cakupan artikel ini. Yang penting lewat ip=ibft ke kernel, konfigurasi jaringan diambil dari firmware.

Dracut juga mendukung penambahan rute kustom, menentukan nama mesin dan server DNS, membuat ikatan, jembatan, VLAN, dan banyak lagi. Lihat halaman manual dracut.cmdline untuk detail lebih lanjut.

Modul jaringan

Kerangka dracut yang termasuk dalam initramfs memiliki arsitektur modular. Ini terdiri dari serangkaian modul, masing-masing berisi skrip dan binari untuk menyediakan fungsionalitas tertentu. Anda dapat melihat modul mana yang tersedia untuk dimasukkan dalam initramfs dengan perintah dracut --list-modules .

Saat ini, ada dua modul untuk mengkonfigurasi jaringan:network-legacy dan network-manager . Anda mungkin bertanya-tanya mengapa modul yang berbeda menyediakan fungsionalitas yang sama.

network-legacy lebih tua dan menggunakan skrip shell yang memanggil utilitas seperti iproute2 , dhclient , dan arping untuk mengkonfigurasi antarmuka. Setelah beralih ke root asli, layanan konfigurasi jaringan yang berbeda berjalan. Layanan ini tidak mengetahui apa network-legacy modul yang dimaksudkan untuk dilakukan dan status saat ini dari setiap antarmuka. Hal ini dapat menyebabkan masalah dalam mempertahankan status melintasi batas sakelar root.

Sebuah contoh menonjol dari sebuah negara yang harus disimpan adalah sewa DHCP. Jika alamat antarmuka berubah selama boot, koneksi ke berbagi NFS akan terputus, menyebabkan kegagalan boot.

Untuk memastikan transisi yang mulus, diperlukan mekanisme untuk melewati keadaan antara dua lingkungan. Namun, meneruskan status antara layanan yang memiliki model konfigurasi berbeda dapat menjadi masalah.

network-manager modul dracut dibuat untuk memperbaiki situasi ini. Modul menjalankan NetworkManager di initrd untuk mengonfigurasi profil koneksi yang dihasilkan dari baris perintah kernel. Setelah selesai, NetworkManager membuat serialisasi statusnya, yang kemudian dibaca oleh instance NetworkManager di root sebenarnya.

Fedora 31 adalah distribusi pertama yang beralih ke network-manager di initrd secara default. Pada RHEL 8.2, network-legacy masih default, tetapi network-manager tersedia. Pada RHEL 8.3, dracut akan menggunakan network-manager secara default.

Mengaktifkan modul jaringan yang berbeda

Meskipun kedua modul sebagian besar harus kompatibel, ada beberapa perbedaan dalam perilaku. Beberapa di antaranya didokumentasikan dalam nm-initrd-generator halaman manual. Secara umum, disarankan untuk menggunakan network-manager modul saat NetworkManager diaktifkan.

Untuk membangun kembali initrd menggunakan modul jaringan tertentu, gunakan salah satu perintah berikut:

# dracut --add network-legacy  --force --verbose
# dracut --add network-manager --force --verbose

Karena perubahan ini akan dikembalikan pada saat initrd dibangun kembali, Anda mungkin ingin membuat perubahan permanen dengan cara berikut:

# echo 'add_dracutmodules+=" network-manager "' > /etc/dracut.conf.d/network-module.conf
# dracut --regenerate-all --force --verbose

--regenerate-all option juga membangun kembali semua image initramfs untuk versi kernel yang ditemukan pada sistem.

Modul draf manajer jaringan

Seperti semua modul dracut, network-manager modul dibagi menjadi beberapa tahapan yang dipanggil pada waktu yang berbeda selama boot (lihat halaman manual dracut.modules untuk lebih jelasnya).

Tahap pertama mem-parsing baris perintah kernel dengan memanggil /usr/libexec/nm-initrd-generator untuk menghasilkan daftar profil koneksi di /run/NetworkManager/system-connections . Bagian kedua dari modul berjalan setelah udev diselesaikan, yaitu, setelah userspace selesai menangani peristiwa kernel untuk perangkat (termasuk antarmuka jaringan) yang ditemukan di sistem.

Ketika NM dimulai di lingkungan root sebenarnya, NM mendaftar di D-Bus, mengkonfigurasi jaringan, dan tetap aktif untuk bereaksi terhadap peristiwa atau permintaan D-Bus. Di initrd, NetworkManager dijalankan di configure-and-quit=initrd mode, yang tidak terdaftar di D-Bus (karena tidak tersedia di initrd, setidaknya untuk saat ini) dan keluar setelah mencapai startup-complete acara.

pemulaan selesai peristiwa dipicu setelah semua perangkat dengan profil koneksi yang cocok telah mencoba untuk mengaktifkan, berhasil atau tidak. Setelah semua antarmuka dikonfigurasi, NM keluar dan memanggil dracut hook untuk memberi tahu modul lain bahwa jaringan tersedia.

Perhatikan bahwa /run/NetworkManager direktori yang berisi profil koneksi yang dihasilkan dan status runtime lainnya disalin ke root asli sehingga proses NetworkManager baru yang berjalan di sana tahu persis apa yang harus dilakukan.

Pemecahan Masalah

Jika Anda memiliki masalah jaringan di dracut, bagian ini berisi beberapa saran untuk menyelidiki masalah tersebut.

Hal pertama yang harus dilakukan adalah menambahkan rd.debug ke baris perintah kernel, mengaktifkan debug logging di dracut. Log disimpan ke /run/initramfs/rdsosreport.txt dan juga tersedia di jurnal.

Jika sistem tidak bisa boot, akan berguna untuk memasukkan shell ke dalam lingkungan initrd untuk memeriksa secara manual mengapa ada yang tidak berfungsi. Untuk ini, ada rd.break argumen baris perintah. Perhatikan bahwa argumen memunculkan shell ketika initrd telah menyelesaikan tugasnya dan akan memberikan kontrol ke proses init di sistem file root yang sebenarnya. Untuk berhenti pada tahap dracut yang berbeda (misalnya, setelah penguraian baris perintah), gunakan argumen berikut:

rd.break={cmdline|pre-udev|pre-trigger|initqueue|pre-mount|mount|pre-pivot|cleanup}

Gambar initrd berisi sekumpulan biner minimal; jika Anda memerlukan alat khusus di shell dracut, Anda dapat membangun kembali gambar, menambahkan apa yang hilang. Misalnya, untuk menambahkan ping dan tcpdump binari (termasuk semua perpustakaan dependennya), jalankan:

# dracut -f  --install "ping tcpdump"

dan kemudian secara opsional memverifikasi bahwa mereka berhasil dimasukkan:

# lsinitrd | grep "ping\|tcpdump"
Arguments: -f --install 'ping tcpdump'
-rwxr-xr-x   1 root     root        82960 May 18 10:26 usr/bin/ping
lrwxrwxrwx   1 root     root           11 May 29 20:35 usr/sbin/ping -> ../bin/ping
-rwxr-xr-x   1 root     root      1065224 May 29 20:35 usr/sbin/tcpdump

Generator

Jika Anda sudah familiar dengan konfigurasi NetworkManager, Anda mungkin ingin tahu bagaimana baris perintah kernel yang diberikan diterjemahkan ke dalam profil koneksi NetworkManager. Ini berguna untuk lebih memahami mekanisme konfigurasi dan menemukan kesalahan sintaks di baris perintah tanpa harus mem-boot mesin.

Generator dipasang di /usr/libexec/nm-initrd-generator dan harus dipanggil dengan daftar argumen kernel setelah tanda hubung ganda. --stdout opsi mencetak koneksi yang dihasilkan pada output standar. Mari kita coba memanggil generator dengan contoh baris perintah:

$ /usr/libexec/nm-initrd-generator --stdout -- \
          ip=enp1s0:dhcp:00:99:88:77:66:55 rd.peerdns=0

802-3-ethernet.cloned-mac-address: '99:88:77:66:55' is not a valid MAC
address

Dalam contoh ini, generator melaporkan kesalahan karena ada bidang yang hilang untuk MTU setelah enp1s0 . Setelah kesalahan diperbaiki, penguraian berhasil dan alat mencetak profil koneksi yang dihasilkan:

$ /usr/libexec/nm-initrd-generator --stdout -- \
        ip=enp1s0:dhcp::00:99:88:77:66:55 rd.peerdns=0

*** Connection 'enp1s0' ***

[connection]
id=enp1s0
uuid=e1fac965-4319-4354-8ed2-39f7f6931966
type=ethernet
interface-name=enp1s0
multi-connect=1
permissions=

[ethernet]
cloned-mac-address=00:99:88:77:66:55
mac-address-blacklist=

[ipv4]
dns-search=
ignore-auto-dns=true
may-fail=false
method=auto

[ipv6]
addr-gen-mode=eui64
dns-search=
ignore-auto-dns=true
method=auto

[proxy]

Perhatikan bagaimana rd.peerdns=0 argumen diterjemahkan ke dalam ignore-auto-dns=true properti, yang membuat NetworkManager mengabaikan server DNS yang diterima melalui DHCP. Penjelasan tentang properti NetworkManager dapat ditemukan di halaman manual nm-settings.

[ Jaringan lepas kendali? Lihat Otomatisasi jaringan untuk semua orang, buku gratis dari Red Hat. ] 

Kesimpulan

Modul dracut NetworkManager diaktifkan secara default di Fedora dan juga akan segera diaktifkan di RHEL. Ini membawa integrasi yang lebih baik antara jaringan di initrd dan NetworkManager yang berjalan di sistem file root yang sebenarnya.

Sementara implementasi saat ini berjalan dengan baik, ada beberapa ide untuk kemungkinan perbaikan. Salah satunya adalah mengabaikan configure-and-quit=initrd mode dan jalankan NetworkManager sebagai daemon yang dimulai oleh layanan systemd. Dengan cara ini, NetworkManager akan dijalankan dengan cara yang sama seperti saat dijalankan di root sebenarnya, mengurangi kode yang harus dipelihara dan diuji.

Untuk sepenuhnya menghapus configure-and-quit=initrd mode, NetworkManager juga harus dapat mendaftar pada D-Bus di initrd. Saat ini, dracut tidak memiliki modul yang menyediakan daemon D-Bus karena gambarnya harus minimal. Namun, sudah ada proposal untuk memasukkannya karena diperlukan untuk mengimplementasikan beberapa fitur baru.

Dengan D-Bus yang berjalan di initrd, API NetworkManager yang kuat akan tersedia untuk alat lain untuk menanyakan dan mengubah status jaringan, membuka kunci berbagai aplikasi. Salah satunya adalah menjalankan nm-cloud-setup di initrd. Layanan, dikirimkan dalam NetworkManager-cloud-setup Paket Fedora mengambil metadata dari infrastruktur penyedia cloud (EC2, Azure, GCP) untuk mengonfigurasi jaringan secara otomatis.


Linux
  1. Kernel Linux:5 inovasi teratas

  2. Ubah timer kernel linux

  3. Cara mengatur antarmuka jaringan yang disukai di linux

  1. Siklus hidup pengujian kernel Linux

  2. Permainan nama:Memberi nama antarmuka jaringan di Linux

  3. Cara menggunakan perintah mtr Linux

  1. Linux – Berpartisipasi Di Milis Kernel?

  2. Linux – Bagian Kernel yang Dimiliki Atau Tertutup?

  3. Apakah mungkin mem-boot kernel Linux tanpa membuat gambar initrd?