ceturtdiena, 2014. gada 21. augusts

Article that shows how Visual Studio builds and modify's linux kernel.

http://sysprogs.com/VisualKernel/tutorials/kernel/

wut?

WHAT LOCKS YOUR SCREEN IN XFCE

#!/bin/sh
#
#  xfce4
#
#  Copyright (C) 1999, 2003 Olivier Fourdan (fourdan@xfce.org)
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#

if pgrep xscreensaver > /dev/null 2>&1; then
    xscreensaver-command -lock
elif pgrep -f gnome-screensaver 2>/dev/null; then
    gnome-screensaver-command --lock
elif test x"`which slock 2>/dev/null`" != x""; then
   slock
else
    xlock $*
fi
exit 0

sestdiena, 2014. gada 12. aprīlis

Packages that run Linux.

3.2. All Packages

Download or otherwise obtain the following packages:
Autoconf (2.69) - 1,186 KB:
MD5 sum: 50f97f4159805e374639a73e2636f22e
Automake (1.14.1) - 1,456 KB:
MD5 sum: 7fc29854c520f56b07aa232a0f880292
Bash (4.2) - 6,845 KB:
MD5 sum: 3fb927c7c33022f1c327f14a81c0d4b0
Bc (1.06.95) - 288 KB:
MD5 sum: 5126a721b73f97d715bb72c13c889035
Binutils (2.24) - 22,184 KB:
MD5 sum: e0f71a7b2ddab0f8612336ac81d9636b
Bison (3.0.2) - 1,882 KB:
MD5 sum: 146be9ff9fbd27497f0bf2286a5a2082
Bzip2 (1.0.6) - 764 KB:
MD5 sum: 00b516f4704d4a7cb50a1d97e6e8e15b
Check (0.9.12) - 714 KB:
MD5 sum: 46fe540d1a03714c7a1967dbc6d484e7
Coreutils (8.22) - 5,210 KB:
MD5 sum: 8fb0ae2267aa6e728958adc38f8163a2
DejaGNU (1.5.1) - 566 KB:
MD5 sum: 8386e04e362345f50ad169f052f4c4ab
Diffutils (3.3) - 1,170 KB:
MD5 sum: 99180208ec2a82ce71f55b0d7389f1b3
E2fsprogs (1.42.9) - 5,928 KB:
MD5 sum: 3f8e41e63b432ba114b33f58674563f7
Expect (5.45) - 614 KB:
MD5 sum: 44e1a4f4c877e9ddc5a542dfa7ecc92b
File (5.17) - 694 KB:
MD5 sum: e19c47e069ced7b01ccb4db402cc01d3
[Note] 

Note

