Social Icons

Pages

Kamis, 26 Februari 2015

Linux User Mode - tinycore linux

Linux user mode adalah virtualisasi linux didalam linux itu sendiri. Virtualisasi lain seperti qemu, virtual box, vmware, bekerja dengan meng-emulasikan lingkungan platform hardware agar OS virtual machine dapat berjalan diatasnya dan pilihan OS menjadi beragam. Linux user mode tidak melakukan emulasi hardware ia menggunakan hardware yang juga digunakan oleh host OS. User mode linux hanya menjalankan linux OS didalam linux OS, ini tidak seperti colinux dimana linux berjalan berdampingan dengan windows OS.

User mode linux berupa kernel linux yang dicompilasi sebagai executable file dan dapat berjalan dengan dipanggil dari command shell host linux. biasanya bernama vmlinux yang adalah hard linked ke file linux.

Ketika  dipanggil vmlinux akan mencari initrd sebagai root disk yang akan digunakan. Initrd biasanya berupa file block device yang didalamnya berisi filesystem ext2 dan linux system.

Berikut akan dijelaskan prosedur kompilasi kernel untuk keperluan User Mode Linux.

spesifikasi platform:
ASUS Laptop X401U
Processor AMD brazo c60
ATI Radeon 6900 Display
memory 2Gb ( 1.649.532 MB)
ArchLinux - bbqlinux


Kebutuhan:
vanila kernel - dapat di ambil dari kernel.org

initrd - saya menggunakan tinycore linux karena distro ini compact, small dan dapat dikustomisasikan.



Prosedur:

1. BLOCK DISK - TINYCORE LINUX ROOTDISK (Initrd)

Downloadlah terlebih dahulu tinycore linux untuk mengetahui versi kernel yang akan digunakan. download dari situs http://distro.ibiblio.org/tinycorelinux/downloads.html. silahkan pilih ukuran distro yang diinginkan. Saya menggunakan distro TinyCore 15 Mb.




Setelah selesai download, buka console shell dan lakukan mount iso file tinycore tersebut ke sebuah folder
$ mkdir coreiso
$ sudo  mount -o loop TinyCore-current.iso coreiso/
$ cp /coreiso/boot/core.gz `pwd`
$ gunzip core.gz

Akan didapat file core dari proses extract gunzip core.gz file core inilah yang akan kita extract sebagai initrd bagi User Mode Linux.

Aagar tidak terlalu banyak working folder, maka unmount coreiso dan selanjutnya copy/move file core kedalam folder coreiso tersebut.

$ sudo umount coreiso
$ mv core coreiso/
$ cd coreiso
$ mkdir initrd
$ cd initrd
$ cpio -i -d < ../core
19279 blocks

Silahkan lihat dengan ls -lra, kita telah medapatkan initrd / root disk dari tiny core linux.


Ingat posisi working directory saat ini, gunakan perintah pwd untuk menampilkan posisi work dir saat ini.

Langkah selanjutnya adalah membuat block device untuk UML. Silahkan pindah working directory setingkat keatas terlebih dahulu. Ada banyak cara untuk membuat block device, bisa dengan dd, atau tools lain, saya menggunakan tool fallocate karena lebih cepat dalam membuat block device. syntaxnya:

fallocate -l  <ukuran>  <nama_file>

$ cd ..
$ fallocate -l 50MB pccorevm

Perintah tersebut akan membuat dummy file berukuran 50MB dengan nama pccorevm.  Selanjutnya buat file system didalam pccorevm tersebut.

$ mke2fs -F pccorevm





Setelah block device selesai dibuat, maka copylah isi folder initrd kedalam block device tersebut. Lakukan mounting pccorevm ke suatu folder temporer.

