製作一個可以啓動的Linux

製作一個可以啓動的linux小系統

    在一個已安裝好的虛擬機上添加一塊硬盤,不用太大:

# fdisk /dev/sdb   將硬盤分區    

 

Command (m for help): n   新建一個分區

Command action

   e   extended

   p   primary partition (1-4)

創建主分區

Partition number (1-4): 1   分區號

First cylinder (1-13054, default 1): 

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-13054, default 13054): +100M  分區大小

    按照上述方法,創建/dev/sdb2分區,大小爲512M

mkfs -t ext3 /dev/sdb1  將分區格式化爲ext3文件格式

# mkfs -t ext3 /dev/sdb2  

 

partprobe /dev/sdb    強制讓內核重新找一次分區

cat /proc/partitions    查看分區

 

 

mkdir /mnt/boot    在/mnt目錄下創建一個新的目錄

mount /dev/sdb1 /mnt/boot/   掛載

mkdir /mnt/sysroot

mount /dev/sdb2 /mnt/sysroot/

 

mkdir /mnt/boot/grub

cp /boot/grub /mnt/boot/grub/  grub複製到/dev/sdb

cd /mnt/boot/grub/    

ls     查看是否複製成功

 

開始安裝grubgrub的安裝方法有兩種

法一使用grub-install命令,默認將grub的所有文件複製安裝到其他目錄與設備中。

grub-install  --root-directory=DIR  INSTALL__DEVICE

    --root-directory=DIR 中的DIR爲實際的目錄

INSTALL__DEVICE  安裝的設備代號

 

grub-install --root-directory=/mnt /dev/sdb

Probing devices to guess BIOS drives. This may take a long time.

Installation finished. No error reported.

This is the contents of the device map /mnt/boot/grub/device.map.

Check if this is correct or not. If any of the lines is incorrect,

fix it and re-run the script `grub-install'.

 

(fd0) /dev/fd0

(hd0) /dev/sda

(hd1) /dev/sdb       給予設備代號的對應表

法二 用這種方法,安裝的時候需要卸載/dev/sdb1,否則會失敗

grub>  root (hd1,0)      先設置還有grub目錄的分區

 Filesystem type is ext2fs, partition type 0x83

 

grub>  setup (hd1)       將主程序安裝到MBR

 Checking if "/boot/grub/stage1" exists... no

 Checking if "/grub/stage1" exists... yes

 Checking if "/grub/stage2" exists... yes

 Checking if "/grub/e2fs_stage1_5" exists... yes

 Running "embed /grub/e2fs_stage1_5 (hd1)"...  15 sectors are embedded

.

succeeded

 Running "install /grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/grub/stage2 /

grub/grub.conf"... succeeded

Done.

mount /dev/sdb1 /mnt/boot   安裝完成後,再把/dev/sdb1掛載上去

 

# cd /mnt/boot

cp /boot/vmlinuz-2.6.18-164.el5   

grub/       lost+found/ 

cp /boot/vmlinuz-2.6.18-164.el5 ./vmlinuz

ls

grub  lost+found  vmlinuz

 

# mkdir /tmp/linux

cd /tmp/linux

# cp /boot/initrd-2.6.18-164.el5.img /tmp/linux/

ls

initrd-2.6.18-164.el5.img                       此文件是用cpio命令壓縮的文件

# cpio -ivcdu < initrd-2.6.18-164.el5         解壓縮此文件

vim init         進入文件init

init文件中的“mkrootdev -t ext3 -o defaults,ro /dev/vol0/root”改爲“mkrootdev -t ext3 -o defaults,ro /dev/sda2

 

ls /mnt/sysroot/

lost+found

# cd /mnt/sysroot/

# mkdir sbin

# ls

lost+found  sbin

cp /sbin/init sbin/

mkdir etc

# vim etc/inittab

id:2:initdefault:              默認的run level設置爲2

si::sysinit:/etc/rc.d/rc.sysinit    準備系統軟件執行的環境的腳本執行文件

編輯完成,按“:wq”保存退出                                                             

mkdir etc/rc.d

vim etc/rc.d/rc.sysinit

#!/bin/bash

#

echo -e "\tWelcome to Linux"

/bin/bash                                                                      

編輯完成,保存退出                                                             

mkdir bin

# cp /bin/bash bin/

# ls bin/

bash

# chmod +x etc/rc.d/rc.sysinit           給初始化腳本一個執行權限                    

 

 

chroot /mnt/sysroot         切換到另一塊硬盤工作,可以作爲臨時測試

chroot: cannot run command `/bin/bash': No such file or directory

 

