zoukankan      html  css  js  c++  java
  • mini Linux制作过程(25/01)

    Mini Linux:

    启动流程:

    参考:https://blog.csdn.net/gatieme/article/details/50914250

    https://linux.cn/article-8807-1.html#4_2073

    https://www.linuxidc.com/Linux/2015-04/115817.htm

    CentOS 6:

    POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init

    编写服务脚本

    upstart配置文件

    /etc/init/*.conf(centos6)   /etc/inittab(centos5)

    默认运行级别

    运行系统初始化脚本:/etc/rc.d/rc.sysinit

    /etc/rc.d/rc $runlevel

    启动终端,并运行login

    启动图形终端

     

    bootloader分类

    lilo

    grub legacy

    grub2

    stage1: mbr

    stage1_5: filesystem driver

    state2:

    CentOS 7:

    POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd

    编写服务脚本

    systemd unit文件

    # which ls

    # which --skip-alias ls    //去掉别名

    内核编译:

    make menuconfig --> .config

    make [-j #]

    make modules_install

    make install

    编译步骤:

    bootloader: grub

    内核:kernel (非模块方式)

    根文件系统:busybox

    编译示例: 

    参考:https://www.aliyun.com/jiaocheng/133690.html

       https://blog.csdn.net/reblue520/article/details/50786092

    yum groupinstall "Development Tools" "Server Platform Development" -y       //准备开发环境 

    # tar xf linux-3.10.67.tar.gz -C /usr/src                                                              //准备内核源码并解压

    # ln -sv linux-3.10.67 linux

    #cd /usr/src/linux

    #make help                                                                                                    

    这步配置内核的方法有多种、每一个make就是一种方法、我们只在选一种就可以了:
    make config:遍历选择所要编译的内核特性
    make allyesconfig:配置所有可编译的内核特性
    make allnoconfig:并不是所有的都不编译,而是能选的都回答为NO、只有必须的都选择为yes。
    make menuconfig:这种就是打开一个文件窗口选择菜单,这个命令需要打开的窗口大于80字符的宽度,打开后就可以在里面选择要编译的项了
    下面两个是可以用鼠标点选择的、比较方便哦:
    make kconfig(KDE桌面环境下,并且安装了qt开发环境)
    make gconfig(Gnome桌面环境,并且安装gtk开发环境)

    allnoconfig   - New config where all options are answered with no                 

    # make allnoconfig                                                                                             //把所有可选择的特性全部关掉

    会有一个.configure文件

    #less .configure                           //文件中带m的可编译的选项都去掉了

    #lscpu                                         //编译内核前需要查看电脑的cpu和cpi配置信息

    #lspci                                          //尤其要注意硬盘接口类型 LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI

    #make menuconfig                    //编译内核

    [*] 64-bit kernel                                             //编译为64位内核

    [*] Enable loadable module support  --->     //支持模块装载

     [*]   Module unloading                          //支持模块卸载

    Processor type and features  ---> 

    Processor family (Generic-x86-64)  ---> 

     (X) Generic-x86-64                         //选择通用x86-64 

     [*] Symmetric multi-processing support  //支持堆成多处理器

    Bus options (PCI etc.)  ---> 

    [*] PCI support 

    Device Drivers  --->                                          //装载硬盘驱动 #lspc可以查看

           SCSI device support  --->                          //加载底层驱动

     <*> SCSI device support                //编译进内核,不要编译成模块

     <*> SCSI disk support                    /

    [*] Fusion MPT device support  --->        //硬盘驱动

    <*> Fusion MPT ScsiHost drivers for SPI x x
    <*> Fusion MPT ScsiHost drivers for FC

    <*> Fusion MPT ScsiHost drivers for SAS x x
    (128) Maximum number of scatter gather entries (16 - 128) (NEW) x x
    <*> Fusion MPT misc device (ioctl) driver

    [*]   Fusion MPT logging facility              

    #shutdown -h now

    目标磁盘分区

    在编译内核之前先添加一块硬盘,把编译的内核放在硬盘里面,

    在宿主机上挂一块新磁盘,命名为minilinux,此块磁盘是宿主机上的第二块磁盘,所以这里是/dev/sdb,到时候挂载到目标主机的时候,

    因为那里只有这一块磁盘,所以在目标主机上的名称应该是/dev/sda,这个不能搞混了。

    首先,我们要在目标磁盘上分两个区,并进行格式化。第一个分区100M,用来装引导程序;第二个分区2G,用来装根文件系统。

    然后再进行挂载操作,将/dev/sdb1挂载到/mnt/boot下,将/dev/sdb2挂载到/mnt/sysroot下。

    #fdisk /dev/sdb         //一般磁盘有3个分区:boot root swap

    n  --> p   --> 1  -->  100M   

    n  --> p   --> 2  -->  2G --> w

    # mke2fs -t ext4 /dev/sdb1      //格式化文件系统

    # mke2fs -t ext4 /dev/sdb2      //因为是新硬盘,所以不用partprobe命令重读分区表

    # mkdir /mnt/{boot,sysroot}    //建立两个挂载目录

    # mount /dev/sdb1 /mnt/boot/

    # make -j 4 bzImage                                     //只编译内核文件

    安装grub至目标磁盘

    一个系统能启动,就需要引导,所以首先要安装一个grub引导程序到我们的新磁盘上。

    安装grub引导程序主要有两个命令,一个是grub-install,另一个是setup,这里使用grub-install来安装。

    ①grub-install会安装grub引导第二阶段的文件②setup不会安装第二阶段的引导程序,是安装引导信息到MBR

    注意:--root-directory=后面接的路径应该是boot目录所在的地方,而不是/mnt/boot,因为boot目录在mnt下,目标磁盘是/dev/sdb

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

    #mount /dev/sdb2 /mnt/sysroot                  //挂载根文件系统

    #cd /usr/src/linux

    # cp arch/x86_64/boot/bzImage /mnt/boot/bzImage 

    #file /mnt/boot/bzImage 

    #vim /mnt/boot/grub/grub.conf

    default=0
    timeout=3
    title Mini Linux (3.10.67)

    root (hd0,0)
    kerbel /bzImage ro root=/dev/sda2

    #sync

    #sync

    新建一个虚拟机,把装有编译的内核文件的磁盘当作启动磁盘,提示没有文件系统

    文件系统前面已经有了,只是里面没有文件。这里显示无法挂在,是因为内核无法驱动文件系统,

    因为#make menuconfig 编译内核没有 添加文件系统模块,只能驱动sd硬件设备,但无法驱动文件系统。

    接下来重新编译内核,驱动文件设备:

    File systems  --->

    <*> Second extended fs support x x
    <*> Ext3 journalling file system support x x
    <*> The Extended 4 (ext4) filesystem

    [ ]   Ext4 POSIX Access Control Lists (NEW)       //文件访问控制列表,这里没有启用

    Executable file formats / Emulations  --->                   //可执行文件格式

    [*] Kernel support for ELF binaries
    [*] Write ELF core dumps with partial segments (NEW)  
    <*> Kernel support for scripts starting with #!                //支持shell

    # make -j 4 bzImage                                                     //再次编译内核文件

    #sync                                                                           //把内存数据同步到磁盘上

    #cd /mnt/sysroot

    #mkdir -pv etc dev proc sys bin sbin usr/{bin,sbin,lib,lib64} lib64 lib/modules home var/{log,run,lock} tmp mnt media root

     #vim bincp.sh

    复制程序及其依赖的库文件脚本示例:

    #!/bin/bash

    #

    target=/mnt/sysroot

    [ -d $target ] || mkdir /mnt/sysroot

    read -p "A command: " command

    libcp() {

    for lib in $(ldd $1 |  grep -o "[^[:space:]]*/lib[^[:space:]]*"); do

    libdir=$(dirname $lib)

    [ -d $target$libdir ] || mkdir -p $target$libdir

    [ -f $target$lib ] || cp $lib $target$lib

    done

    }

    while [ "$command" != 'quit' ]; do

    if ! which $command &> /dev/null; then

    read -p "No such command, enter again: " command

    continue

    fi

    command=$(which --skip-alias $command)

    cmnddir=$(dirname $command)

    [ -d $target$cmnddir ] || mkdir -p $target$cmnddir

    [ -f $target$command ] || cp $command $target$command

    libcp $command

    read -p "Another command(quit): " command

    done

    Mini Linux: kernel+busybox

    busybox:

    静态方式编译,依赖于glibc-static;

    编译单个内核模块:

    # cd /usr/src/linux

    # make M=drivers/net/ethernet/intel/e1000/

    # make M=path/to/somedir/

  • 相关阅读:
    Linux 命令[5]:rmdir
    Linux 命令[4]:pwd,date
    Linux 命令[0]:起航
    Linux 命令[3]:cd
    vscode插件
    Object.freeze()
    插件
    前端开发调试线上代码
    前端自动化测试是浪费时间还是节约时间?
    踩坑之用lrz插件进行图片压缩
  • 原文地址:https://www.cnblogs.com/hanshanxiaoheshang/p/9281268.html
Copyright © 2011-2022 走看看