File (5.17) may no longer be available at the listed location. The site administrators of the master download location occasionally remove older versions when new ones are released. An alternative download location that may have the correct version available can also be found at: http://www.linuxfromscratch.org/lfs/download.html#ftp.
Findutils (4.4.2) - 2,100 KB:
MD5 sum: 351cc4adb07d54877fa15f75fb77d39f
Flex (2.5.38) - 1,590 KB:
MD5 sum: b230c88e65996ff74994d08a2a2e0f27
Gawk (4.1.0) - 2,004 KB:
MD5 sum: b18992ff8faf3217dab55d2d0aa7d707
GCC (4.8.2) - 83,984 KB:
Home page: http://gcc.gnu.org/
MD5 sum: a3d7d63b9cb6b6ea049469a0c4a43c9d
GDBM (1.11) - 796 KB:
MD5 sum: 72c832680cf0999caedbe5b265c8c1bd
Gettext (0.18.3.2) - 15,810 KB:
MD5 sum: 241aba309d07aa428252c74b40a818ef
Glibc (2.19) - 11,801 KB:
MD5 sum: e26b8cc666b162f999404b03970f14e4
GMP (5.1.3) - 1,777 KB:
MD5 sum: e5fe367801ff067b923d1e6a126448aa
Grep (2.16) - 1,184 KB:
MD5 sum: 502350a6c8f7c2b12ee58829e760b44d
Groff (1.22.2) - 3,926 KB:
MD5 sum: 9f4cd592a5efc7e36481d8d8d8af6d16
GRUB (2.00) - 5,016 KB:
MD5 sum: a1043102fbc7bcedbf53e7ee3d17ab91
Gzip (1.6) - 712 KB:
MD5 sum: da981f86677d58a106496e68de6f8995
Iana-Etc (2.30) - 201 KB:
MD5 sum: 3ba3afb1d1b261383d247f46cb135ee8
Inetutils (1.9.2) - 2,188 KB:
MD5 sum: aa1a9a132259db83e66c1f3265065ba2
IPRoute2 (3.12.0) - 415 KB:
MD5 sum: f87386aaaecafab95607fd10e8152c68
Kbd (2.0.1) - 1,962 KB:
MD5 sum: cc0ee9f2537d8636cae85a8c6541ed2e
Kmod (16) - 1,408 KB:
MD5 sum: 3006a0287211212501cdfe1211b29f09
Less (458) - 308 KB:
MD5 sum: 935b38aa2e73c888c210dedf8fd94f49
LFS-Bootscripts (20130821) - 34 KB:
MD5 sum: e908023fc44e613ad0c81241781289e7
Libpipeline (1.2.6) - 761 KB:
MD5 sum: 6d1d51a5dc102af41e0d269d2a31e6f9
Libtool (2.4.2) - 2,571 KB:
MD5 sum: d2f3b7d4627e69e13514a40e72a24d50
Linux (3.13.3) - 75,393 KB:
MD5 sum: ad98a0c623a124a25dab86406ddc7119
[Note] 

Note

The Linux kernel is updated relatively often, many times due to discoveries of security vulnerabilities. The latest available 3.13.x kernel version should be used, unless the errata page says otherwise.
For users with limited speed or expensive bandwidth who wish to update the Linux kernel, a baseline version of the package and patches can be downloaded separately. This may save some time or cost for a subsequent patch level upgrade within a minor release.
M4 (1.4.17) - 1,122 KB:
MD5 sum: 12a3c829301a4fd6586a57d3fcf196dc
Make (4.0) - 1,311 KB:
MD5 sum: 571d470a7647b455e3af3f92d79f1c18
Man-DB (2.6.6) - 1,415 KB:
MD5 sum: 5d65d66191080c144437a6c854e17868
Man-pages (3.59) - 1,172 KB:
MD5 sum: d8e4d8287a76ee861351b905044c8e92
MPC (1.0.2) - 619 KB:
MD5 sum: 68fadff3358fb3e7976c7a398a0af4c3
MPFR (3.1.2) - 1,049 KB:
MD5 sum: e3d203d188b8fe60bb6578dd3152e05c
Ncurses (5.9) - 2,760 KB:
MD5 sum: 8cb9c412e5f2d96bc6f459aa8c6282a1
Patch (2.7.1) - 660 KB:
MD5 sum: e9ae5393426d3ad783a300a338c09b72
Perl (5.18.2) - 13,730 KB:
MD5 sum: d549b16ee4e9210988da39193a9389c1
Pkg-config (0.28) - 1,892 KB:
MD5 sum: aa3c86e67551adc3ac865160e34a2a0d
Procps (3.3.9) - 548 KB:
MD5 sum: 0980646fa25e0be58f7afb6b98f79d74
Psmisc (22.20) - 422 KB:
MD5 sum: a25fc99a6dc7fa7ae6e4549be80b401f
Readline (6.2) - 2,225 KB:
MD5 sum: 67948acb2ca081f23359d0256e9a271c
Sed (4.2.2) - 1,035 KB:
MD5 sum: 7ffe1c7cdc3233e1e0c4b502df253974
Shadow (4.1.5.1) - 3,428 KB:
MD5 sum: ae66de9953f840fb3a97f6148bc39a30
Sysklogd (1.5) - 85 KB:
MD5 sum: e053094e8103165f98ddafe828f6ae4b
Sysvinit (2.88dsf) - 108 KB:
MD5 sum: 6eda8a97b86e0a6f59dabbf25202aa6f
Tar (1.27.1) - 1,835 KB:
MD5 sum: e0382a4064e09a4943f3adeff1435978
Tcl (8.6.1) - 8,551 KB:
MD5 sum: aae4b701ee527c6e4e1a6f9c7399882e
Time Zone Data (2013i) - 214 KB:
MD5 sum: 8bc69eb75bea496ebe1d5a9ab576702d
Texinfo (5.2) - 3,724 KB:
MD5 sum: cb489df8a7ee9d10a236197aefdb32c5
Systemd (208) - 2,328 KB:
MD5 sum: df64550d92afbffb4f67a434193ee165
Udev-lfs Tarball (208) - 29 KB:
MD5 sum: c0231ff619e567a9b11f912d8a7a404a
Util-linux (2.24.1) - 3,461 KB:
MD5 sum: 88d46ae23ca599ac5af9cf96b531590f
Vim (7.4) - 9,632 KB:
Home page: http://www.vim.org
MD5 sum: 607e135c559be642f210094ad023dc65
Xz Utils (5.0.5) - 894 KB:
MD5 sum: aa17280f4521dbeebed0fbd11cd7fa30
Zlib (1.2.8) - 441 KB:
MD5 sum: 28f1205d8dd2001f26fec1e8c2cebe37
Total size of these packages: about 322 MB

