source: postlfs/filesystems/initramfs.xml@ 2f6d8ec

10.0 10.1 11.0 11.1 11.2 11.3 12.0 12.1 9.1 kea ken/TL2024 ken/inkscape-core-mods ken/tuningfonts lazarus lxqt plabs/newcss plabs/python-mods python3.11 qt5new rahul/power-profiles-daemon renodr/vulkan-addition trunk upgradedb xry111/intltool xry111/llvm18 xry111/soup3 xry111/test-20220226 xry111/xf86-video-removal
Last change on this file since 2f6d8ec was 2f6d8ec, checked in by Pierre Labastie <pieere@…>, 5 years ago

Add the possibility for resuming from disk in initramfs. This allows kernel
command lines like this:
linux /boot/vmlinuz-5.2.11-lfs-SVN-20190902 root=UUID=47a81d89-8788-4ec4-99dd-0f3a0943e96b resume=LABEL=MYSWAP ro
initrd /boot/initrd.img-5.2.11-lfs-1

git-svn-id: svn://svn.linuxfromscratch.org/BLFS/trunk/BOOK@22107 af4574ff-66df-0310-9fd7-8a98e5e911e0

  • Property mode set to 100644
File size: 13.3 KB
RevLine 
[a32a241]1<?xml version="1.0" encoding="ISO-8859-1"?>
[5632009]2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
[a42ba00]3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
[5632009]4 <!ENTITY % general-entities SYSTEM "../../general.ent">
5 %general-entities;
6]>
7
8<sect1 id="initramfs">
9 <?dbhtml filename="initramfs.html"?>
10
11 <sect1info>
12 <othername>$LastChangedBy$</othername>
13 <date>$Date$</date>
14 </sect1info>
15
16 <title>About initramfs</title>
17
18 <para>The only purpose of an initramfs is to mount the root filesystem. The
19 initramfs is a complete set of directories that you would find on a normal
20 root filesystem. It is bundled into a single cpio archive and compressed
21 with one of several compression algorithms.</para>
22
23 <para>At boot time, the boot loader loads the kernel and the initramfs image
24 into memory and starts the kernel. The kernel checks for the presence of the
25 initramfs and, if found, mounts it as / and runs /init. The init program is
26 typically a shell script. Note that the boot process takes longer, possibly
[64cb61a]27 significantly longer, if an initramfs is used.</para>
[5632009]28
29 <para>For most distributions, kernel modules are the biggest reason to have an
30 initramfs. In a general distribution, there are many unknowns such as file
31 system types and disk layouts. In a way, this is the opposite of LFS where
32 the system capabilities and layout are known and a custom kernel is normally
33 built. In this situation, an initramfs is rarely needed.</para>
34
35 <para>There are only four primary reasons to have an initramfs in the LFS
36 environment: loading the rootfs from a network, loading it from an LVM
37 logical volume, having an encrypted rootfs where a password is required, or
38 for the convenience of specifying the rootfs as a LABEL or UUID. Anything
39 else usually means that the kernel was not configured properly.</para>
40
41 <sect2 id="initramfs-build">
42 <title>Building an initramfs</title>
43
[0d7900a]44 <para>If you do decide to build an initramfs, the following scripts
45 will provide a basis to do it. The scripts will allow specifying a
46 rootfs via partition UUID or partition LABEL or a rootfs on an
[5632009]47 LVM logical volume. They do not support an encrypted root file system
[0d7900a]48 or mounting the rootfs over a network card. For a more complete
[5632009]49 capability see <ulink url="http://www.linuxfromscratch.org/hints/read.html">
50 the LFS Hints</ulink> or <ulink url="http://fedoraproject.org/wiki/Dracut">
51 dracut</ulink>.</para>
52
53 <para>To install these scripts, run the following commands as the
54 <systemitem class="username">root</systemitem> user:</para>
55
56 <screen role="root"><userinput>cat &gt; /sbin/mkinitramfs &lt;&lt; "EOF"
[51dfb3e]57<literal>#!/bin/bash
[fe58aa0]58# This file based in part on the mkinitramfs script for the LFS LiveCD
[5632009]59# written by Alexander E. Patrakov and Jeremy Huntwork.
60
61copy()
62{
63 local file
64
65 if [ "$2" == "lib" ]; then
66 file=$(PATH=/lib:/usr/lib type -p $1)
67 else
68 file=$(type -p $1)
69 fi
70
71 if [ -n $file ] ; then
72 cp $file $WDIR/$2
73 else
74 echo "Missing required file: $1 for directory $2"
75 rm -rf $WDIR
76 exit 1
77 fi
78}
79
80if [ -z $1 ] ; then
81 INITRAMFS_FILE=initrd.img-no-kmods
82else
83 KERNEL_VERSION=$1
84 INITRAMFS_FILE=initrd.img-$KERNEL_VERSION
85fi
86
87if [ -n "$KERNEL_VERSION" ] &amp;&amp; [ ! -d "/lib/modules/$1" ] ; then
88 echo "No modules directory named $1"
89 exit 1
90fi
91
92printf "Creating $INITRAMFS_FILE... "
93
[90c6607]94binfiles="sh cat cp dd killall ls mkdir mknod mount "
[5632009]95binfiles="$binfiles umount sed sleep ln rm uname"
[8b6d8b6]96binfiles="$binfiles readlink basename"
[5632009]97
[f350508]98# Systemd installs udevadm in /bin. Other udev implementations have it in /sbin
99if [ -x /bin/udevadm ] ; then binfiles="$binfiles udevadm"; fi
100
101sbinfiles="modprobe blkid switch_root"
[90c6607]102
[8253f9fc]103#Optional files and locations
[f8f7442]104for f in mdadm mdmon udevd udevadm; do
[8253f9fc]105 if [ -x /sbin/$f ] ; then sbinfiles="$sbinfiles $f"; fi
106done
[5632009]107
108unsorted=$(mktemp /tmp/unsorted.XXXXXXXXXX)
109
110DATADIR=/usr/share/mkinitramfs
111INITIN=init.in
112
[f8f7442]113# Create a temporary working directory
[5632009]114WDIR=$(mktemp -d /tmp/initrd-work.XXXXXXXXXX)
115
116# Create base directory structure
[8b6d8b6]117mkdir -p $WDIR/{bin,dev,lib/firmware,run,sbin,sys,proc,usr}
[5632009]118mkdir -p $WDIR/etc/{modprobe.d,udev/rules.d}
119touch $WDIR/etc/modprobe.d/modprobe.conf
120ln -s lib $WDIR/lib64
[8b6d8b6]121ln -s ../bin $WDIR/usr/bin
[5632009]122
123# Create necessary device nodes
124mknod -m 640 $WDIR/dev/console c 5 1
125mknod -m 664 $WDIR/dev/null c 1 3
126
127# Install the udev configuration files
[50f410f]128if [ -f /etc/udev/udev.conf ]; then
129 cp /etc/udev/udev.conf $WDIR/etc/udev/udev.conf
130fi
[5632009]131
132for file in $(find /etc/udev/rules.d/ -type f) ; do
133 cp $file $WDIR/etc/udev/rules.d
134done
135
[a32a241]136# Install any firmware present
137cp -a /lib/firmware $WDIR/lib
138
[f350508]139# Copy the RAID configuration file if present
[5632009]140if [ -f /etc/mdadm.conf ] ; then
141 cp /etc/mdadm.conf $WDIR/etc
142fi
143
144# Install the init file
145install -m0755 $DATADIR/$INITIN $WDIR/init
146
[ea8a884]147if [ -n "$KERNEL_VERSION" ] ; then
148 if [ -x /bin/kmod ] ; then
149 binfiles="$binfiles kmod"
150 else
151 binfiles="$binfiles lsmod"
[64cb61a]152 sbinfiles="$sbinfiles insmod"
[ea8a884]153 fi
154fi
155
[5632009]156# Install basic binaries
157for f in $binfiles ; do
[8b6d8b6]158 if [ -e /bin/$f ]; then d="/bin"; else d="/usr/bin"; fi
159 ldd $d/$f | sed "s/\t//" | cut -d " " -f1 &gt;&gt; $unsorted
160 copy $d/$f bin
[5632009]161done
162
163# Add lvm if present
[50f410f]164if [ -x /sbin/lvm ] ; then sbinfiles="$sbinfiles lvm dmsetup"; fi
[5632009]165
166for f in $sbinfiles ; do
167 ldd /sbin/$f | sed "s/\t//" | cut -d " " -f1 &gt;&gt; $unsorted
168 copy $f sbin
169done
170
[8253f9fc]171# Add udevd libraries if not in /sbin
172if [ -x /lib/udev/udevd ] ; then
[f350508]173 ldd /lib/udev/udevd | sed "s/\t//" | cut -d " " -f1 &gt;&gt; $unsorted
174elif [ -x /lib/systemd/systemd-udevd ] ; then
175 ldd /lib/systemd/systemd-udevd | sed "s/\t//" | cut -d " " -f1 &gt;&gt; $unsorted
[8253f9fc]176fi
177
[ea8a884]178# Add module symlinks if appropriate
179if [ -n "$KERNEL_VERSION" ] &amp;&amp; [ -x /bin/kmod ] ; then
180 ln -s kmod $WDIR/bin/lsmod
181 ln -s kmod $WDIR/bin/insmod
182fi
183
[5632009]184# Add lvm symlinks if appropriate
[50f410f]185# Also copy the lvm.conf file
[5632009]186if [ -x /sbin/lvm ] ; then
187 ln -s lvm $WDIR/sbin/lvchange
[8253f9fc]188 ln -s lvm $WDIR/sbin/lvrename
189 ln -s lvm $WDIR/sbin/lvextend
[5632009]190 ln -s lvm $WDIR/sbin/lvcreate
191 ln -s lvm $WDIR/sbin/lvdisplay
192 ln -s lvm $WDIR/sbin/lvscan
193
194 ln -s lvm $WDIR/sbin/pvchange
195 ln -s lvm $WDIR/sbin/pvck
196 ln -s lvm $WDIR/sbin/pvcreate
197 ln -s lvm $WDIR/sbin/pvdisplay
198 ln -s lvm $WDIR/sbin/pvscan
199
[068c8df]200 ln -s lvm $WDIR/sbin/vgchange
[5632009]201 ln -s lvm $WDIR/sbin/vgcreate
202 ln -s lvm $WDIR/sbin/vgscan
203 ln -s lvm $WDIR/sbin/vgrename
204 ln -s lvm $WDIR/sbin/vgck
[50f410f]205 # Conf file(s)
206 cp -a /etc/lvm $WDIR/etc
[5632009]207fi
208
209# Install libraries
[8253f9fc]210sort $unsorted | uniq | while read library ; do
211 if [ "$library" == "linux-vdso.so.1" ] ||
212 [ "$library" == "linux-gate.so.1" ]; then
[5632009]213 continue
214 fi
215
216 copy $library lib
217done
218
[f350508]219if [ -d /lib/udev ]; then
220 cp -a /lib/udev $WDIR/lib
221fi
222if [ -d /lib/systemd ]; then
223 cp -a /lib/systemd $WDIR/lib
224fi
[2f6d8ec]225if [ -d /lib/elogind ]; then
226 cp -a /lib/elogind $WDIR/lib
227fi
[5632009]228
229# Install the kernel modules if requested
230if [ -n "$KERNEL_VERSION" ]; then
231 find \
232 /lib/modules/$KERNEL_VERSION/kernel/{crypto,fs,lib} \
233 /lib/modules/$KERNEL_VERSION/kernel/drivers/{block,ata,md,firewire} \
234 /lib/modules/$KERNEL_VERSION/kernel/drivers/{scsi,message,pcmcia,virtio} \
235 /lib/modules/$KERNEL_VERSION/kernel/drivers/usb/{host,storage} \
236 -type f 2&gt; /dev/null | cpio --make-directories -p --quiet $WDIR
237
[8253f9fc]238 cp /lib/modules/$KERNEL_VERSION/modules.{builtin,order} \
239 $WDIR/lib/modules/$KERNEL_VERSION
240
[5632009]241 depmod -b $WDIR $KERNEL_VERSION
242fi
243
244( cd $WDIR ; find . | cpio -o -H newc --quiet | gzip -9 ) &gt; $INITRAMFS_FILE
245
246# Remove the temporary directory and file
247rm -rf $WDIR $unsorted
248printf "done.\n"
[51dfb3e]249</literal>
[5712a7d]250EOF
251
[7b82eb14]252chmod 0755 /sbin/mkinitramfs</userinput></screen>
[0d7900a]253
[5632009]254 <screen role="root"><userinput>mkdir -p /usr/share/mkinitramfs &amp;&amp;
255cat &gt; /usr/share/mkinitramfs/init.in &lt;&lt; "EOF"
[51dfb3e]256<literal>#!/bin/sh
[5632009]257
258PATH=/bin:/usr/bin:/sbin:/usr/sbin
259export PATH
260
261problem()
262{
263 printf "Encountered a problem!\n\nDropping you to a shell.\n\n"
264 sh
265}
266
267no_device()
268{
269 printf "The device %s, which is supposed to contain the\n" $1
270 printf "root file system, does not exist.\n"
271 printf "Please fix this problem and exit this shell.\n\n"
272}
273
274no_mount()
275{
276 printf "Could not mount device %s\n" $1
277 printf "Sleeping forever. Please reboot and fix the kernel command line.\n\n"
278 printf "Maybe the device is formatted with an unsupported file system?\n\n"
279 printf "Or maybe filesystem type autodetection went wrong, in which case\n"
280 printf "you should add the rootfstype=... parameter to the kernel command line.\n\n"
281 printf "Available partitions:\n"
282}
283
284do_mount_root()
285{
286 mkdir /.root
287 [ -n "$rootflags" ] &amp;&amp; rootflags="$rootflags,"
288 rootflags="$rootflags$ro"
289
290 case "$root" in
291 /dev/* ) device=$root ;;
292 UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;;
[4a20b84]293 LABEL=*) eval $root; device="/dev/disk/by-label/$LABEL" ;;
[5632009]294 "" ) echo "No root device specified." ; problem ;;
295 esac
296
297 while [ ! -b "$device" ] ; do
298 no_device $device
299 problem
300 done
301
302 if ! mount -n -t "$rootfstype" -o "$rootflags" "$device" /.root ; then
303 no_mount $device
304 cat /proc/partitions
305 while true ; do sleep 10000 ; done
306 else
307 echo "Successfully mounted device $root"
308 fi
309}
310
[2f6d8ec]311do_try_resume()
312{
313 case "$resume" in
314 UUID=* ) eval $resume; resume="/dev/disk/by-uuid/$UUID" ;;
315 LABEL=*) eval $resume; resume="/dev/disk/by-label/$LABEL" ;;
316 esac
317
318 if $noresume || ! [ -b "$resume" ]; then return; fi
319
320 ls -lH "$resume" | ( read x x x x maj min x
321 echo -n ${maj%,}:$min &gt; /sys/power/resume )
322}
323
[5632009]324init=/sbin/init
325root=
326rootdelay=
327rootfstype=auto
328ro="ro"
329rootflags=
330device=
[2f6d8ec]331resume=
332noresume=false
[5632009]333
334mount -n -t devtmpfs devtmpfs /dev
[a32a241]335mount -n -t proc proc /proc
336mount -n -t sysfs sysfs /sys
337mount -n -t tmpfs tmpfs /run
[5632009]338
339read -r cmdline &lt; /proc/cmdline
340
341for param in $cmdline ; do
342 case $param in
343 init=* ) init=${param#init=} ;;
344 root=* ) root=${param#root=} ;;
345 rootdelay=* ) rootdelay=${param#rootdelay=} ;;
346 rootfstype=*) rootfstype=${param#rootfstype=} ;;
347 rootflags=* ) rootflags=${param#rootflags=} ;;
[2f6d8ec]348 resume=* ) resume=${param#resume=} ;;
349 noresume ) noresume=true ;;
[5632009]350 ro ) ro="ro" ;;
351 rw ) ro="rw" ;;
352 esac
353done
354
[8253f9fc]355# udevd location depends on version
356if [ -x /sbin/udevd ]; then
[f350508]357 UDEVD=/sbin/udevd
358elif [ -x /lib/udev/udevd ]; then
359 UDEVD=/lib/udev/udevd
360elif [ -x /lib/systemd/systemd-udevd ]; then
361 UDEVD=/lib/systemd/systemd-udevd
[8253f9fc]362else
[f350508]363 echo "Cannot find udevd nor systemd-udevd"
364 problem
[8253f9fc]365fi
366
[f350508]367${UDEVD} --daemon --resolve-names=never
[5632009]368udevadm trigger
369udevadm settle
370
[50f410f]371if [ -f /etc/mdadm.conf ] ; then mdadm -As ; fi
372if [ -x /sbin/vgchange ] ; then /sbin/vgchange -a y &gt; /dev/null ; fi
373if [ -n "$rootdelay" ] ; then sleep "$rootdelay" ; fi
[5632009]374
[2f6d8ec]375do_try_resume # This function will not return if resuming from disk
[5632009]376do_mount_root
377
[f350508]378killall -w ${UDEVD##*/}
[5632009]379
380exec switch_root /.root "$init" "$@"
[51dfb3e]381</literal>
[5632009]382EOF</userinput></screen>
[0d7900a]383
[5632009]384 </sect2>
385
386 <sect2 id="initramfs-install">
387 <title>Using an initramfs</title>
388
[ea8a884]389 <bridgehead renderas="sect3">Required Runtime Dependency</bridgehead>
390
391 <para role="required">
[96e9478]392 <xref role="runtime" linkend="cpio"/>
[ea8a884]393 </para>
394
395 <para condition="html" role="usernotes">User Notes:
396 <ulink url="&blfs-wiki;/initramfs"/>
397 </para>
398
399
[5632009]400 <para>To build an initramfs, run the following as the <systemitem
401 class="username">root</systemitem> user:</para>
402
[7b82eb14]403 <screen role="nodump"><userinput>mkinitramfs [KERNEL VERSION]</userinput></screen>
[5632009]404
405 <para>The optional argument is the directory where the appropriate kernel
406 modules are located. This must be a subdirectory of <filename
407 class='directory'> /lib/modules</filename>. If no modules are specified,
408 then the initramfs is named <emphasis>initrd.img-no-kmods</emphasis>. If a
409 kernel version is specified, the initrd is named
410 <emphasis>initrd.img-$KERNEL_VERSION</emphasis> and is only appropriate for
411 the specific kernel specified. The output file will be placed in the
412 current directory.</para>
413
414 <para>After generating the initrd, copy it to the <filename
415 class='directory'>/boot</filename> directory.</para>
416
[0d7900a]417 <para>Now edit <filename>/boot/grub/grub.cfg</filename> and add a new
[5632009]418 menuentry. Below are several examples.</para>
419
[7b82eb14]420 <screen role="nodump"><userinput># Generic initramfs and root fs identified by UUID
[0d7900a]421menuentry "LFS Dev (LFS-7.0-Feb14) initrd, Linux 3.0.4"
[5632009]422{
423 linux /vmlinuz-3.0.4-lfs-20120214 root=UUID=54b934a9-302d-415e-ac11-4988408eb0a8 ro
424 initrd /initrd.img-no-kmods
425}</userinput></screen>
426
[7b82eb14]427 <screen role="nodump"><userinput># Generic initramfs and root fs on LVM partition
[0d7900a]428menuentry "LFS Dev (LFS-7.0-Feb18) initrd lvm, Linux 3.0.4"
[5632009]429{
430 linux /vmlinuz-3.0.4-lfs-20120218 root=/dev/mapper/myroot ro
431 initrd /initrd.img-no-kmods
432}</userinput></screen>
433
[7b82eb14]434 <screen role="nodump"><userinput># Specific initramfs and root fs identified by LABEL
[0d7900a]435menuentry "LFS Dev (LFS-7.1-Feb20) initrd label, Linux 3.2.6"
[5632009]436{
437 linux /vmlinuz-3.2.6-lfs71-120220 root=LABEL=lfs71 ro
438 initrd /initrd.img-3.2.6-lfs71-120220
439}</userinput></screen>
440
441 <para>Finally, reboot the system and select the desired system.</para>
442
443 </sect2>
444
445</sect1>
Note: See TracBrowser for help on using the repository browser.