一、编译一个简单的linux步骤如下:

# yum groupinstall ""Development Tools" "Server Platform Development" -y    //安装开发包组
# tar xf linux-3.10.65.tar.xz  //下载内核这里就不介绍了
# cd /usr/src
# ln -sv linux-3.10.15 linux  
# cd linux # make help
# make allnoconfig
# make menuconfig
这里简单介绍下这次编译到的选项:
内核核心模块相关的:
[*]64-bit kernel  //内核编译成64位的
[*]enable loadable module support --> [*]Module uploading   //允许装卸载模块,这里都是编译进内核的,不借助ramdisk装载模块,先选中吧
Processor type and features ---> [*]Symmetric multi-processing support   //支持多处理器,linux上多处理器和多核心是一个意思
Processor family (Generic-x86-64) ---> (X) Generic-x86-64  //选通用的就可以
Bus options (PCI etc.) ---> [*] PCI support   //PCI相关的
Device Drivers ---> SCSI device support ----> [*]SCSI device support  //SCSI设备的支持
[*]SCSI disk support  //SCSI硬盘支持
[*] Fusion MPT device support ---> [*] Fusion MPT ScsiHost drivers for SPI  //lspci命令可以查看到本机pci的信息   
(*) Fusion MPT misc device (ioctl) drivers
文件系统相关的:
File systems  ---> <*> Second extended fs support    
<*> Ext3 journalling file system support
[*] Default to 'data=ordered' in ext3 (NEW)
[*] Ext3 extended attributes (NEW)
<*> The Extended 4 (ext4) filesystem Executable file formats / Emulations ---> [*] Kernel support for ELF binaries
[*] Write ELF core dumps with partial segments (NEW)
<*> Kernel support for scripts starting with #!

键盘鼠标usb相关的

Device Drivers  ---> Input device support  --->  [*]Keyboards  --->
[*] Mice --->
<*> Mouse interface
[*] USB support ---> <*> Support for Host-side USB
<*> xHCI HCD (USB 3.0) support
<*> EHCI HCD (USB 2.0) support
<*> OHCI HCD support
<*> UHCI HCD (most Intel and VIA) Support

udev相关的:

Device Drivers --> Generic Driver Options --> Mintain a devtmpfs filesystem to mount at /dev  //识别到的设备都挂载到/dev目录
                           [*]   Automount devtmpfs at /dev, after the kernel mounted the rootfs  
# make -j 4 bzImage //只编译内核文件
# fdisk /dev/sdb  //在现有系统上添加一块盘,分两个区,一个用来做boot,一个用来做根目录

# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2
# mkdir /mnt/{boot,sysroot}
# mkdir -pv etc dev proc sys bin usr/{lib,bin,sbin,lin64} lib64 lib/modules home var/{log,run,lock} tmp mnt media root   
# mount /dev/sdb1 /mnt/boot/
# mount /dev/sdb2 /mnt/sysroot
# grub-install --root-directory=/mnt /dev/sdb
# cd /usr/src/linux
# cp arch/x86/boot/bzImage /mnt/boot/bzImage
# file /mnt/boot/bzImage
# vim /mnt/boot/grub/grub.conf
    default=0
    timeout=5
    title Mini Linux (3.10.67)
    root (hd0,0)
    kernel /bzImage ro root=/dev/sda2 init=/bin/bash
写一个脚本bincp复制命令及依赖库到sysroot下
    #!/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" != 'q' -a "$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使用上面的sdb硬盘
重启Mini Linux,可以在bash命令行进行一些命令的操作,比如cd,ls,mount等

也可以新建init程序让系统开机运行

新建脚本init: /mnt/sysroot/sbin/init
#!/bin/bash
#
echo -e "\twelcome to \033[32mMini\033[0m linux"
mount -n -t proc proc /proc
mount -n -t sysfs /sys
mount -n -o remount,rw /dev/sda2 /
/bin/bash
# chmod +x /mnt/sysroot/sbin/init

二、结合busybox+dropbear制作linux

