Skip to content
Advertisement

nWipe Package compiled in Centos not working in Busybox embedded linux

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 🙂

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement