source: postlfs/filesystems/initramfs.xml@ 068c8df

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 068c8df was 068c8df, checked in by Bruce Dubbs <bdubbs@…>, 12 years ago

Minor fixes

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

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