静态编译busybox:

下载busybox:https://busybox.net/downloads/

# wget https://busybox.net/downloads/
# tar xf busybox-1.22.1.tar.bz2
# cd busybox-1.22.1
# yum install glibc-static //静态编译busybox依赖到的库
# make menuconfig  //配置下面两项,其他默认就可以了
    Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)   
    Installation Options ("make install" behavior) ---> What kind of applet links to install (as soft-links) ---> (X) as soft-links //安装完成后文件链接类型
                                    (./_install) BusyBox installation prefix (NEW) //安装完成在什么位置,默认当前编译路径下,默认就好
# make && make install  //安装busybox
# cd /mnt/sysroot
# rm -rf ./* //删掉之前在sysroot中创建的目录,busybox会自动创建
# cd busybox-1.22.1  
# tree _install  //可以看一下busybox安装后生成了哪些文件
# cp -a _install/* /mnt/sysroot/  //复制_install中所有文件到sysroot中
# cd /mnt/sysroot
# rm linuxrc  //删掉busybox模拟的init程序,"ls /sbin | grep init"中的init就够用了 
修改grub配置文件:
default=0
timeout=3
title Mini Linux (3.10.67)
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/sbin/init  //修改init就好
# mkdir -pv etc lib lib64 proc sys dev root home boot mnt media tmp var  //在sysroot下创建其他缺少的目录

busybox默认模拟的是CentOS5的init程序,它会去读取inittab文件,所以我们创建一个/sysroot/etc/inittab,内容如下:

# vim /sysroot/etc/inittab
  ::sysinit:/etc/rc.d/rc.sysinit  //完成系统初始化
tty1::askfirst:/bin/sh        //启动几个终端
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
  ::ctrlaltdel:/sbin/reboot  //ctrl+alt+del组合键就重启
  ::shutdown:/bin/umount -a -r  //关机前卸载所有文件系统

接下来创建初始化脚本:/sysroot/etc/rc.d/rc.sysinit

  #!/bin/sh
  #
  echo -e "\tWelcome to \033[32mMini\033[0m Linux"
  mount -t proc porc /proc    //如果不能挂载,换成绝对路径
  mount -t sysfs sysfs /sys  

  echo "scan /sys and to populatte to /dev..."
  mdev -s            //系统启动时自动输出所有文件到/dev目录下

  mount -o remount,rw /dev/sda2 /

  echo "mouting all filesystems.."
  mount -a          //挂载剩余的所有文件系统

# chmod +x etc/rc.d/rc.sysinit 

 将网络相关功能编译进内核:

# cd /usr/src/linux
# make menuconfig

  -*- Networking support ---> Networking options ---> [*] TCP/IP networking
                                  [*] IP: multicasting
                                  [*] IP: advanced router
                                  [*] IP: kernel level autoconfiguration
  Device Drivers --->[*] Network device support ---> [*] Ethernet driver support (NEW) --->[*] Intel devices (NEW)
                                                         <*> Intel(R) PRO/1000 Gigabit Ethernet support

# make  bzImage
# cp arch/x86/boot/bzImage /mnt/boot

重启Mini Linux测试网络功能

# ifconfig -a    //查看网卡
# ifconfig eth0 192.168.2.20 up
# ifconfig lo 127.0.0.1 up
# ping 192.168.2.1  

 假设把上面的网络功能编译为模块

Device Drivers --->[*] Network device support ---> [*] Ethernet driver support (NEW) --->  <M> Intel(R) PRO/1000 Gigabit Ethernet support 
# cp arch/x86/boot/bzImage /mnt/boot
# sync  

编译网卡e1000,将.ko文件复制到/mnt/sysroot/lib/modules下

# cd /usr/src/linux
# make M=drivers/net/ethernet/intel/e1000
# mkdir /mnt/sysroot/lib/modules -pv
# cp drivers/net/ethernet/intel/e1000/e1000.ko /mnt/sysroot/lib/modules/

重启Mini Linux,装载进e1000网卡模块