LVM2 what allows using multiple partitions of hard drive.

LVM2-2.02.105

Introduction to LVM2

The LVM2 package is a package that manages logical partitions. It allows spanning of file systems across multiple physical disks and disk partitions and provides for dynamic growing or shrinking of logical partitions.
This package is known to build and work properly using an LFS-7.5 platform.

Package Information

  • Download MD5 sum: b5b3540661fc70bf329b526c1cfbcf3a
  • Download size: 1.4 MB
  • Estimated disk space required: 24 MB (additional 2 MB to run the test suite)
  • Estimated build time: 0.3 SBU (additional 3.6 SBU to run the test suite)

LVM2 Dependencies

Optional

mdadm-3.3 (for checks) and xfsprogs-3.1.11 (for checks)

Kernel Configuration

Enable the following option in the kernel configuration and recompile the kernel:
[Note] 

Note

There are several other Device Mapper options in the kernel beyond those listed below. In order to get reasonable results if running the regression tests, all must be enabled either internally or as a module.
Device Drivers --->
  Multiple devices driver support (RAID and LVM): Y
    Device mapper support: Y or M
    Crypt target support: (optional)
    Snapshot target: (optional)
    Mirror target: (optional) 

Installation of LVM2

Install LVM2 by running the following commands:
sed -i s/CPPFunction/rl_completion_func_t/ tools/lvm.c &&
./configure --prefix=/usr       \
            --exec-prefix=      \
            --with-confdir=/etc \
            --enable-applib     \
            --enable-cmdlib     \
            --enable-pkgconfig  \
            --enable-udev_sync &&
make
The check command must be run as the root user. Also the tests are known to hang if at least one partition on a hard drive is not set up as a Linux LVM partition (type 8e00). To test the results, issue: make check as the root user.
Now, as the root user:
make install

Command Explanations

sed -i s/CPPFunction/rl_completion_func_t/ tools/lvm.c: Corrects the use of a deprecated typedef.
--enable-applib: This switch enables building of the shared application library.
--enable-cmdlib: This switch enables building of the shared command library. It is required when building the event daemon.
--enable-pkgconfig: This switch enables installation of pkg-config support files.
--enable-udev_sync: This switch enables synchronisation with Udev processing.
--enable-dmeventd: This switch enables building of the Device Mapper event daemon.

Contents

Installed Programs:blkdeactivate, dmeventd (optional), dmsetup, fsadm, lvm, lvmconf, lvmdump, vgimportclone. There are also numerous symbolic links to lvm that implement specific functionality.
Installed Libraries:libdevmapper.so, liblvm2app.so and liblvm2cmd.so; optional: libdevmapper-event.so, libdevmapper-event-lvm2.so, libdevmapper-event-lvm2mirror.so, libdevmapper-event-lvm2snapshot.so, libdevmapper-event-lvm2raid.so, libdevmapper-event-lvm2thin.so and some under /lib/device-mapper
Installed Directories:/etc/lvm and /lib/device-mapper (optional)

