source: postlfs/filesystems/initramfs.xml@ 90c6607

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

Update mkinitramfs script again

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

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