# insmod /lib/modules/e1000.ko

设置系统初始化的时候加载网卡模块,并初始化

# vim /etc/rc.d/rc.sysinit
    echo "Load driver for e1000..."
    insmod /lib/modules/e1000.ko     echo "Initializing ethernet card..."
    ifconfig eth0 192.168.2.20 up
    ifconfig lo 127.0.0.1 up     [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
    [ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME='lcoalhost'
     hostname $HOSTNAME 

设置主机名

# mkdir etc/sysconfig
# vim etc/sysconfig/network
    HOSTNAME=mini.alen.com

给Mini Linux添加账号和密码

# vim etc/passwd
  root:x:0:0::/root:/bin/bash
# vim etc/group
  root:x:0:
# vim etc/shadow
或者直接追加宿主机上的:# head -1 /etc/shadow > etc/shadow
# chmod 400 etc/shadow

sha密码可能不支持,换成md5的吧

# openssl passwd -1 -salt $(openssl rand -hex 4)

添加模拟终端:

修改etc/initab文件:

# vim etc/insttab

    ::sysinit:/etc/rc.d/rc.sysinit
    ::respawn:/sbin/getty 9600 tty1  //修改这几个模拟终端,getty开机时会自动调用login程序
    ::respawn:/sbin/getty 9600 tty2  //
    ::respawn:/sbin/getty 9600 tty3  //
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a -r

添加issue文件,修改终端显示信息

# vim etc/issue
Welcome to alen Linux
Kernel \r

添加ssh服务

下载dropbear源码:https://matt.ucc.asn.au/dropbear/releases/dropbear-2019.78.tar.bz2

默认编译安装就可以了

复制dropbear命令到sysroot下

# bash bincp.sh
dropbear,dropbearkey,dbclient  //添加这几个就可以了

添加存放远程终端文件的目录dev/pts

# mkdir dev/pts
# vim etc/fstab
devpts /dev/pts devpts mode=620 0 0   //挂载pts

为dropbear生成密钥文件

# mkdir etc/dropbear
# cd etc/dropbear
# dropbearkey -t rsa -s 2048 -f dropbear_rsa_host_key
# dropbearkey -t dss -f dropbear_dss_host_key

添加安全shell

# vim etc/shells
    比如:
/bin/sh
/bin/ash
/bin/hush
/bin/bash
/sbin/nologin

添加nsswitch服务:网络服务转换

# vim etc/nsswitch.conf
  passwd: files
  group: files
  shadow: files
  hosts: files dns

复制nsswitch的库文件到sysroot下

# mkdir usr/lib64
# cp -d /lib64/libnss_files* lib64/  
# cp -d /usr/lib64/libnss3.so usr/lib64/
# cp -d /usr/lib64/libnssutil3.so usr/lib64/
# cp -d /usr/lib64/libnss_files* usr/lib64/

重启Mini Linux,测试

# vim .bash_profile
设置PS1环境变量
  export PS1='[\u@\h \w]\$'
  export PATH=$PATH:/usr/local/bin:/usr/local/sbin  
添加dropbear的pid存放路径
# mkdir /var/run
# dropbear -F -E  //让dropbear工作于前台
# mkdir /dev/pts
# mount -t devpts devpts /dev/pts
# vi /etc/profile
[ $UID -eq 0 ] && export PATH=/bin:/sbin:/usr/bin:/usr/sbin

至此,一个迷你型的linux就编译好了








linux基础之Mini Linux制作的更多相关文章

  1. SLAM+语音机器人DIY系列:(一)Linux基础——2.安装Linux发行版ubuntu系统

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  2. Linux基础笔记—— 走进Linux

    走进Linux 操作系统 操作系统是计算机中必不可少的基础系统软件,他的作用是管理和控制计算机系统中的硬件和软件资源,合理有效的组织系统的工作流程,在计算机系统(硬件)与使用者之间提供接口作用. 操作 ...

  3. 【Linux基础总结】Linux基本环境

    Linux基本环境 对Linux的基础认识 虚拟机进入终端: [root@hadoop-senior Desktop] # 用户名 主机名 所在目录名称 #:表示当前用户属于root用户,超级管理员用 ...

  4. Linux基础一:Linux的安装及相关配置

    1. 计算机操作系统简介    1) 操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间.    2) 操作系统的内核的定义:操作系统的内核是一 ...

  5. 『Linux基础 - 4 』linux常用命令(1)

    这篇笔记包含以下知识点: 几个概念的理解:Linux命令,控制台,终端, 终端提示符 对文件目录的操作的相关命令: 切换目录,列出目录下的文件等 对文件的操作的相关命令: 创建,删除,复制,修改,移动 ...

  6. 『学了就忘』Linux基础 — 16、Linux系统与Windows系统的不同

    目录 1.Linux严格区分大小写 2.Linux一切皆文件 3.Linux不靠扩展名区分文件类型 4.Linux中所有的存储设备都必须在挂载之后才能使用 5.Windows下的程序不能直接在Linu ...

  7. Linux基础:认识Linux

    1.Linux操作系统的特点 优点 ​ (1)可靠性高:linux是基于Unix的概念开发出来的系统,拥有Unix的稳定且效率的特点.运行一年以上而不曾宕机.不必关机是很平常的事情 : ​ (2)彻底 ...

  8. linux基础-附件1 linux系统启动流程

    附件1 linux系统启动流程 最初始阶段当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序.这一程序通常知道一些直接连接在主 ...

  9. 【Linux基础】常用Linux命令: cd, cp, ls, mkdir, mv, rm, su, uname

    常用Linux命令:cd, cp, ls, mkdir, mv, rm, su, uname cd命令:切换当前工作目录至 dirName(目录参数) 其中 dirName 可为绝对路径或相对路径.若 ...

