source: postlfs/filesystems/initramfs.xml@ 0d7900a

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 0d7900a was 0d7900a, checked in by Randy McMurchy <randy@…>, 11 years ago

Removed extraneous spaces from blank lines and at the end of lines in the .xml

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

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