You are not logged in.

#1 2006-01-10 23:17:45

hiower4
Member
Registered: 2004-07-31
Posts: 38

lvm support for / (root) in mkinitrd

Hello everyone!

I have extended the current mkinitrd (1.01-25) to include support for lvm root devices.

  steps:
* apply the underneath patch in /var/abs/base/mkinitrd/
* make a copy of root on an lvm device
* update fstab on that copy
* in /etc/rc.sysinit add --mknodes to the line

        /sbin/lvm vgscan --ignorelockingfailure

* mkinitrd --lvm-root --root-device=/dev/vg0/root auto
* change /boot/grub/menu.lst accordingly ( initrd26-lvm.img )

I'd recommend you to save your old root, along with grub entry, at least in the beginning, just in case.

  unsolved problems
* with the current initscripts the root volumegroup is not deactivated at shutdown
* update of initscripts revert /etc/rc.sysinit -> all device nodes for lvm devices are not created at startup. No problem for root, but for all other lvm-partitions.

  Patch

diff -ru /var/abs/base/mkinitrd/PKGBUILD patch_work/PKGBUILD
--- /var/abs/base/mkinitrd/PKGBUILD    2006-01-03 16:19:15.000000000 +0200
+++ patch_work/PKGBUILD    2006-01-11 01:05:27.000000000 +0200
@@ -2,16 +2,18 @@
 # Maintainer: Tobias Powalowski <tpowa@archlinux.org> 
 pkgname=mkinitrd 
 pkgver=1.01
+lvm_pkgver=2.01.15
 pkgrel=25
-pkgdesc="A tool to create the initrd image" 
+pkgdesc="A tool to create the initrd image, with lvm root support" 
 url="http://www.busybox.org/" 
 depends=('bash')  
 backup=('etc/mkinitrd.conf')
 source=(http://www.busybox.net/downloads/busybox-$pkgver.tar.bz2 
+        ftp://sources.redhat.com/pub/lvm2/LVM2.$lvm_pkgver.tgz 
         bb-mkrootdev.patch mkinitrd config mkinitrd.conf) 
-md5sums=('f250842dae2854a38470ed16a46bba66' '00e92e5dca9749b3a18b1c5af448eca7'
-         '64b3353690d05b375ffcc5fc6a05366c' '92465f79f20fd0bd9d503a921c605165'
-         'ecf76ecf376d15090a2176f01ecd2f94')
+md5sums=('f250842dae2854a38470ed16a46bba66' 'c71654baff263254fb5a226624ee8ef3'
+         '00e92e5dca9749b3a18b1c5af448eca7' '82ba491b30b09c9608b136bb9ea23cf1'
+         '92465f79f20fd0bd9d503a921c605165' 'ecf76ecf376d15090a2176f01ecd2f94')
 
 build() { 
   cd $startdir/src/busybox-$pkgver
@@ -19,8 +21,15 @@
   cp ../config .config
   make -j1 OPTIMIZATION="${CFLAGS}"
   install -D -m 755 busybox $startdir/pkg/sbin/busybox
+  
+  cd $startdir/src/LVM2.$lvm_pkgver
+  ./configure --prefix=/usr --sysconfdir=/etc  --localstatedir=/var 
+   --enable-static_link
+  make || return 1
+  install -D -m 755 tools/lvm.static $startdir/pkg/sbin/lvm.static
+  install -D -m 644 doc/example.conf $startdir/pkg/etc/lvm/lvm.conf.initrd
+  
   install -D -m 755 $startdir/src/mkinitrd $startdir/pkg/sbin/mkinitrd
   install -D -m 644 $startdir/src/mkinitrd.conf $startdir/pkg/etc/mkinitrd.conf
   mkdir -p $startdir/pkg/initrd
 }
-
diff -ru /var/abs/base/mkinitrd/mkinitrd patch_work/mkinitrd
--- /var/abs/base/mkinitrd/mkinitrd    2006-01-03 16:19:15.000000000 +0200
+++ patch_work/mkinitrd    2006-01-11 01:04:11.000000000 +0200
@@ -49,6 +49,8 @@
     echo "    --dm                     exclude device mapper modules"
     echo "    --remove-module=MODULE   exclude MODULE"
     echo "    --add-module=MODULE      include MODULE"
+    echo "    --lvm-root               / (root) is a logical lvm device"
+    echo "    --root-device=ROOT_DEV   use ROOT_DEV as root instead of fstab entry"
     echo "    --root-dir=ROOT_DIR      look for modules in ROOT_DIR/lib/modules"
     echo "                             instead of /lib/modules"
     echo "    --quiet                  no status output during initrd generation"
@@ -184,6 +186,10 @@
             ROOT_DEVICE="`echo $1 | awk -F= '{print $2;}'`"
             ;;
 
+        lvm-root|--lvm-root)
+            LVM_ROOT=true
+            ;;
+
         --root-dir=*)
             ROOT_DIR="`echo $1 | awk -F= '{print $2;}'`"
             ;;