随机推荐

  1. To be contine ,NW NMM backup sqlserver failed.

    Last time, we talk about separate under one cluster backup into two diffetent AG backup. Does it wor ...

  2. Guava入门使用教程

    Guava入门使用教程 Guava Maven dependency In our examples, we use the following Maven dependency. <depen ...

  3. 杂记 -- 关于vue-router样式、vuecli引用全局js函数、vue.slot用法

    1.routerLinkTo 样式设置 首先,点击routerlink标签如下图:添加:router-link-active,router-link-exact-active两个类的样式 router ...

  4. Go语言实现:【剑指offer】孩子们的游戏

    该题目来源于牛客网<剑指offer>专题. 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的 ...

  5. 手把手带你阅读Mybatis源码(一)构造篇

    前言 今天会给大家分享我们常用的持久层框架——MyBatis的工作原理和源码解析,后续会围绕Mybatis框架做一些比较深入的讲解,之后这部分内容会归置到公众号菜单栏:连载中…-框架分析中,欢迎探讨! ...

  6. finalize的用法

    public class GC {          public static GC SAVE_HOOK = null;          public static void main(Strin ...

  7. 使用helm安装jenkin和gitlab

    一.使用服务介绍 存储: 阿里云NAS k8s网络插件: calico k8s版本: 1.15.2 二.helm安装 https://www.cnblogs.com/zhangb8042/p/1020 ...

  8. Python2-Django配置阿里大于的短信验证码接口

    1.短信发送开发指南地址:https://help.aliyun.com/document_detail/55491.html?spm=a2c4g.11186623.6.568.l5zTwH 2.SD ...

  9. React中setState注意事项

    setState是一个异步函数,异步获取数据 学习react在使用ref和setState操作DOM时会遇到的问题: ref获取ul结点元素 错误写法:得到的ul长度总是上一次输入后的长度 结果: 正 ...

  10. 来去学习之---KMP算法--next计算过程

    一.概述 KMP算法是一种字符串匹配算法,比如现有字符串 T:ABCDABCDABCDCABCDABCDE, P:ABCDABCDE P字符串对应的next值:[0,0,0,0,1,2,3,4,0] ...