Short Descriptions

blkdeactivate
utility to deactivate block device.
dmeventd
(optional) is the Device Mapper event daemon.
dmsetup
is a low level logical volume management tool.
fsadm
is an utility used to resize or check filesystem on a device.
lvm
provides the command-line tools for LVM2. Commands are implemented via sympolic links to this program to manage physical devices (pv*), volume groups (vg*) and logical volumes (lv*).
lvmconf
is a script that modifies the locking configuration in the LVM2 configuration file.
lvmdump
is a tool used to dump various information concerning LVM2.
vgimportclone
is used to import a duplicated VG (e.g. hardware snapshot).
libdevmapper.so
contains the Device Mapper API functions.
Last updated on 2014-03-07 15:12:35 +0000

FUSE something that creates file systems.

Fuse-2.9.3

Introduction to Fuse

FUSE (Filesystem in Userspace) is a simple interface for userspace programs to export a virtual filesystem to the Linux kernel. Fuse also aims to provide a secure method for non privileged users to create and mount their own filesystem implementations.
This package is known to build and work properly using an LFS-7.5 platform.

Package Information

Kernel Configuration

Enable the following options in the kernel configuration and recompile the kernel if necessary:
File systems  --->
  [*] FUSE (Filesystem in Userspace) support

Installation of Fuse

[Note] 

Note

After the configure script has finished you will see a warning shown below. You can safely disregard this warning.
configure: WARNING:
******************************************************************
* Please install util-linux version 2.18 or later which supports *
* --fake and --no-canonicalize options in mount and umount       *
******************************************************************
Install Fuse by running the following commands:
./configure --prefix=/usr --disable-static INIT_D_PATH=/tmp/init.d &&
make
If you have Doxygen-1.8.6 installed and wish to build the API documentation, issue doxygen doc/Doxyfile.
This package does not come with a test suite.
Now, as the root user:
make install &&

mv -v   /usr/lib/libfuse.so.* /lib &&
ln -sfv ../../lib/libfuse.so.2.9.3 /usr/lib/libfuse.so &&
rm -rf  /tmp/init.d &&

install -v -m755 -d /usr/share/doc/fuse-2.9.3 &&
install -v -m644    doc/{how-fuse-works,kernel.txt} \
                    /usr/share/doc/fuse-2.9.3