$ mkdir tmpcore
$ sudo mount -o loop pccorevm tmpcore/
$ sudo cp -r initrd/* tmpcore/


Sekarang kita masuk ke tmpcore (pccorevm) untuk membuat node blockdevice ubd0 dengan menggunakan mknod.

$ cd tmpcore/dev
$ sudo mknod --mode=660 ubd0 b 98 0
$ sudo chown root:disk ubd0

kemudian kita edit file ../etc/fstab --- saya menggunakan mcedit

$ cd ../etc
$ sudo mcedit fstab

beri tanda pagar pada entry yang ada, dan entry baris baru dengan:
 
/dev/ubd0 / ext2 defaults 0 0


tekan F10 untuk exit dan simpan.

selanjutnya silahkan ls -lra ../lib/modules catat nama folder yang muncul, karena itulah versi kernel yang harus kita ambil dari kernel.org.



Untuk diketahui, bahwa rootdisk tinycore linux ini sesungguhnya bekerja dalam mode bootable iso, dan ia sebelumnya benar-benar berupa initrd, maka ada beberapa persesuaian dalam proses init yang harus dilakukan.

untuk mempersingkat saya telah menyesuaikan file etc/init.d/tc-config sebagai berikut:

#!/bin/busybox ash
# RC Script for Tiny Core Linux
# (c) Robert Shingledecker 2004-2012
# Several modifications for speed by Curaga
. /etc/init.d/tc-functions
useBusybox

USER="tc"
TCEDIR="/tmp/tce"
TCEOPT="/tmp/tce/optional"
TCLOOP="/tmp/tcloop"
TCEINSTALLED="/usr/local/tce.installed"
INSTALLED=""
VERSION="$(cat /usr/share/doc/tc/release.txt)"
KERNEL="$(uname -r)"

addUser(){
    echo "${GREEN}Adding user ${YELLOW}$USER ${NORMAL}"
    /bin/adduser -s /bin/sh -G staff -D "$USER"
    echo "$USER":tcuser | /usr/sbin/chpasswd -m
    echo -e "$USER\tALL=NOPASSWD: ALL" >> /etc/sudoers
}

### END functions

# Main

clear                              
echo "${GREEN}Booting ${YELLOW}Core $VERSION ${NORMAL}"
echo "${GREEN}Running Linux Kernel ${YELLOW}$KERNEL${GREEN}.${NORMAL}"
export PATH=/usr/local/sbin:/usr/local/bin:"$PATH"


if [ -n "$HOST" ]; then
    sethostname
else
    /bin/hostname -F /etc/hostname
fi

/sbin/ifconfig lo 127.0.0.1 up
/sbin/route add 127.0.0.1 lo &


if [ -n "$USER" ]; then
    if ! grep "$USER" /etc/passwd >/dev/null; then addUser; fi
else
    USER="tc"
fi
echo "$USER" > /etc/sysconfig/tcuser
mkdir -p /home/"$USER"


# Setup base directories for TCE Applicatons
[ -d "$TCEINSTALLED" ] || mkdir "$TCEINSTALLED"
[ -d "$TCEDIR" ] || mkdir "$TCEDIR"
[ -d "$TCEOPT" ] || mkdir "$TCEOPT"
[ -d "$TCLOOP" ] || mkdir "$TCLOOP"
ln -sf "$TCEDIR" /etc/sysconfig/tcedir
chown "$USER" "$TCEOPT"
chgrp staff "$TCEDIR" "$TCEOPT" "$TCEINSTALLED" "$TCLOOP"
chmod g+w "$TCEDIR" "$TCEOPT" "$TCEINSTALLED" "$TCLOOP"

chmod u+s /bin/busybox.suid /usr/bin/sudo

get_app() {
    LOADER="tce-load -i" ; PKG=optional
    PROTO=$1
    HOST=${2%%/*}
    REST=${2#*/}
    LENG=$((${#HOST}-1)) ; LAST=${HOST:$LENG:1}
    [ "$LAST" == ":" ] && HOST=${HOST:0:$LENG}
    FILE=${REST%:*}
    NAME=${FILE##*/}
    OPTS=${REST#*:}
    [ "$OPTS" == "no-ping" ] && NOPING=1 || NOPING=0
    [ -z "$DHCP_RAN" ] && wait4Server $HOST $NOPING
    (    TCE=/tmp/tce/$PKG
        cd $TCE
        [ "$PROTO" = "TFTP" ] && tftp -g -r $FILE $HOST
        [ "$PROTO" = "HTTP" ] && wget -q http://${HOST}/${FILE}
        [ $SHOWAPPS ] && echo -ne "${BLUE}TFTP Loading Extensions ${YELLOW}"
        dos2unix -u $NAME
        while read FILE FL
        do
            APP=${FILE##*/}
            [ "$PROTO" = "TFTP" ] && tftp -g -r $FILE $HOST
            [ "$PROTO" = "HTTP" ] && wget -q http://${HOST}/${FILE}
            [ $SHOWAPPS ] && echo -ne "$APP "
            su "$USER" -c "$LOADER $FL $TCE/$APP"
            [ "$FL" == "-c" ] && rm $APP
        done < $NAME
        [ $SHOWAPPS ] && echo "${GREEN} Done.${NORMAL}"
        rm $NAME
    )
}


touch /var/tmp/k5_skip
if [ -n "$NBD" ]; then
    modprobe -q nbd
    SERVER=$( echo $NBD | awk -F: '{ print $1 }')
    PORT=$(    echo $NBD | awk -F: '{ print $2 }')
    OPTS=$(   echo $NBD | awk -F: '{ print $3 }')
    [ "$OPTS" == "no-ping" ] && NOPING=1 || NOPING=0
    [ -z "$DHCP_RAN" ] && wait4Server $SERVER $NOPING
    nbd-client $SERVER $PORT /dev/nbd0
    mkdir /mnt/nbd0
    mount /dev/nbd0 /mnt/nbd0 2>&1
    pidof nbd-client nbd0 >> /var/tmp/k5_skip
fi

if grep -q "^/dev/root" /proc/mounts; then
    INSTALLED=1
    echo "${RED}Detected Traditional Hard drive installation.${NORMAL}"
fi

/sbin/ldconfig 2>/dev/null

[ -n "$TEXT" ] && touch /etc/sysconfig/text
[ -n "$XONLY" ] && touch /etc/sysconfig/xonly


if [ -n "$MYHOME" ]; then
    wait $fstab_pid
    PARTITION=${MYHOME##/dev/}
    find_mountpoint "$PARTITION"
    if [ -n "$MOUNTPOINT" ]; then
        [ "$MOUNTED" == "yes" ] || mount "$MOUNTPOINT"

        MS_MNTS=`mount|awk '$5~/fat|vfat|msdos|ntfs/{printf "%s ",$3}'`
        case "$MS_MNTS" in
            *"$MOUNTPOINT"* )
                echo "Persistent HOME not supported on Microsoft File Systems."
                echo "${YELLOW}Request for persistent HOME on $PARTITION ignored."
                echo -n "${RED}Press Enter key.${NORMAL}"; read ans
            ;;
            * )
                if [ -d "$MOUNTPOINT/home/$USER" ]; then
                    mount --bind "$MOUNTPOINT/home" /home
                else
                    mkdir -p "$MOUNTPOINT/home/$USER"
                    mount --bind "$MOUNTPOINT/home" /home
                fi
            ;;
        esac

    else
        echo "Invalid device specified. Ignoring persistent HOME request!"
    fi
fi

setupHome

unset OPT_SETUP
if [ -n "$MYOPT" ]; then
    wait $fstab_pid
    PARTITION=${MYOPT##/dev/}
    find_mountpoint "$PARTITION"
    if [ -n "$MOUNTPOINT" ]; then
        [ "$MOUNTED" == "yes" ] || mount "$MOUNTPOINT"

        MS_MNTS=`mount|awk '$5~/fat|vfat|msdos|ntfs/{printf "%s ",$3}'`
        case "$MS_MNTS" in
            *"$MOUNTPOINT"* )
                echo "Persistent OPT not supported on Microsoft File Systems."
                echo "${YELLOW}Request for persistent OPT on $PARTITION ignored."
                echo -n "${RED}Press Enter key.${NORMAL}"; read ans
            ;;
            * )
                [ -d "$MOUNTPOINT"/opt ] || mkdir "$MOUNTPOINT"/opt
                yes n | cp -ai /opt/. "$MOUNTPOINT"/opt/ 2>/dev/null
                mount --bind "$MOUNTPOINT"/opt/ /opt/
                chgrp -R staff /opt/ >/dev/null 2>&1
                chmod -R g+w /opt/ >/dev/null 2>&1
                chmod g+s /opt/ >/dev/null 2>&1
            ;;
        esac

    else
        echo "Invalid device specified. Skipping persistent OPT request!"
    fi
fi


[ -n "$KEYMAP" ] || KEYMAP="us"
if [ -f "/usr/share/kmap/$KEYMAP.kmap" ]; then
    echo -n "${GREEN}Setting keymap to ${MAGENTA}$KEYMAP"
    /sbin/loadkmap < /usr/share/kmap/$KEYMAP.kmap
    echo "KEYMAP=$KEYMAP" > /etc/sysconfig/keymap
    echo "${GREEN} Done.${NORMAL}"
fi

if [ -n "$SECURE" ]; then
    getpasswd "root"
    echo "root:$PASSWD" | chpasswd -m
    getpasswd "$USER"
    echo "$USER:$PASSWD" | chpasswd -m
fi
if [ -n "$PROTECT" ]; then
    getpasswd "encryption"
    echo "$PASSWD" > /etc/sysconfig/bfe
    chown ${USER}:root /etc/sysconfig/bfe
    chmod 600 /etc/sysconfig/bfe
fi


/sbin/loadcpufreq 2>/dev/null &

/opt/bootsync.sh

[ -n "$NOAUTOLOGIN" ] && echo "booting" > /etc/sysconfig/noautologin

if [ -n "$PAUSE" ]; then
    echo -n "${BLUE}Boot time configuration completed. Press <Enter> to continue.${NORMAL}"
    read junk
fi

#END=======OF=======TC-CONFIG

silahkan copy paste persesuaian tersebut diatas kedalam script etc/init.d/tc-config yang ada didalam pccorevm.

dan persesuaian di etc/fstab sebagai berikut:

# /etc/fstab
proc /proc proc defaults 0 0
sysfs /sys  sysfs defaults 0 0
devpts         /dev/pts     devpts  defaults          0       0
tmpfs           /dev/shm     tmpfs   defaults          0       0
/dev/ubd0    /    ext2    defaults    0    0
 #END====OF====FSTAB

silahkan copy paste persesuaian tersebut diatas kedalam script etc/fstab yang ada didalam pccorevm.

Sampai disini block device telah selesai disiapkan. ingat yang akan kita gunakan hanya file pccorevm saja dan saat ini pccorevm sedang mounted di tmpcore. unmount tmpcore, dan boleh hapus working directory dan file-file yang ada, sisakan hanya pccorevm.

2. KOMPILASI KERNEL LINUX USER MODE

Dari proses pembuatan rootdisk / blockdisk tinycore linux diatas telah diketahui bahwa kernel yang digunakan adalah versi 3.16.6.

download source code kernel terlebih dahulu dari ftp://kernel.org/pub/linux/kernel/v3.x/linux-3.16.6.tar.gz untuk memudahkan gunakan wget untuk mendownload kernel tersebut.

$ wget ftp://kernel.org/pub/linux/kernel/v3.x/linux-3.16.6.tar.gz

tunggu sampai proses download selesai.

setelah selesai silahkan extract file tar.gz tersebut

$ gunzip linux-3.16.6.tar.gz
$ tar -xf linux-3.16.6.tar

akan diperoleh folder linux-3.16.6

$ cd linux-3.16.6
$ make mrproper
$ make menuconfig ARCH=um SUBARCH=i386

silahkan konfigurasikan atau pilih bagian bagian kernel yang akan diaktifkan atau tidak diaktifkan, jika sudah selesai silahkan exit dan konfirmasi yes untuk menyimpan .config.

Kompilasi kernel dapat dilakukan dengan:

$ make ARCH=um SUBARCH=i386

Kompilasi module module dapat dilakukan dengan:

$ make modules ARCH=um SUBARCH=i386

setelah kompilasi selesai akan terdapat file vmlinux yang hardlinked ke file linux, kedua file tersebut adalah executable.

copy file vmlinux tersebut ke directory dimana pccorevm berada.

$ cp vmlinux ..
$ cp linux ..

module module kernel yang tersimpan di folder mods harus di copy kedalam pccorevm directorynya /usr/lib/modules.

$ sudo mount -oloop ../pccorevm ../tmpcore/
$ cp -r mods/lib/modules/3.16.6 ../tmpcore/

sampai disini UML sudah selesai dan tinggal di coba saja. untuk menjalankan Linux User Mode ini hanya dibutuhkan file:

 vmlinux
 linux
 pccorevm

ketiga file tersebut sudah kita build. hapuslah selain ketiga file tersebut.

untuk menjalankan UML berikan perintah:
$ cd ..
$ ./vmlinux ubd0=pccorevm con1=xterm

atau dengan

$ ./linux ubd0=pccorevm con1=xterm






catatan:

konfigurasi yang dipilih sewaktu make menuconfig akan menentukan apakah kompilasi akan dapat berjalan dan hasil vmlinux/linux dapat bekerja. silahkan melakukan search di google untuk mendapatkan konfigurasi terbaik yang akan digunakan untuk kompilasi kernel UML.


untuk keluar dari UML gunakan perintah poweroff

#poweroff


0 komentar:

Posting Komentar

 
Blogger Templates