I have compiled nwipe open source utility in Centos. Once compiled it works absolutely fine on the machine where it was compiled. I have also copied the compiled package to another machine running Centos along with required libraries and it works fine.
I have tried to package this utility to work with Busybox RAMBOX embedded linux. The purpose of this utility is to PXEBoot the workstations via TFTP and auto wipe all the hard-drives.
In order to achieve this, I have used Linux kernel from Centos netboot CD and downloaded the busybox, copied nwipe utility that I compiled on another Centos development server.
I also copied all the required libraries. See below.
when I do ldd nwipe. It shows the dependencies for the libraries.
[root@localhost src]# ldd nwipe linux-gate.so.1 => (0x00a78000) libpthread.so.0 => /lib/libpthread.so.0 (0x00650000) libparted.so.2 => /usr/lib/libparted.so.2 (0x007fd000) libpanel.so.5 => /usr/lib/libpanel.so.5 (0x00dd0000) libncurses.so.5 => /lib/libncurses.so.5 (0x006db000) libc.so.6 => /lib/libc.so.6 (0x004b0000) libtinfo.so.5 => /lib/libtinfo.so.5 (0x007e2000) /lib/ld-linux.so.2 (0x0048a000) libuuid.so.1 => /lib/libuuid.so.1 (0x0025b000) libdl.so.2 => /lib/libdl.so.2 (0x00649000) libdevmapper.so.1.02 => /lib/libdevmapper.so.1.02 (0x0073c000) libselinux.so.1 => /lib/libselinux.so.1 (0x006ba000) libsepol.so.1 => /lib/libsepol.so.1 (0x00a2e000) libudev.so.0 => /lib/libudev.so.0 (0x0066d000)
so I copied all these libraries dependencies to the busybox /lib /usr/lib folders.
Finally I compiled the busybox and used cpio and gzip to get the initrd.img file.
Then I use centos netboot kernel 2.6 and initrd.img to pxeboot the workstation. Everything works fine, I can use all the busybox basic linux commands. But when I execute ./nwipe it does not work. It simply shows the shell prompt again.
/# ./nwipe /#
see below the content of my init file.
#!/bin/sh #Mount things needed by this script mount -t proc proc /proc mount -t sysfs sysfs /sys #Disable kernel messages from popping onto the screen echo 0 > /proc/sys/kernel/printk #Clear the screen clear #Create all the symlinks to /bin/busybox busybox --install -s #Create device nodes mknod /dev/null c 1 3 mknod /dev/tty c 5 0 mdev -s #Function for parsing command line options with "=" in them # get_opt("init=/sbin/init") will return "/sbin/init" get_opt() { echo "$@" | cut -d "=" -f 2 } #Defaults init="/sbin/init" root="/dev/hda1" #Process command line options for i in $(cat /proc/cmdline); do case $i in root=*) root=$(get_opt $i) ;; init=*) init=$(get_opt $i) ;; esac done #Mount the root device mount "${root}" /newroot #Check if $init exists and is executable if [[ -x "/newroot/${init}" ]] ; then #Unmount all other mounts so that the ram used by #the initramfs can be cleared after switch_root umount /sys /proc #Switch to the new root and execute init exec switch_root /newroot "${init}" fi #This will only be run if the exec above failed echo "Failed to switch_root, dropping to a shell" exec sh
Could someone please help me what I have to do to fix this?
How I can run my compiled software with busybox?
Thanks well in advance for reading this post.
Advertisement
Answer
I have managed to fix this by not using busybox. This time around I have used Centos minimal install and used dracut utility to create kernel and initramfs and mounted the root file system as NFS on the server. It works like a charm.
It works like a full blown Linux Centos and it is pretty fast.
Thank you for looking at this post 🙂