source: postlfs/filesystems/initramfs.xml@ 5632009

10.0 10.1 11.0 11.1 11.2 11.3 12.0 12.1 7.10 7.4 7.5 7.6 7.6-blfs 7.6-systemd 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 9.0 9.1 basic bdubbs/svn elogind gnome kde5-13430 kde5-14269 kde5-14686 kea ken/TL2024 ken/inkscape-core-mods ken/tuningfonts krejzi/svn lazarus lxqt nosym perl-modules plabs/newcss plabs/python-mods python3.11 qt5new rahul/power-profiles-daemon renodr/vulkan-addition systemd-11177 systemd-13485 trunk upgradedb xry111/intltool xry111/llvm18 xry111/soup3 xry111/test-20220226 xry111/xf86-video-removal
Last change on this file since 5632009 was 5632009, checked in by Bruce Dubbs <bdubbs@…>, 12 years ago

Add section about initranfs.

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

  • Property mode set to 100644
File size: 10.6 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
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
27 sugnificantly longer, if an initramfs is used.</para>
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
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
47 LVM logical volume. They do not support an encrypted root file system
48 or mounting the rootfs over a network card. For a more complete
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"
57#!/bin/bash
58# This file based in part on the mkinitrafms script for the LFS LiveCD
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
94binfiles="sh cat cp dd killall ls lsmod mkdir mknod mount "
95binfiles="$binfiles umount sed sleep ln rm uname"
96
97sbinfiles="udevadm udevd modprobe blkid switch_root mdadm"
98
99unsorted=$(mktemp /tmp/unsorted.XXXXXXXXXX)
100
101DATADIR=/usr/share/mkinitramfs
102INITIN=init.in
103
104# Create a temporrary working directory
105WDIR=$(mktemp -d /tmp/initrd-work.XXXXXXXXXX)
106
107# Create base directory structure
108mkdir -p $WDIR/{bin,dev,lib/firmware,run,sbin,sys,proc}
109mkdir -p $WDIR/etc/{modprobe.d,udev/rules.d}
110touch $WDIR/etc/modprobe.d/modprobe.conf
111ln -s lib $WDIR/lib64
112
113# Create necessary device nodes
114mknod -m 640 $WDIR/dev/console c 5 1
115mknod -m 664 $WDIR/dev/null c 1 3
116
117# Install the udev configuration files
118cp /etc/udev/udev.conf $WDIR/etc/udev/udev.conf
119
120for file in $(find /etc/udev/rules.d/ -type f) ; do
121 cp $file $WDIR/etc/udev/rules.d
122done
123
124if [ -f /etc/mdadm.conf ] ; then
125 cp /etc/mdadm.conf $WDIR/etc
126fi
127
128# Install the init file
129install -m0755 $DATADIR/$INITIN $WDIR/init
130
131# Install basic binaries
132for f in $binfiles ; do
133 ldd /bin/$f | sed "s/\t//" | cut -d " " -f1 &gt;&gt; $unsorted
134 copy $f bin
135done
136
137# Add lvm if present
138if [ -x /sbin/lvm ] ; then sbinfiles="$sbinfiles lvm"; fi
139
140for f in $sbinfiles ; do
141 ldd /sbin/$f | sed "s/\t//" | cut -d " " -f1 &gt;&gt; $unsorted
142 copy $f sbin
143done
144
145# Add lvm symlinks if appropriate
146if [ -x /sbin/lvm ] ; then
147 ln -s lvm $WDIR/sbin/lvchange
148 ln -s lvm $WDIR/sbin/lvchange
149 ln -s lvm $WDIR/sbin/lvchange
150 ln -s lvm $WDIR/sbin/lvcreate
151 ln -s lvm $WDIR/sbin/lvdisplay
152 ln -s lvm $WDIR/sbin/lvscan
153
154 ln -s lvm $WDIR/sbin/pvchange
155 ln -s lvm $WDIR/sbin/pvck
156 ln -s lvm $WDIR/sbin/pvcreate
157 ln -s lvm $WDIR/sbin/pvdisplay
158 ln -s lvm $WDIR/sbin/pvscan
159
160 ln -s lvm $WDIR/sbin/vgcreate
161 ln -s lvm $WDIR/sbin/vgscan
162 ln -s lvm $WDIR/sbin/vgrename
163 ln -s lvm $WDIR/sbin/vgck
164fi
165
166# Install libraries
167sort $unsorted | uniq | while read lib ; do
168 if [ "$lib" == "linux-vdso.so.1" ] ||
169 [ "$lib" == "linux-gate.so.1" ]; then
170 continue
171 fi
172
173 copy $library lib
174done
175
176cp -a /lib/udev $WDIR/lib
177
178# Install the kernel modules if requested
179if [ -n "$KERNEL_VERSION" ]; then
180 find \
181 /lib/modules/$KERNEL_VERSION/kernel/{crypto,fs,lib} \
182 /lib/modules/$KERNEL_VERSION/kernel/drivers/{block,ata,md,firewire} \
183 /lib/modules/$KERNEL_VERSION/kernel/drivers/{scsi,message,pcmcia,virtio} \
184 /lib/modules/$KERNEL_VERSION/kernel/drivers/usb/{host,storage} \
185 -type f 2&gt; /dev/null | cpio --make-directories -p --quiet $WDIR
186
187 depmod -b $WDIR $KERNEL_VERSION
188fi
189
190( cd $WDIR ; find . | cpio -o -H newc --quiet | gzip -9 ) &gt; $INITRAMFS_FILE
191
192# Remove the temporary directory and file
193rm -rf $WDIR $unsorted
194printf "done.\n"
195
196EOF</userinput></screen>
197
198 <screen role="root"><userinput>mkdir -p /usr/share/mkinitramfs &amp;&amp;
199cat &gt; /usr/share/mkinitramfs/init.in &lt;&lt; "EOF"
200#!/bin/sh
201
202PATH=/bin:/usr/bin:/sbin:/usr/sbin
203export PATH
204
205problem()
206{
207 printf "Encountered a problem!\n\nDropping you to a shell.\n\n"
208 sh
209}
210
211no_device()
212{
213 printf "The device %s, which is supposed to contain the\n" $1
214 printf "root file system, does not exist.\n"
215 printf "Please fix this problem and exit this shell.\n\n"
216}
217
218no_mount()
219{
220 printf "Could not mount device %s\n" $1
221 printf "Sleeping forever. Please reboot and fix the kernel command line.\n\n"
222 printf "Maybe the device is formatted with an unsupported file system?\n\n"
223 printf "Or maybe filesystem type autodetection went wrong, in which case\n"
224 printf "you should add the rootfstype=... parameter to the kernel command line.\n\n"
225 printf "Available partitions:\n"
226}
227
228do_mount_root()
229{
230 mkdir /.root
231 [ -n "$rootflags" ] &amp;&amp; rootflags="$rootflags,"
232 rootflags="$rootflags$ro"
233
234 case "$root" in
235 /dev/* ) device=$root ;;
236 UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;;
237 LABEL=*) eval $root; device="/dev/disk/by-uuid/$LABEL" ;;
238 "" ) echo "No root device specified." ; problem ;;
239 esac
240
241 while [ ! -b "$device" ] ; do
242 no_device $device
243 problem
244 done
245
246 if ! mount -n -t "$rootfstype" -o "$rootflags" "$device" /.root ; then
247 no_mount $device
248 cat /proc/partitions
249 while true ; do sleep 10000 ; done
250 else
251 echo "Successfully mounted device $root"
252 fi
253}
254
255init=/sbin/init
256root=
257rootdelay=
258rootfstype=auto
259ro="ro"
260rootflags=
261device=
262
263mount -n -t devtmpfs devtmpfs /dev
264mknod -m 640 /dev/console c 5 1
265mknod -m 664 /dev/null c 1 3
266mount -n -t proc proc /proc
267mount -n -t sysfs sysfs /sys
268mount -n -t tmpfs tmpfs /run
269
270read -r cmdline &lt; /proc/cmdline
271
272for param in $cmdline ; do
273 case $param in
274 init=* ) init=${param#init=} ;;
275 root=* ) root=${param#root=} ;;
276 rootdelay=* ) rootdelay=${param#rootdelay=} ;;
277 rootfstype=*) rootfstype=${param#rootfstype=} ;;
278 rootflags=* ) rootflags=${param#rootflags=} ;;
279 ro ) ro="ro" ;;
280 rw ) ro="rw" ;;
281 esac
282done
283
284udevd --daemon --resolve-names=never
285udevadm trigger
286udevadm settle
287
288if [ -f /etc/mdadm.conf ] ; then mdadm -As ; fi
289if [ -x /sbin/vgchange ] ; then /sbin/vgchange -a y &gt; /dev/null ; fi
290if [ -n "$rootdelay" ] ; then sleep "$rootdelay" ; fi
291
292do_mount_root
293
294killall -w /sbin/udevd
295
296exec switch_root /.root "$init" "$@"
297
298EOF</userinput></screen>
299
300 </sect2>
301
302 <sect2 id="initramfs-install">
303 <title>Using an initramfs</title>
304
305 <para>To build an initramfs, run the following as the <systemitem
306 class="username">root</systemitem> user:</para>
307
308 <screen><userinput>mkinitramfs [KERNEL VERSION]</userinput></screen>
309
310 <para>The optional argument is the directory where the appropriate kernel
311 modules are located. This must be a subdirectory of <filename
312 class='directory'> /lib/modules</filename>. If no modules are specified,
313 then the initramfs is named <emphasis>initrd.img-no-kmods</emphasis>. If a
314 kernel version is specified, the initrd is named
315 <emphasis>initrd.img-$KERNEL_VERSION</emphasis> and is only appropriate for
316 the specific kernel specified. The output file will be placed in the
317 current directory.</para>
318
319 <para>After generating the initrd, copy it to the <filename
320 class='directory'>/boot</filename> directory.</para>
321
322 <para>Now edit <filename>/boot/grub/grub.cfg</filename> and add a new
323 menuentry. Below are several examples.</para>
324
325 <screen><userinput># Generic initramfs and root fs identified by UUID
326menuentry "LFS Dev (LFS-7.0-Feb14) initrd, Linux 3.0.4"
327{
328 linux /vmlinuz-3.0.4-lfs-20120214 root=UUID=54b934a9-302d-415e-ac11-4988408eb0a8 ro
329 initrd /initrd.img-no-kmods
330}</userinput></screen>
331
332 <screen><userinput># Generic initramfs and root fs on LVM partition
333menuentry "LFS Dev (LFS-7.0-Feb18) initrd lvm, Linux 3.0.4"
334{
335 linux /vmlinuz-3.0.4-lfs-20120218 root=/dev/mapper/myroot ro
336 initrd /initrd.img-no-kmods
337}</userinput></screen>
338
339 <screen><userinput># Specific initramfs and root fs identified by LABEL
340menuentry "LFS Dev (LFS-7.1-Feb20) initrd label, Linux 3.2.6"
341{
342 linux /vmlinuz-3.2.6-lfs71-120220 root=LABEL=lfs71 ro
343 initrd /initrd.img-3.2.6-lfs71-120220
344}</userinput></screen>
345
346 <para>Finally, reboot the system and select the desired system.</para>
347
348 </sect2>
349
350</sect1>
Note: See TracBrowser for help on using the repository browser.