Mateusz Adamowski
Jesień Linuksowa 2026
Kraków, 2026-10-23
Komu to potrzebne?



Często nie
Ale po kolei…
Umie wczytać MBR
(446 bajtów)
Nie rozumie tablicy partycji, systemów plików
BIOS lub UEFI wczytuje bootloader (GRUB)
(w ograniczonym stopniu też: LVM, RAID, LUKS)
root=)init (PID 1)
initlsinitramfsunmkinitramfsUse case #1:
apt-get install dropbear-initramfs

update-initramfs/usr/share/initramfs-tools/etc/initramfs-tools/etc/initramfs-toolsupdate-initramfs -u#!/bin/sh
[ "$1" = "prereqs" ] && exit 0
. /usr/share/initramfs-tools/hook-functions
copy_exec /bin/busybox /bin/busybox.full
hook-functionscopy_exec: wgraj program (wraz z bibliotekami)copy_file: wgraj dowolny plikinit w initramfs init-top (przed załadowaniem modułów)
↓
init-premount
↓
local-top
↓
local-premount
↓
local-bottom (po zamontowaniu /)
↓
init-bottom
↓
*** start normalnego systemu ***
#!/bin/sh
PREREQ="udev"
prereqs() {
echo "$PREREQ"
}
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
Skrypt jest uruchamiany również w trakcie budowania initramfs w celu ustalenia kolejności wykonywania przez init.
Parametr: prereqs
Use case #2
...
copy_exec /usr/bin/wg /usr/bin/wg
manual_add_modules wireguard
copy_file conffile /etc/initramfs/wg0.conf /conf/wg0.conf
wg-quick...
ip link add "$interface" type wireguard
ip link set "$interface" up
wg setconf "$interface" /conf/wg0.conf
ip address add "$addr" dev "$interface"
ip route add "$route" dev "$interface"
Use case #3
...
copy_file conffile /etc/initramfs-tools/wpa_supplicant.conf \
/conf/wpa_supplicant.conf
copy_exec /usr/sbin/iw
copy_exec /usr/sbin/wpa_supplicant
copy_exec /usr/sbin/wpa_cli
manual_add_modules mwifiex_sdio
...
modprobe "$WLAN_MODULE"
sleep 5
for TTT in 4 8 16 32; do
wpa_supplicant -B -i wlan0 -c /conf/wpa_supplicant.conf
ipconfig -t "$TTT" -d wlan0 && exit 0
wpa_cli -p /run/wpa_supplicant -i wlan0 terminate
echo "Wifi retrying"
sleep "$TTT"
done
Use case #4
curl / wget mogą wysłać informację o postępie startu
NTFYSH_HOSTNAME="mojserwer01"
NTFYSH_TOPIC="jesien_linuksowa_2026"
(
attempts=10
while [ "$attempts" -gt 0 ]; do
wget -q -T 5 -O /dev/null \
--no-check-certificate \
--post-data="$(uname -r)" \
--header="Title: ${NTFYSH_HOSTNAME}: dropbear ready" \
--header='Tags: teddy_bear' \
"https://ntfy.sh/${NTFYSH_TOPIC}" && break
attempts=$((attempts - 1))
[ "$attempts" -gt 0 ] && sleep 5
done
) &

busybox jako /bin/shinitcpio#!/bin/sh
echo "Welcome to myinitramfs!"
sh
mkdir -p initramfs && cd initramfs
mkdir -p bin
cp "$SRC/busybox" bin/busybox
cp "$SRC/init" bin/init
ln -s busybox bin/sh
find . | cpio --owner=0:0 -H newc -o > ../initrd
A gdyby tak nie montować dysku i zostać w RAM-ie na zawsze?
rootfs spakowany wewnątrz initramfsmount -t proc proc /proc
memsize="$(sed -ne '/^MemTotal/s/^.*: *\(.*\) kB$/\1/p' /proc/meminfo)"
umount /proc
mkdir -p /newroot
mount -t tmpfs -o "size=${memsize}k,mode=0755" tmpfs /newroot
tar -x -C /newroot --strip-components=1 < /rootfs.tar
exec /bin/run-init /newroot /sbin/init "$@"
mkdir -p /rootfs-ro
mount -t squashfs -o loop,ro /rootfs.squashfs /rootfs-ro
mkdir -p /overlay /newroot
memsize="$(sed -ne '/^MemTotal/s/^.*: *\(.*\) kB$/\1/p' /proc/meminfo)"
mount -t tmpfs -o "size=${memsize}k,mode=0755" tmpfs /overlay
mkdir -p /overlay/upper /overlay/work
mount -t overlay overlay \
-o lowerdir=/rootfs-ro,upperdir=/overlay/upper,workdir=/overlay/work \
/newroot
dracut -flsinitrdsystemd może być PID 1 w initramfsukify build \
--linux=kernel-x.y.z" \
--initrd=initrd-x.y.z.gz" \
--cmdline="console=tty0" \
--output="mojsystem.efi"
kexec -l inny-kernel \
--append=...cmdline... \
--initrd=inny-initrd