|
Loading...
|
lfs-book@linuxfromscratch.org
[Prev] Thread [Next] | [Prev] Date [Next]
[blfs-book] r9501 - in trunk/BOOK: gnome/add introduction/welcome postlfs/filesystems bdubbs Wed Feb 22 19:00:50 2012
Author: bdubbs
Date: 2012-02-22 19:50:55 -0700 (Wed, 22 Feb 2012)
New Revision: 9501
Added:
trunk/BOOK/postlfs/filesystems/initramfs.xml
Modified:
trunk/BOOK/gnome/add/mobile-broadband-provider-info.xml
trunk/BOOK/introduction/welcome/changelog.xml
trunk/BOOK/postlfs/filesystems/filesystems.xml
Log:
Add section about initranfs.
Modified: trunk/BOOK/gnome/add/mobile-broadband-provider-info.xml
===================================================================
--- trunk/BOOK/gnome/add/mobile-broadband-provider-info.xml 2012-02-23
02:02:48 UTC (rev 9500)
+++ trunk/BOOK/gnome/add/mobile-broadband-provider-info.xml 2012-02-23
02:50:55 UTC (rev 9501)
@@ -36,12 +36,13 @@
&lfs70_built;
<bridgehead renderas="sect3">Package Information</bridgehead>
+
<screen><literal>SOURCE="ftp.gnome/org/pub/gnome/sources/mobile-broadband-provider-info/20110511/"</literal></screen>
<itemizedlist spacing="compact">
<listitem>
- <para>Download (HTTP): <ulink
url="&mobile-broadband-provider-info-download-http;"/></para>
+ <para>Download (HTTP): <ulink
url="http://$SOURCE/mobile-broadband-provider-info-&mobile-broadband-provider-info-version;.tar.bz2"/></para>
</listitem>
<listitem>
- <para>Download (FTP): <ulink
url="&mobile-broadband-provider-info-download-ftp;"/></para>
+ <para>Download (FTP): <ulink
url="ftp://$SOURCE/mobile-broadband-provider-info-&mobile-broadband-provider-info-version;.tar.bz2"/></para>
</listitem>
<listitem>
<para>Download MD5 sum: &mobile-broadband-provider-info-md5sum;</para>
Modified: trunk/BOOK/introduction/welcome/changelog.xml
===================================================================
--- trunk/BOOK/introduction/welcome/changelog.xml 2012-02-23 02:02:48 UTC
(rev 9500)
+++ trunk/BOOK/introduction/welcome/changelog.xml 2012-02-23 02:50:55 UTC
(rev 9501)
@@ -45,6 +45,9 @@
<para>February 23rd, 2012</para>
<itemizedlist>
<listitem>
+ <para>[bdubbs] - Add section on initramfs.</para>
+ </listitem>
+ <listitem>
<para>[ken] - add anjuta-3.2.1 from Wayne.</para>
</listitem>
<listitem>
Modified: trunk/BOOK/postlfs/filesystems/filesystems.xml
===================================================================
--- trunk/BOOK/postlfs/filesystems/filesystems.xml 2012-02-23 02:02:48 UTC
(rev 9500)
+++ trunk/BOOK/postlfs/filesystems/filesystems.xml 2012-02-23 02:50:55 UTC
(rev 9501)
@@ -24,6 +24,7 @@
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="lvm2.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="aboutlvm.xml"/>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="initramfs.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="jfs.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="mdadm.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="aboutraid.xml"/>
Copied: trunk/BOOK/postlfs/filesystems/initramfs.xml (from rev 9491,
trunk/BOOK/postlfs/filesystems/aboutraid.xml)
===================================================================
--- trunk/BOOK/postlfs/filesystems/initramfs.xml
(rev 0)
+++ trunk/BOOK/postlfs/filesystems/initramfs.xml 2012-02-23 02:50:55 UTC
(rev 9501)
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+ <!ENTITY % general-entities SYSTEM "../../general.ent">
+ %general-entities;
+]>
+
+<sect1 id="initramfs">
+ <?dbhtml filename="initramfs.html"?>
+
+ <sect1info>
+ <othername>$LastChangedBy$</othername>
+ <date>$Date$</date>
+ </sect1info>
+
+ <title>About initramfs</title>
+
+ <para>The only purpose of an initramfs is to mount the root filesystem. The
+ initramfs is a complete set of directories that you would find on a normal
+ root filesystem. It is bundled into a single cpio archive and compressed
+ with one of several compression algorithms.</para>
+
+ <para>At boot time, the boot loader loads the kernel and the initramfs image
+ into memory and starts the kernel. The kernel checks for the presence of the
+ initramfs and, if found, mounts it as / and runs /init. The init program is
+ typically a shell script. Note that the boot process takes longer, possibly
+ sugnificantly longer, if an initramfs is used.</para>
+
+ <para>For most distributions, kernel modules are the biggest reason to have
an
+ initramfs. In a general distribution, there are many unknowns such as file
+ system types and disk layouts. In a way, this is the opposite of LFS where
+ the system capabilities and layout are known and a custom kernel is normally
+ built. In this situation, an initramfs is rarely needed.</para>
+
+ <para>There are only four primary reasons to have an initramfs in the LFS
+ environment: loading the rootfs from a network, loading it from an LVM
+ logical volume, having an encrypted rootfs where a password is required, or
+ for the convenience of specifying the rootfs as a LABEL or UUID. Anything
+ else usually means that the kernel was not configured properly.</para>
+
+ <sect2 id="initramfs-build">
+ <title>Building an initramfs</title>
+
+ <para>If you do decide to build an initramfs, the following scripts
+ will provide a basis to do it. The scripts will allow specifying a
+ rootfs via partition UUID or partition LABEL or a rootfs on an
+ LVM logical volume. They do not support an encrypted root file system
+ or mounting the rootfs over a network card. For a more complete
+ capability see <ulink
url="http://www.linuxfromscratch.org/hints/read.html">
+ the LFS Hints</ulink> or <ulink url="http://fedoraproject.org/wiki/Dracut">
+ dracut</ulink>.</para>
+
+ <para>To install these scripts, run the following commands as the
+ <systemitem class="username">root</systemitem> user:</para>
+
+ <screen role="root"><userinput>cat > /sbin/mkinitramfs << "EOF"
+#!/bin/bash
+# This file based in part on the mkinitrafms script for the LFS LiveCD
+# written by Alexander E. Patrakov and Jeremy Huntwork.
+
+copy()
+{
+ local file
+
+ if [ "$2" == "lib" ]; then
+ file=$(PATH=/lib:/usr/lib type -p $1)
+ else
+ file=$(type -p $1)
+ fi
+
+ if [ -n $file ] ; then
+ cp $file $WDIR/$2
+ else
+ echo "Missing required file: $1 for directory $2"
+ rm -rf $WDIR
+ exit 1
+ fi
+}
+
+if [ -z $1 ] ; then
+ INITRAMFS_FILE=initrd.img-no-kmods
+else
+ KERNEL_VERSION=$1
+ INITRAMFS_FILE=initrd.img-$KERNEL_VERSION
+fi
+
+if [ -n "$KERNEL_VERSION" ] && [ ! -d "/lib/modules/$1" ] ; then
+ echo "No modules directory named $1"
+ exit 1
+fi
+
+printf "Creating $INITRAMFS_FILE... "
+
+binfiles="sh cat cp dd killall ls lsmod mkdir mknod mount "
+binfiles="$binfiles umount sed sleep ln rm uname"
+
+sbinfiles="udevadm udevd modprobe blkid switch_root mdadm"
+
+unsorted=$(mktemp /tmp/unsorted.XXXXXXXXXX)
+
+DATADIR=/usr/share/mkinitramfs
+INITIN=init.in
+
+# Create a temporrary working directory
+WDIR=$(mktemp -d /tmp/initrd-work.XXXXXXXXXX)
+
+# Create base directory structure
+mkdir -p $WDIR/{bin,dev,lib/firmware,run,sbin,sys,proc}
+mkdir -p $WDIR/etc/{modprobe.d,udev/rules.d}
+touch $WDIR/etc/modprobe.d/modprobe.conf
+ln -s lib $WDIR/lib64
+
+# Create necessary device nodes
+mknod -m 640 $WDIR/dev/console c 5 1
+mknod -m 664 $WDIR/dev/null c 1 3
+
+# Install the udev configuration files
+cp /etc/udev/udev.conf $WDIR/etc/udev/udev.conf
+
+for file in $(find /etc/udev/rules.d/ -type f) ; do
+ cp $file $WDIR/etc/udev/rules.d
+done
+
+if [ -f /etc/mdadm.conf ] ; then
+ cp /etc/mdadm.conf $WDIR/etc
+fi
+
+# Install the init file
+install -m0755 $DATADIR/$INITIN $WDIR/init
+
+# Install basic binaries
+for f in $binfiles ; do
+ ldd /bin/$f | sed "s/\t//" | cut -d " " -f1 >> $unsorted
+ copy $f bin
+done
+
+# Add lvm if present
+if [ -x /sbin/lvm ] ; then sbinfiles="$sbinfiles lvm"; fi
+
+for f in $sbinfiles ; do
+ ldd /sbin/$f | sed "s/\t//" | cut -d " " -f1 >> $unsorted
+ copy $f sbin
+done
+
+# Add lvm symlinks if appropriate
+if [ -x /sbin/lvm ] ; then
+ ln -s lvm $WDIR/sbin/lvchange
+ ln -s lvm $WDIR/sbin/lvchange
+ ln -s lvm $WDIR/sbin/lvchange
+ ln -s lvm $WDIR/sbin/lvcreate
+ ln -s lvm $WDIR/sbin/lvdisplay
+ ln -s lvm $WDIR/sbin/lvscan
+
+ ln -s lvm $WDIR/sbin/pvchange
+ ln -s lvm $WDIR/sbin/pvck
+ ln -s lvm $WDIR/sbin/pvcreate
+ ln -s lvm $WDIR/sbin/pvdisplay
+ ln -s lvm $WDIR/sbin/pvscan
+
+ ln -s lvm $WDIR/sbin/vgcreate
+ ln -s lvm $WDIR/sbin/vgscan
+ ln -s lvm $WDIR/sbin/vgrename
+ ln -s lvm $WDIR/sbin/vgck
+fi
+
+# Install libraries
+sort $unsorted | uniq | while read lib ; do
+ if [ "$lib" == "linux-vdso.so.1" ] ||
+ [ "$lib" == "linux-gate.so.1" ]; then
+ continue
+ fi
+
+ copy $library lib
+done
+
+cp -a /lib/udev $WDIR/lib
+
+# Install the kernel modules if requested
+if [ -n "$KERNEL_VERSION" ]; then
+ find \
+ /lib/modules/$KERNEL_VERSION/kernel/{crypto,fs,lib} \
+ /lib/modules/$KERNEL_VERSION/kernel/drivers/{block,ata,md,firewire} \
+ /lib/modules/$KERNEL_VERSION/kernel/drivers/{scsi,message,pcmcia,virtio} \
+ /lib/modules/$KERNEL_VERSION/kernel/drivers/usb/{host,storage} \
+ -type f 2> /dev/null | cpio --make-directories -p --quiet $WDIR
+
+ depmod -b $WDIR $KERNEL_VERSION
+fi
+
+( cd $WDIR ; find . | cpio -o -H newc --quiet | gzip -9 ) > $INITRAMFS_FILE
+
+# Remove the temporary directory and file
+rm -rf $WDIR $unsorted
+printf "done.\n"
+
+EOF</userinput></screen>
+
+ <screen role="root"><userinput>mkdir -p /usr/share/mkinitramfs &&
+cat > /usr/share/mkinitramfs/init.in << "EOF"
+#!/bin/sh
+
+PATH=/bin:/usr/bin:/sbin:/usr/sbin
+export PATH
+
+problem()
+{
+ printf "Encountered a problem!\n\nDropping you to a shell.\n\n"
+ sh
+}
+
+no_device()
+{
+ printf "The device %s, which is supposed to contain the\n" $1
+ printf "root file system, does not exist.\n"
+ printf "Please fix this problem and exit this shell.\n\n"
+}
+
+no_mount()
+{
+ printf "Could not mount device %s\n" $1
+ printf "Sleeping forever. Please reboot and fix the kernel command
line.\n\n"
+ printf "Maybe the device is formatted with an unsupported file system?\n\n"
+ printf "Or maybe filesystem type autodetection went wrong, in which case\n"
+ printf "you should add the rootfstype=... parameter to the kernel command
line.\n\n"
+ printf "Available partitions:\n"
+}
+
+do_mount_root()
+{
+ mkdir /.root
+ [ -n "$rootflags" ] && rootflags="$rootflags,"
+ rootflags="$rootflags$ro"
+
+ case "$root" in
+ /dev/* ) device=$root ;;
+ UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;;
+ LABEL=*) eval $root; device="/dev/disk/by-uuid/$LABEL" ;;
+ "" ) echo "No root device specified." ; problem ;;
+ esac
+
+ while [ ! -b "$device" ] ; do
+ no_device $device
+ problem
+ done
+
+ if ! mount -n -t "$rootfstype" -o "$rootflags" "$device" /.root ; then
+ no_mount $device
+ cat /proc/partitions
+ while true ; do sleep 10000 ; done
+ else
+ echo "Successfully mounted device $root"
+ fi
+}
+
+init=/sbin/init
+root=
+rootdelay=
+rootfstype=auto
+ro="ro"
+rootflags=
+device=
+
+mount -n -t devtmpfs devtmpfs /dev
+mknod -m 640 /dev/console c 5 1
+mknod -m 664 /dev/null c 1 3
+mount -n -t proc proc /proc
+mount -n -t sysfs sysfs /sys
+mount -n -t tmpfs tmpfs /run
+
+read -r cmdline < /proc/cmdline
+
+for param in $cmdline ; do
+ case $param in
+ init=* ) init=${param#init=} ;;
+ root=* ) root=${param#root=} ;;
+ rootdelay=* ) rootdelay=${param#rootdelay=} ;;
+ rootfstype=*) rootfstype=${param#rootfstype=} ;;
+ rootflags=* ) rootflags=${param#rootflags=} ;;
+ ro ) ro="ro" ;;
+ rw ) ro="rw" ;;
+ esac
+done
+
+udevd --daemon --resolve-names=never
+udevadm trigger
+udevadm settle
+
+if [ -f /etc/mdadm.conf ] ; then mdadm -As ; fi
+if [ -x /sbin/vgchange ] ; then /sbin/vgchange -a y > /dev/null ; fi
+if [ -n "$rootdelay" ] ; then sleep "$rootdelay" ; fi
+
+do_mount_root
+
+killall -w /sbin/udevd
+
+exec switch_root /.root "$init" "$@"
+
+EOF</userinput></screen>
+
+ </sect2>
+
+ <sect2 id="initramfs-install">
+ <title>Using an initramfs</title>
+
+ <para>To build an initramfs, run the following as the <systemitem
+ class="username">root</systemitem> user:</para>
+
+ <screen><userinput>mkinitramfs [KERNEL VERSION]</userinput></screen>
+
+ <para>The optional argument is the directory where the appropriate kernel
+ modules are located. This must be a subdirectory of <filename
+ class='directory'> /lib/modules</filename>. If no modules are specified,
+ then the initramfs is named <emphasis>initrd.img-no-kmods</emphasis>. If a
+ kernel version is specified, the initrd is named
+ <emphasis>initrd.img-$KERNEL_VERSION</emphasis> and is only appropriate for
+ the specific kernel specified. The output file will be placed in the
+ current directory.</para>
+
+ <para>After generating the initrd, copy it to the <filename
+ class='directory'>/boot</filename> directory.</para>
+
+ <para>Now edit <filename>/boot/grub/grub.cfg</filename> and add a new
+ menuentry. Below are several examples.</para>
+
+ <screen><userinput># Generic initramfs and root fs identified by UUID
+menuentry "LFS Dev (LFS-7.0-Feb14) initrd, Linux 3.0.4"
+{
+ linux /vmlinuz-3.0.4-lfs-20120214
root=UUID=54b934a9-302d-415e-ac11-4988408eb0a8 ro
+ initrd /initrd.img-no-kmods
+}</userinput></screen>
+
+ <screen><userinput># Generic initramfs and root fs on LVM partition
+menuentry "LFS Dev (LFS-7.0-Feb18) initrd lvm, Linux 3.0.4"
+{
+ linux /vmlinuz-3.0.4-lfs-20120218 root=/dev/mapper/myroot ro
+ initrd /initrd.img-no-kmods
+}</userinput></screen>
+
+ <screen><userinput># Specific initramfs and root fs identified by LABEL
+menuentry "LFS Dev (LFS-7.1-Feb20) initrd label, Linux 3.2.6"
+{
+ linux /vmlinuz-3.2.6-lfs71-120220 root=LABEL=lfs71 ro
+ initrd /initrd.img-3.2.6-lfs71-120220
+}</userinput></screen>
+
+ <para>Finally, reboot the system and select the desired system.</para>
+
+ </sect2>
+
+</sect1>
--
http://linuxfromscratch.org/mailman/listinfo/blfs-book
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page