2018년 5월 25일 금요일

Linux On USB : USB에서 리눅스 시스템 구축

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@
@@ TINY LFS ON USB
@@
@@ Host : ubuntu 13.04 64bit
@@ Target : linux kernel 3.11.0 / busybox-1.21.1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

참고:
http://wiki.kldp.org/wiki.php/LinuxBasedOnUSB-StorageDevice
http://blog.naver.com/skkong89?Redirect=Log&logNo=90036081183 

사설:
처음에 위 두 사이트를 참고하여 syslinux를 부트로더로 사용하여 시스템을 만들어보려고 3일동안 머리를 싸맸지만 실패했다.
현재 syslinux의 최신 버전은 6.01인데 최신 pc에서는 잘 돌아가질 않는다. (물론 qemu에서는 돌아갔다.)
게다가 검색하다가 알게된 사실은 syslinux는 최신 하드웨어드를 잘 지원하지 않는다고 한다.
속도면에서는 grub보다 syslinux가 빠르다는 의견이 있어서 syslinux를 사용해보려 했으나, 결국은 grub으로 구축하였다.

뭐 어쨌거나, 앞으로 디스크포맷형식이 msdos에서 GPT로 바뀔것이고 결국은 GPT를 잘 지원하고 있는 GRUB으로 하는게 맞는 일인것도 같다.

밑으로 진행되는 설명에서, 쉘명령어의 경우에는 "###", "###" 으로 감쌌으며, 파일에 들어갈 내용의 경우에는 "<<<", ">>>" 으로 감쌌다.
그리고 주석은 "" 으로 처리 하였다.

// [1] 가상 루트 파일 시스템 이미지 생성
###
sudo su;
mkdir USBLFS;
cd USBLFS;

dd if=/dev/zero of=rootfs bs=1M count=100;
mkfs.ext2 -F -i 2000 rootfs;

mkdir rootfs_loop;
mount -o loop rootfs rootfs_loop/;
###

// [2] Busybox 설치
###
wget http://www.busybox.net/downloads/busybox-1.21.1.tar.bz2;
tar xvfz busybox-1.21.1.tar.bz2;
cd busybox-1.21.1;

make menuconfig;
make;
make CONFIG_PREFIX=../rootfs_loop install;
###

아래 옵션을 적용하여 Busybox패키지의 실행파일들 static으로 컴파일하여 [3]번 과정을 생략 하도록 한다.
"Busybox Settings -> Build Options -> [*] Build BusyBox as a static binary(no shared libs)"

// [3][Option] Busybox가 참조하는 라이브러리 복사 (아래 파일들은 정확하지 않다)
###
cd bin;
ldd busybox;
        linux-gate.so.1 =>  (0xffffe000)
        libcrypt.so.1 => /lib/tls/libcrypt.so.1 (0xb7ef9000)
        libm.so.6 => /lib/tls/libm.so.6 (0xb7ed6000)
        libc.so.6 => /lib/tls/libc.so.6 (0xb7dba000)
        /lib/ld-linux.so.2 (0xb7f31000)

cd ..;
mkdir -p lib/tls;
cp /lib/tls/libcrypt.so.1 lib/tls/;
cp /lib/tls/libm.so.6 lib/tls/;
cp /lib/tls/libc.so.6 lib/tls/;
cp /lib/ld-linux.so.2 lib/;
###

// [4] 나머지 루트 파일 시스템 디렉토리 생성
1) etc
###
mkdir etc;
vi etc/fstab;
###

<<<
proc    /proc    proc    defaults    0    0
>>>

###
vi etc/inittab;
###

<<<
::sysinit:/etc/init.d/rcS
tty1::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
>>>



###
mkdir etc/init.d/;
vi etc/init.d/rcS;
###

<<<
#! /bin/sh
/bin/mount -a
>>>

###

chmod ugo+x etc/init.d/rcS
###



2) dev
###
mkdir dev;
vi mkdev.sh;
###

<<<
#! /bin/sh
#
# makedev.sh - creates device files for a busybox boot floppy image

# we do our work in the dev/ directory
if [ -z "$1" ]; then
echo "usage: `basename $0` path/to/dev/dir"
exit 1
fi

cd $1

# miscellaneous one-of-a-kind stuff
mknod console c 5 1
mknod full c 1 7
mknod kmem c 1 2
mknod mem c 1 1
mknod null c 1 3
mknod port c 1 4
mknod random c 1 8
mknod urandom c 1 9
mknod zero c 1 5
ln -s /proc/kcore core

# IDE HD devs
# note: not going to bother creating all concievable partitions; you can do
# that yourself as you need 'em.
mknod hda b 3 0
mknod hdb b 3 64
mknod hdc b 22 0
mknod hdd b 22 64

# loop devs
for i in `seq 0 7`; do
mknod loop$i b 7 $i
done

# ram devs
for i in `seq 0 9`; do
mknod ram$i b 1 $i
done
ln -s ram1 ram

# ttys
mknod tty c 5 0
for i in `seq 0 9`; do
mknod tty$i c 4 $i
done

# virtual console screen devs
for i in `seq 0 9`; do
mknod vcs$i b 7 $i
done
ln -s vcs0 vcs

# virtual console screen w/ attributes devs
for i in `seq 0 9`; do
mknod vcsa$i b 7 $i
done
ln -s vcsa0 vcsa
>>>

###
sh mkdev.sh ./dev/
###



3) proc
###
mkdir proc;
###

// [5] 루트 파일 시스템 이미지 생성
###
umount rootfs_loop;
gzip -9 rootfs;
###

// [6] 커널 이미지 생성
# make menuconfig
Block devices
[*] Loopback device support
...
[*] Network block device support
[*] RAM disk support
(4096) Default RAM disk size (kbytes)
[*] Inital RAM disk (initrd) support
# make bzImage

// [7] USB 포맷
###
fdisk -l;
umount /dev/sdc1;
parted /dev/sdc;

mklabel;
msdos;

mkpartfs
primary
ext2
1
-1


###

// [8] USB에 파일 복사
###
mount /dev/sdc1 /mnt;
mkdir /mnt/boot;
cp bzImage /mnt/boot;
cp rootfs.gz /mnt/boot;
###

// [9] GRUB 설치
###
mkdir /mnt/boot/grub;
vi /mnt/boot/grub/grub.cfg;
###

<<<
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd0,msdos1)

menuentry "Linux 3.11.0" {
    linux   /boot/bzImage root=/dev/ram0 rw
    initrd  /boot/rootfs.gz
}       
>>>



###
grub-install /dev/sdc --boot-directory=/mnt/boot
umount /mnt
###

댓글 없음:

댓글 쓰기