source: postlfs/filesystems/initramfs.xml@ 64cb61a

10.0 10.1 11.0 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 ken/refactor-virt krejzi/svn lazarus nosym perl-modules qt5new systemd-11177 systemd-13485 trunk upgradedb xry111/git-date xry111/git-date-for-trunk xry111/git-date-test
Last change on this file since 64cb61a was 64cb61a, checked in by Bruce Dubbs <bdubbs@…>, 10 years ago

Fix typos in initramfs

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

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