自制Linux

本章描述在VM上自制Linux系统的过程。

1. 在运行的虚拟机上加一块新的硬盘20G

分两个分区,如下

[root@CentOS63 rc.d]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 5.8G 0 rom
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 100G 0 part /
├─sda2 8:2 0 9.8G 0 part /data
└─sda3 8:3 0 2G 0 part [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 203.9M 0 part
└─sdb2 8:18 0 19.8G 0 part

2. 做文件系统 

mkfs.ext4 /dev/sdb2

mkfs.ext4 /dev/sdb1

[root@CentOS63 rc.d]# blkid
/dev/sda1: UUID="cb5f4231-e447-4b59-ba38-5357be9b67b1" TYPE="ext4"
/dev/sda2: UUID="07ac6d5a-d706-4401-9f85-7fdb0b7f4ce6" TYPE="ext4"
/dev/sda3: UUID="be67d9c3-4756-4903-b225-cd17e8db2b28" TYPE="swap"
/dev/sdb1: UUID="c94613a4-28b0-4570-b830-7e470ea5847d" TYPE="ext4"
/dev/sdb2: UUID="32c5566f-440e-49ba-91f0-7d32285e3f7a" TYPE="ext4"

3. 挂载boot

mkdir /mnt/boot 子目录必须为boot

mount /dev/sdb1 /mnt/boot

 

4. 安装grub

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

查看MBR的bootloader信息:

hexdump -C /dev/sdb -n 512 -v

5. 编辑grub.cfg

vim /mnt/boot/grub.conf

default=0
timeout=5
title Linux
kernel /vmlinuz root=UUID=32c5566f-440e-49ba-91f0-7d32285e3f7a  selinux=0 init=/bin/bash

initrd /initramfs.img


6. copy内核文件以及ramfts initramfs文件

cp /boot/vmlinuz /mnt/boot/

cp /boot/initramfs /mnt/boot/

 

7. 创建一级目录

mkdir /mnt/sysroot

mount /dev/sdb2 /mnt/sysroot

用脚本copy相应的命令以及依赖的库文件

 

8. 生成rootfs下的一级目录

mkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

       同时copy网卡的驱动文件

modinfo e1000

cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/

 9.  测试自制Linux

把sdb硬盘安装到新的VM上,启动

加载网卡模块insmod /lib/e1000.ko

配置IP, ifconfig eth0 192.168.30.44/24

 

#!/bin/bash
#
#********************************************************************
#Author:                Liang Jindong
#QQ:                    570878199
#Date:                  2018-05-14
#FileName:             copycmd.sh
#URL:                   http://www.magedu.com
#Description:          The test script
#Copyright (C):         2018 All rights reserved
#********************************************************************

ROOTFS_DIR="/mnt/sysroot"

FUNC_CP_BIN() {
        if which $1 &> /dev/null; then
                SOURCE_BIN=`which --skip-alias $1`
                SOURCE_DIR=`dirname $SOURCE_BIN`
                [ -d ${ROOTFS_DIR}${SOURCE_DIR} ] || mkdir -p ${ROOTFS_DIR}${SOURCE_DIR}
                [ -f ${ROOTFS_DIR}${SOURCE_BIN} ] || cp ${SOURCE_BIN} ${ROOTFS_DIR}${SOURCE_DIR}
                return 0
        else
                echo "Command not found."
                return 1
        fi

}

FUNC_CP_SO(){
        ldd ${SOURCE_BIN} | egrep '=> /' > SO_FILE
        while read LINES; do
        SOURCE_SO=`echo $LINES | sed -r 's@.*=> (\/.*) .*@\1@g'`
        SO_DIR=`dirname $SOURCE_SO`
        [ -d ${ROOTFS_DIR}${SO_DIR} ] || mkdir -p ${ROOTFS_DIR}${SO_DIR}
        [ -f ${ROOTFS_DIR}${SOURCE_SO} ] || cp $SOURCE_SO ${ROOTFS_DIR}${SO_DIR}

        done < /app/test/script/Linux_selfmade/SO_FILE


}

read -p "Please input a command:" ANS
        until [ "$ANS" == "quit" ]; do
        FUNC_CP_BIN $ANS
        FUNC_CP_SO
        read -p "Please input a command:" ANS
        done
View Code

 

posted @ 2018-05-17 14:15  Evan_Wolf  阅读(206)  评论(0编辑  收藏  举报