# ldd /bin/bash              用來查看可執行程序運行時依賴什麼庫文件

linux-gate.so.1 =>  (0x00345000)

libtermcap.so.2 => /lib/libtermcap.so.2 (0x00713000)

libdl.so.2 => /lib/libdl.so.2 (0x006e4000)

libc.so.6 => /lib/libc.so.6 (0x0059c000)

/lib/ld-linux.so.2 (0x00579000)

# cd /mnt/sysroot/

# mkdir lib

# cp /lib/libtermcap.so.2 lib/            將所依賴的無文件複製過來

cp /lib/libdl.so.2 lib/

# cp /lib/libc.so.6 lib/

cp /lib/ld-linux.so.2 lib/

# tree lib/

lib/

|-- ld-linux.so.2

|-- libc.so.6

|-- libdl.so.2

`-- libtermcap.so.2

 

# ldd /sbin/init                查查/sbin/init是否有所依賴的庫文件

linux-gate.so.1 =>  (0x00efe000)

libsepol.so.1 => /lib/libsepol.so.1 (0x002e9000)

libselinux.so.1 => /lib/libselinux.so.1 (0x002cf000)

libc.so.6 => /lib/libc.so.6 (0x0059c000)

libdl.so.2 => /lib/libdl.so.2 (0x006e4000)

/lib/ld-linux.so.2 (0x00579000)

cp /lib/libsepol.so.1 lib/    將所依賴的庫文件複製到/mnt的目錄中

cp /lib/libselinux.so.1 lib/

cd

# chroot /mnt/sysroot/                          切換到另一塊硬盤工作   

bash-3.2#                            成功

bash-3.2# exit                        退出            

exit

# cd /mnt/sysroot/

mkdir var home proc sys dev srv mnt media tmp usr opt misc 創建一些linux系統所需要的目錄

# ls      

bin  etc   lib         media  mnt  proc  srv  tmp  var

dev  home  lost+found  misc   opt  sbin  sys  usr

 

cd /tmp/linux/        

ls

bin  etc   initrd-2.6.18-164.el5  proc  sys

dev  init  lib                    sbin  sysroot

rm initrd-2.6.18-164.el5 

rm: remove regular file `initrd-2.6.18-164.el5'?     

ls

bin  dev  etc  init  lib  proc  sbin  sys  sysroot

# find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz  重新封裝

# ls /mnt/boot/

grub  initrd.gz  lost+found  vmlinuz

cd /mnt/sysroot/

tree                                  查看小的Linux的目錄

.

|-- bin

|   `-- bash                  不可缺少

|-- dev

|-- etc

|   |-- inittab                 不可缺少

|   `-- rc.d

|       `-- rc.sysinit           不可缺少

|-- home

|-- lib                       不可缺少

|   |-- ld-linux.so.2

|   |-- libc.so.6

|   |-- libdl.so.2

|   |-- libselinux.so.1

|   |-- libsepol.so.1

|   `-- libtermcap.so.2

|-- lost+found

|-- media

|-- misc

|-- mnt

|-- opt

|-- proc

|-- sbin

|   `-- init                  不可缺少

|-- srv

|-- sys

|-- tmp

|-- usr

`-- var

 

# cd /mnt/boot/grub/

vim grub.conf        編輯grub配置文件,linux系統啓動時必不可少

default=0          默認選項爲0,即第一個title

timeout=5         等待時間爲5秒,超過5秒,系統默認選項啓動 

title Linux         grub中的選項,可以有多個

    root(hd0,0)

    kernel /vmlinuz ro root=/dev/sda2

initrd /initrd.gz

編輯完成,保存退出

sync       同步到磁盤

    將此虛擬機掛起或關閉,新建一個虛擬機,磁盤使用上個虛擬機添加的/dev/sdb磁盤。啓動新建虛擬機,虛擬機進入下圖中的界面,一個小的Linux操作系統創建完成


    這個Linux系統僅僅是一個可以啓動的Linux,很簡陋,很多命令和功能都無法實現,有待添加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章