This CD is based of CentOS 4.4 (http://www.centos.org) In addition to CentOS packages file system drivers unionfs, SquashFS.
The following non-open source software is installed on the LiveCD.
Dell_SAS_RAID_Storage_Manager-1.18-00 (Download Link: ftp://ftp.us.dell.com/sysman/SSM_Linux_1.18-00.tar.gz
ftp://ftp.jp.dell.com/sysman/SSM_Linux_1.18-00.tar.gz ftp://ftp.euro.dell.com/sysman/SSM_Linux_1.18-00.tar.gz ftp://ftp.dell.com/sysman/SSM_Linux_1.18-00.tar.gz )
dell-pediags-2.7.0-193 (Download Link: ftp://ftp.us.dell.com/diags/dell-pediags-linux-2.7.0.193-A01.tar.gz
ftp://ftp.jp.dell.com/diags/dell-pediags-linux-2.7.0.193-A01.tar.gz ftp://ftp.euro.dell.com/diags/dell-pediags-linux-2.7.0.193-A01.tar.gz ftp://ftp.dell.com/diags/dell-pediags-linux-2.7.0.193-A01.tar.gz )
All these are in the OM_5.1_ManNode_LIN_A00.tar.gz package available on http://support.dell.com.
srvadmin-cm-5.1.0-354 srvadmin-omilcore-5.1.0-354 srvadmin-deng-5.1.0-354 srvadmin-odf-5.1.0-354 srvadmin-jre-5.1.0-354 instsvc-drivers-5.1.0-354 srvadmin-isvc-5.1.0-354 srvadmin-omhip-5.1.0-354 srvadmin-ipmi-5.1.0-354.rhel4 srvadmin-hapi-5.1.0-354 srvadmin-omacore-5.1.0-354 srvadmin-iws-5.1.0-354 srvadmin-old-5.1.0-354
(Download link: ftp://ftp.us.dell.com/sysman/OM_5.1_ManNode_LIN_A00.tar.gz
ftp://ftp.jp.dell.com/sysman/OM_5.1_ManNode_LIN_A00.tar.gz ftp://ftp.euro.dell.com/sysman/OM_5.1_ManNode_LIN_A00.tar.gz ftp://ftp.dell.com/sysman/OM_5.1_ManNode_LIN_A00.tar.gz )
srvadmin-storage-5.1.0-392 (Download link: ftp://ftp.us.dell.com/sysman/srvadmin-storage-5.1.0-392.i386.rpm
ftp://ftp.jp.dell.com/sysman/srvadmin-storage-5.1.0-392.i386.rpm ftp://ftp.euro.dell.com/sysman/srvadmin-storage-5.1.0-392.i386.rpm ftp://ftp.dell.com/sysman/srvadmin-storage-5.1.0-392.i386.rpm )
Available source code is in the “SRPMS” folder, patches and dev.tar.gz is in the “files” folder.
A quick How-To describing how this CD came to life:
This how-to is heavily based on this Gentoo LiveCD how-to - http://forums.gentoo.org/viewtopic-t-410389.html
First a short description on how the CD works:
And now some more details:
NOTE! I wrote this how-to from memory; it is possible that I have missed something.
1. Install a build environment; I used CentOS 4.4 and chose to install all development packages in the build environment. 2. We need to add SquashFS and UnionFS support.
Source RPM's for UnionFS and SquashFS can be downloaded here: ftp://ftp.psi.ch/psi/livecd/SRPMS
- Install src.rpm's with rpm -i <pacage-name>. - Go to /usr/src/redhat/SPECS/ - Run command $ rpmbuild -ba –target=i686 unionfs.spec - Run command $ rpmbuild -ba –target=i686 squashfts.spec
This will build the driver for the running kernel. If you are running a different kernel look in the .spec files to se how you can build for a different kernel.
Now install the rpm's we just built. $ cd /usr/src/redhat/RPMS/i686 $ rpm -Uhv kernel-module-squashfs-<kernel-release>.sl4.psi.i686.rpm $ rpm -Uhv squashfs-3.1.2-1.sl4.psi.i686.rpm $ rpm -Uhv –nodeps unionfs-1.1.5-2.sl4.psi.i686.rpm $ rpm -Uhv kernel-module-unionfs-<kernel-release>.sl4.psi.i686.rpm
NOTE: The kernel-module-unionfs package and the unionfs package is dependen of each other so we get a “chicken or the egg” situation. Just install one of the packages with the –nodeps options, then install the other package afterwards.
3. We need to build openipmi drivers for OMSA.
Install DKMS $ rpm -i dkms-2.0.13-1.noarch.rpm $ rpm -i openipmi-33.13.RHEL4-1dkms.noarch.rpm $ dkms mkrpm -m openipmi -v 33.13.RHEL4
An rpm package with module built for your running kernel is created in /usr/src/redhat/RPMS/noarch/.
5. Creat another installation of CentOS on a nother system, or a dual boot environment.
6. Install dkms and openipmi drivers using the rpm created previously in the build environment.
7. Installed the following software in the LiveCD environment.
OMSA 5.1 (OM_5.1_ManNode_LIN_A00.tar.gz) OMSA Storage patch. (srvadmin-storage-5.1.0-392.i386.rpm) Dell PowerEdge Diagnostics (dell-pediags-linux-2.7.0.193-A01.tar.gz) Dell SAS RAID Storage Manager (SSM_Linux_1.18-00.tar.gz)
8. To make networking work on all systems
We need to edit the following file:
/etc/sysconfig/network-scripts/ifcfg-eth0
Remove the line with the MAC address.
(I also created ifcfg-ethX files for 3 additional NIC's.)
9. Apply the following patch to rc.sysinit. This will add autoconfiguration of X and a prompt for root's password during boot. (The patch is available in “files” directory.)
--- /etc/rc.d/rc.sysinit 2006-11-22 10:08:57.000000000 +0100 +++ /mnt/livecd/etc/rc.d/rc.sysinit 2006-11-30 06:05:01.000000000 +0100 @@ -975,6 +975,16 @@ #} #fi +# Autoconfigure xorg.conf +echo "Autoconfiguring X Windows" +system-config-display --noui --reconfig --set-resolution=1024x768 + +# Ask user to set the root's password +echo "" +echo "Please set the password for root: " +passwd root + + # Let rhgb know that we're leaving rc.sysinit if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then /usr/bin/rhgb-client --sysinit
10. I also commented a lot of /etc/init.d/halt to disable umount during shutdown. See patch file halt.diff in “files” directory.
Ugly, but effective… :)
11. Edit /etc/fstab
The /etc/fstab file should include only the following:
unionfs / unionfs defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 none /dev/shm tmpfs defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0
12. Create the initrd (Initial ram drive.)
Reboot to the build environment.
Creating the initrd
$ dd if=/dev/zero of=initrd BS=1M count=8 $ mke2fs initrd $ mkdir /mnt/loop $ mount -o loop initrd /mnt/loop
$ mkdir etc dev lib bin proc new cdrom static dynamic union $ touch linuxrc $ chmod +x linuxrc $ touch etc/mtab $ touch etc/fstab
cat chroot insmod mkdir mount pivot_root sh tar umount usleep
To figure out what files should go in /mnt/loop/lib (The initrd /lib directory) use the ldd command.
Example: $ ldd /bin/sh
Will output:
linux-gate.so.1 => (0xffffe000) libreadline.so.5 => /lib/libreadline.so.5 (0xb7f72000) libhistory.so.5 => /lib/libhistory.so.5 (0xb7f6b000) libncurses.so.5 => /lib/libncurses.so.5 (0xb7f33000) libdl.so.2 => /lib/libdl.so.2 (0xb7f2f000) libc.so.6 => /lib/libc.so.6 (0xb7e42000) /lib/ld-linux.so.2 (0xb7fad000)
So, sh need the above list of libraries to run, copy them into place.
NOTE! Ignore linux-gate.so.1
In addition to this wee need to copy our unionfs drive module and the modules.dep file into /lib
$ cp /lib/modules/'uname -r'/kernel/fs/unionfs.ko /mnt/loop/lib $ cp /lib/modules/'uname -r'/kernel/fs/squashfs.ko /mnt/loop/lib $ cp /lib/modules/'uname -r'/kernel/drivers/block/loop.ko /mnt/loop/lib $ cp /lib/modules/<kernel>/modules.dep /mnt/loop/lib
Populate the /dev directory in our initial ram disk:
$ mknod /mnt/loop/dev/console c 5 1 $ mknod /mnt/loop/dev/null c 1 3 $ mknod /mnt/loop/dev/hda b 3 0 $ mknod /mnt/loop/dev/hdb b 3 64 $ mknod /mnt/loop/dev/hdc b 22 0 $ mknod /mnt/loop/dev/hdd b 22 64 $ mknod /mnt/loop/dev/scd0 b 11 0 $ mknod /mnt/loop/dev/scd1 b 11 1 $ mknod /mnt/loop/dev/scd2 b 11 2 $ mknod /mnt/loop/dev/scd3 b 11 3 $ mknod /mnt/loop/dev/sda b 8 0 $ mknod /mnt/loop/dev/sdb b 8 16 $ mknod /mnt/loop/dev/sdc b 8 32 $ mknod /mnt/loop/dev/sdd b 8 48 $ mknod /mnt/loop/dev/sde b 8 64 $ mknod /mnt/loop/dev/sdf b 8 80 $ mknod /mnt/loop/dev/tty c 4 0 $ mknod /mnt/loop/dev/loop0 b 7 0
Create/Edit the linuxrc script that will find the CD, mount the file systems and execute init in the end:
#!/bin/sh export PATH=/bin echo "Wait 5 seconds for slower USB CD-ROM devices to be detected..." for x in 1 2 3 4 5 do usleep 1000000 echo -n " $x" done echo "" for x in hda hdb hdc hdd sda sdb sdc sdd sde sdf scd0 scd1 scd2 scd3 do mount -t iso9660 /dev/${x} /cdrom if [ "$?" == "0" ] then CDROM=${x} break fi done if [ "${CDROM}" == "" ] then echo "FATAL --- LIVECD NOT FOUND" exec /bin/sh exit fi echo "LiveCD found in /dev/${CDROM}" insmod /lib/loop.ko insmod /lib/squashfs.ko insmod /lib/unionfs.ko mount -t squashfs -o loop /cdrom/livecd.squashfs /static mount -t tmpfs -o size=300M none /dynamic mount -t unionfs -o dirs=/dynamic=rw:/static=ro unionfs /union cd /union /bin/pivot_root . initrd mount --move /initrd/dynamic /mnt/dynamic mount --move /initrd/static /mnt/static mount --move /initrd/cdrom /mnt/cdrom mount -t tmpfs -o size=50M none /tmp mount -t proc none /proc cat /proc/mounts > /etc/mtab umount /proc exec /usr/sbin/chroot . /bin/sh <<- EOF >dev/console umount /initrd echo "Startng init!" exec /sbin/init EOF
Finally we need to unmount the initrd, and compress it with gzip.
$ ummount /mnt/loop $ gzip initrd
13. We need to copy out bzImage, ISOLINUX and initrd into what will be the BOOT directory on the CD
$ mkdir boot $ mkdir boot/isolinux $ cp <path-to-isolinux.bin> boot/isolinux/ $ touch boot/isolinux/isolinux.cfg $ cp initrd.gz boot/isolinux/ $ cp /boot/'uname -r' boot/isolinux/vmlinuz
14. Edit the isolinux.cfg file:
timeout 1 default Linux
label Linux kernel vmlinuz append initrd=initrd.gz init=/linuxrc root=/dev/ram0
15. Preparing the CDROOT directory
$ mkdir cdroot $ cp -a boot cdroot/
16. Before we create the squashfs filesystem we need to populate /dev on the LiveCD install.
mount /dev/(s/h)dXX /mnt/livecd tar xvzf dev.tar.gz -C /mnt/livecd
(dev.tar.gz is available in the “files” folder.)
17. Creating the SquashFS file system
$ cd cdroot/ $ mksquashfs /mnt/livecd livecd.squashfs $ cd ..
18. Create a bootable CD ISO image using mkisofs
$ mkisofs -R -b boot/isolinux/isolinux.bin -no-emul-boot -boot-load-size \ 4 -boot-info-table -c boot/isolinux/boot.cat -iso-level 3 -o livecd.iso cdroot/
Once this ISO I created it is time to burn it to a CD and test it.