If you built the API documentation, install it as the root user by issuing the following commands:
install -v -m755 -d /usr/share/doc/fuse-2.9.3/api &&
install -v -m644    doc/html/* \
                    /usr/share/doc/fuse-2.9.3/api

Command Explanations

--disable-static: This switch prevents installation of static versions of the libraries.
INIT_D_PATH=/tmp/init.d: This parameter installs the bootscript into /tmp/init.d as a bootscript is not required.
mv -v /usr/lib/libfuse.so.* /lib: This moves the FUSE library to the root filesystem so that it is available early in the boot process in case /usr is mounted on a separate partition and ntfs-3g-2014.2.15 is built with a system-installed version of FUSE.
rm -rf /tmp/init.d: This removes the unneeded bootscript.

Configuring fuse

Config Files

Some options regarding mount policy can be set in the file /etc/fuse.conf. To install the file run the following command as the root user:
cat > /etc/fuse.conf << "EOF"
# Set the maximum number of FUSE mounts allowed to non-root users.
# The default is 1000.
#
#mount_max = 1000

# Allow non-root users to specify the 'allow_other' or 'allow_root'
# mount options.
#
#user_allow_other
EOF
Additional information about the meaning of the configuration options are found in the man page.

Contents

Installed Programs:fusermount, mount.fuse, and ulockmgr_server
Installed Libraries:libfuse.so and libulockmgr.so
Installed Directory:/usr/include/fuse

Short Descriptions

fusermount
is a set users ID root program to mount and unmount Fuse filesystems.
mount.fuse
is the command mount would call to mount a Fuse filesystem.
ulockmgr_server
is the Userspace Lock Manager Server for Fuse filesystems.
libfuse.so
contains the FUSE API functions.
libulockmgr.so
contains the Userspace Lock Manager API functions.
Last updated on 2014-02-17 23:16:31 +0000

INITRAMFS something that loads linux kernel.

About initramfs

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.
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 significantly longer, if an initramfs is used.
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.
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.

Building an initramfs

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 the LFS Hints or dracut.
To install these scripts, run the following commands as the root user:
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 mkdir mknod mount "
binfiles="$binfiles umount sed sleep ln rm uname"

sbinfiles="udevadm modprobe blkid switch_root"

#Optional files and locations
for f in mdadm udevd; do
  if [ -x /sbin/$f ] ; then sbinfiles="$sbinfiles $f"; fi
done

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
if [ -f /etc/udev/udev.conf ]; then
  cp /etc/udev/udev.conf $WDIR/etc/udev/udev.conf
fi

for file in $(find /etc/udev/rules.d/ -type f) ; do
  cp $file $WDIR/etc/udev/rules.d
done

# Install any firmware present
cp -a /lib/firmware $WDIR/lib

# Copy the RAID configureation file if present
if [ -f /etc/mdadm.conf ] ; then
  cp /etc/mdadm.conf $WDIR/etc
fi

# Install the init file
install -m0755 $DATADIR/$INITIN $WDIR/init

if [  -n "$KERNEL_VERSION" ] ; then
  if [ -x /bin/kmod ] ; then
    binfiles="$binfiles kmod"
  else
    binfiles="$binfiles lsmod"
    sbinfiles="$sbinfiles insmod"
  fi
fi

# 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 dmsetup"; fi

for f in $sbinfiles ; do
  ldd /sbin/$f | sed "s/\t//" | cut -d " " -f1 >> $unsorted
  copy $f sbin
done

# Add udevd libraries if not in /sbin
if [ -x /lib/udev/udevd ] ; then
  ldd /lib/udev/udevd | sed "s/\t//" | cut -d " " -f1 >> $unsorted
fi

# Add module symlinks if appropriate
if [ -n "$KERNEL_VERSION" ] && [ -x /bin/kmod ] ; then
  ln -s kmod $WDIR/bin/lsmod
  ln -s kmod $WDIR/bin/insmod
fi

# Add lvm symlinks if appropriate
# Also copy the lvm.conf file
if  [ -x /sbin/lvm ] ; then
  ln -s lvm $WDIR/sbin/lvchange
  ln -s lvm $WDIR/sbin/lvrename
  ln -s lvm $WDIR/sbin/lvextend
  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/vgchange
  ln -s lvm $WDIR/sbin/vgcreate
  ln -s lvm $WDIR/sbin/vgscan
  ln -s lvm $WDIR/sbin/vgrename
  ln -s lvm $WDIR/sbin/vgck
  # Conf file(s)
  cp -a /etc/lvm $WDIR/etc
fi

# Install libraries
sort $unsorted | uniq | while read library ; do
  if [ "$library" == "linux-vdso.so.1" ] ||
     [ "$library" == "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

  cp /lib/modules/$KERNEL_VERSION/modules.{builtin,order}                     \
            $WDIR/lib/modules/$KERNEL_VERSION

  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

chmod 0755 /sbin/mkinitramfs
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-label/$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
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 location depends on version
if [ -x /sbin/udevd ]; then
  UDEV_PATH=/sbin
else
  UDEV_PATH=/lib/udev
fi

${UDEV_PATH}/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 ${UDEV_PATH}/udevd

exec switch_root /.root "$init" "$@"

EOF

Using an initramfs

Required Runtime Dependency

To build an initramfs, run the following as the root user:
mkinitramfs [KERNEL VERSION]
The optional argument is the directory where the appropriate kernel modules are located. This must be a subdirectory of /lib/modules. If no modules are specified, then the initramfs is named initrd.img-no-kmods. If a kernel version is specified, the initrd is named initrd.img-$KERNEL_VERSION and is only appropriate for the specific kernel specified. The output file will be placed in the current directory.
After generating the initrd, copy it to the /boot directory.
Now edit /boot/grub/grub.cfg and add a new menuentry. Below are several examples.
# 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
}
# 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
}
# 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
}
Finally, reboot the system and select the desired system.