zoukankan      html  css  js  c++  java
  • 自制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
  • 相关阅读:
    Linux下解析域名命令-dig 命令使用详解
    重写、覆盖、重载、多态几个概念的区别分析
    介绍python中运算符优先级
    介绍Python中6个序列的内置类型
    Mysql(Mariadb)数据库主从复制
    winscp中使用sudo的方法
    git push跳过用户名和密码认证配置教程
    案例:通过shell脚本实现mysql数据备份与清理
    毕业季,我的Linux求职之路
    PHP和ajax详解
  • 原文地址:https://www.cnblogs.com/liangjindong/p/9039147.html
Copyright © 2011-2022 走看看