@@ -245,6 +251,11 @@
     ROOT_DEVICE="$(awk '/^[ t]*[^#]/ { if ($2 == "/") { print $1; }}' /etc/fstab)"
 fi
 
+if [ "$LVM_ROOT" == true ]; then
+    REMOVE_DM="0"
+    KERNEL_INITRD=$KERNEL_INITRD-lvm
+fi
+
 #
 # Module Files
 #
@@ -647,6 +658,12 @@
 ln busybox $MOUNT_IMAGE/bin/sleep
 ln busybox $MOUNT_IMAGE/bin/sh
 ln busybox $MOUNT_IMAGE/bin/test
+# add lvm tools (needed for root)
+if [ "$LVM_ROOT" == true ]; then
+    cp -a /sbin/lvm.static $MOUNT_IMAGE/bin/lvm
+    mkdir -p $MOUNT_IMAGE/etc/lvm
+    cp -a /etc/lvm/lvm.conf.initrd $MOUNT_IMAGE/etc/lvm/lvm.conf
+fi
 # add filesystem check to avoid VFS warnings during boot
 if [ -f /sbin/fsck.static ]; then
     cp -a /sbin/fsck.static $MOUNT_IMAGE/bin/fsck
@@ -774,9 +791,18 @@
         echo 'fi' >>$LINUXRC
     fi
 fi
-#echo "ROOT_DEV=`cat /proc/cmdline | awk -Froot= '{print $2}' | awk '{print $1}'`" >>$LINUXRC
-echo "ROOT_DEV=/dev/root" >>$LINUXRC
-echo "mkrootdev /dev/root" >>$LINUXRC
+# set up LVM root device
+if [ "$LVM_ROOT" == true ]; then
+    echo "echo Scanning logical volumes" >>$LINUXRC
+    echo "lvm vgscan --ignorelockingfailure" >>$LINUXRC
+    echo "echo Activating logical volumes" >>$LINUXRC
+    echo "lvm vgchange --ignorelockingfailure -ay" >>$LINUXRC
+    echo "ROOT_DEV=$ROOT_DEVICE" >>$LINUXRC
+else
+    #echo "ROOT_DEV=`cat /proc/cmdline | awk -Froot= '{print $2}' | awk '{print $1}'`" >>$LINUXRC
+    echo "ROOT_DEV=/dev/root" >>$LINUXRC
+    echo "mkrootdev /dev/root" >>$LINUXRC
+fi
 echo "echo 0x0100 > /proc/sys/kernel/real-root-dev" >>$LINUXRC
 if [ "$HAVE_FSCK" = "1" ]; then
     echo "mount -t `/bin/fsck -NT $ROOT_DEV | awk -Ffsck. '{print $2}' | awk '{print $1}'` -n -o ro $ROOT_DEV /new_root" >>$LINUXRC
@@ -784,13 +810,13 @@
     echo "mount -t auto -n -o ro $ROOT_DEV /new_root" >>$LINUXRC
 fi
 echo "pivot_root /new_root /new_root/initrd" >> $LINUXRC
-echo "umount /initrd/sys" >> $LINUXRC
-echo "umount /initrd/proc" >> $LINUXRC
+echo "/sbin/busybox umount /initrd/sys" >> $LINUXRC
+echo "/sbin/busybox umount /initrd/proc" >> $LINUXRC
 # fix libata for using atapi enabled
 sed -i -e 's:(libata.ko):1 atapi_enabled=1:' $LINUXRC
 chmod +x $LINUXRC
 
-echo "echo "Initial RAMDISK Loading Completed..."" >> $LINUXRC
+echo "/sbin/busybox echo "Initial RAMDISK Loading Completed..."" >> $LINUXRC
 
 # Unmount and Compress initrd
 #
@@ -841,9 +867,9 @@
     echo ""
     echo "        image=/boot/vmlinuz26"
     echo "            label=arch"
-    echo "            root=/dev/hda3"
+    echo "            root=$ROOT_DEVICE"
     echo "            read-only"
-    echo "            initrd=/boot/initrd26.img"
+    echo "            initrd=/boot/$KERNEL_INITRD.img"
     echo ""
 fi
 

Enjoy! And thanks for any feedback  smile

Niklas Paro

[edit] I included a warning earlier that there was a bug, but it was false alarm. Just me who must have missed some of my own instructions smile[/edit]


#348498 +(4737)- [X]

<MasterG> .....................................................................
          ..................................
<judas> where's pacman when you need him?

Offline

#2 2006-02-01 01:18:43

benoitc
Member
Registered: 2004-11-11
Posts: 62
Website

Re: lvm support for / (root) in mkinitrd

Hi, I just fixed your addition to mknitrd and script. It should works fine now. You can find all patch here :

http://bugs.archlinux.org/task/3878

Offline

Board footer

Powered by FluxBB