基于BusyBox定制Mylinux

前言:今天我们就根据BusyBox+linux内核定制一个属于自己的Linux,还可以加上dropbear和nginx来实现远程登录和web服务器功能。要想定制一个小型的Linux系统首先要对Linux开机启动流程有所了解。

POST --> Boot Sequence(MBR) --> BootLoader --> kernel -->/sbin/init

POST:加电自检。

Boot Sequence(MBR):读取磁盘第一个扇区的446个字节。

BootLoader:找到MBR中的BootLoader引导加载器、bootloader会找到我们选定的操作系统或内核去加载对应的内核、而这个Bootloader通常是grub。

kernel:加载内核。这个内核是我们通过计算机的硬件特性编译来的,在编译内核的时候我们已经把所有的硬件驱动给编译进去了包括文件系统等,所以这次在grub中就不用写入虚拟文件系统来实现文件加载启动了。

/sbin/init:启动第一个程序。

通过init来加载inittab判断是通过那种方式进行开机,开机方式分为0-6级。centos6虽然和centos5都有inittab文件,但只是为了和centos5兼容。

0级:关机

1级:单用户模式

2级:类似下面的3级别但没有NFS服务

3级:文本模式

4级:没用

5级:图形界面

6级:重新启动。

根据开机方式去加载/etc/rc.d/rc.sysinit系统初始化脚本.通过这个脚本。这个初始化脚本包括键盘映射,和没有被初始化文件系统,重新以读写的方式挂载根文件系统。

在根据开机方式读取/etc/rc.d/rc.N(N为哪种方式开机的级别)里的以S开头的启动脚本,关闭以K开头的启动脚本。这些脚本都放在当前init.d目录下,最后加载rc.local文件这个是我们最后启动的脚本,所以我们可以把开机启动的服务放在这里面。

最后启动虚拟终端。

init在早期是个串型的init、或者说传统意义是的init、sysV风格的、这种程序启动任何服务、运行任何程序完成系统初始化时统统以串型模式进行的、所以速度非常慢、以至于后来有了并型运行的init、启动速度也比较快。centos6的启动方式就是并行的init.启动文件在/etc/init/*.conf 结尾的所有文件。



准备工作:在虚拟机上新添加一块scsi硬盘,和下面的安装文件。

1)给磁盘分区格式化

fdisk /dev/sdb
    n p 1  +50M n p 2  +512M w# mke2fs -t etx4 /dev/sdb1
mke2fs -t etx4 /dev/sdb2
mkdir -pv /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot

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

2)编译内核和定制内核

tar xf linux-3.13.6.tar.xz -C /usr/src/# cd /usr/src
ln -sv linux-3.13.6 linux
cd linux
make allnoconfig
make menuconfig 把我们所需要的内容整合进来

   
   [*]64-bit kernel :64位操作系统的内核
    General setup --> 
      Local version --> -MyLinux: 给内核定一个自己的版本
   [*]system VIPC
   [*]Enable loadable module support:选择内核动态模块加载   
   [*]module unloading   
   Enable the block layer  
   [*]Block layer sgsupport v4   
   Processor type and features   
    --> Processor family     
     (X)Generic-x86-64 这里是CPU类型、这个是通用x86-64     
   [*]Symmetric multi-processing support:选择CPU支持多核心处理
      
   Bus options (PCI etc.)   
     --> [*]PCI suppor:支持PCI总线     
   Executable file formats / Emulations   
     --> [*]Kernel support for ELF binaries     
         <*>Kernel support for scripts starting with   
               
    Device Drivers      
       --> <*>SCSI device support           
         [*]SCSI disk support要支持SCSI硬盘         
       -->Fusion MPT device support (NEW)       
       --> <*>Fusion MPT ScsiHost drivers for SPI       
           [*]Fusion MPT logging facility:支持对硬盘的驱动
           
    USB support       
        <*>SUPPORT FOR HOST-SIDE USB        
        <*>UHCI HCD (most Intel and VIA) support        
        <*>OHCI HCD (USB 1.1) support          
        <*>EHCI HCD (USB 2.0) support:USB设备驱动 
         
     Input device suppor     
       --> [*]Keyboards        
           <*>AT keyboard (NEW)           
           [*]Mice:支持输入输出设备、比如健盘
           
     Generic Driver Options     
            [*] Maintain a devtmpfs filesystem to mount at /dev            
            [*]Automount devtmpfs at /dev, after the kernel mounted the rootfs
            
     Network device support     
         Ethernet driver support                
          [*]Intel devices (NEW)          
           <*>Intel(R) PRO/1000 Gigabit Ethernet support          
           <*>Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support:只要Intel的、其他的他都去掉、这是选择网卡设备驱动
                 
        [ ]Wireless:这个无线网、我们去掉去、用不着
        
   Networking support 
       Networking options
       [*] TCP/IP networking   
       [*]IP:multicasting  
       [*]IP: advanced router  
       [*]IP: policy routing 
       [*]IP: verbose route
       [*]IP: kernel level autoconfiguration
       [*]IP: DHCP support[*]IP: BOOTP support
       [*]IP: RARP support<*>IP: tunneling
      <*>Unix domain sockets
      <*>UNIX: socket monitoring interface:支持协议
      
   File systems
      <*>The Extended 4 (ext4) filesystem:支持文件系统
      
 开始编译内核了
     make -j 2  #j后面跟的为内核数量(数量越多编译速度越快)
     
   cp arch/x86/boot/bzImage /mnt/boot/  #编译的内核复制到新加系统磁盘上


3)编译BusyBox

BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用.

   首先安装依赖文件

 要先安装上glibc-static,libmcrypt-devel

       解压busybox进行编译安装。

 tar xf busybox-1.22.1.tar.bz2
 cd busybox-1.22.1
 make menuconfig
 make
 make install

make menuconfig时就选择这项就可以了、其他的都默认:
    Busybox Settings

-->Build Options

-->[*] Build BusyBox as a static binary (no shared libs)

 cp -a _install/* /mnt/sysroot/
 cd /mnt/sysroot/
 mkdir -pv /etc/rc.d var/log root home lib lib64 dev proc sys boot mnt media tmp srv etc
给grub提供一个配置文件
 vim /mnt/boot/grub/grub.conf 
 
default=0
timeout=5
title My Linux (3.13.6-MyLinux)
    root (hd0,0)
    kernel /bzImage ro root=/dev/sda2 init=/sbin/init #因为在编译内核时已经把文件系统编译进去所以本次grub引导不
    需要虚拟文件系统。


4)给系统提供一个/mnt/sysroot/etc/fstab文件 

    vim /mnt/sysroot/etc/fstab

5)给小系统提供一个rc.sysinit  

   vim  /mnt/sysroot/etc/rc.d/rc.sysinit

6)停供inittab文件

vim /mnt/sysroot/etc/inittab

::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 19200 tty1
::respawn:/sbin/getty 19200 tty2
::respawn:/sbin/getty 19200 tty3
::respawn:/sbin/getty 19200 tty4
::respawn:/sbin/getty 19200 tty5
::respawn:/sbin/getty 19200 tty6
::ctrlaltdel:/sbin/reboot 定义组合键、按ctrl+alt+del就reboot
::shutdown:/bin/umount -a -r 如果要要关机就卸载已挂载的设备、然后关机

7)提供系统用户登录帐号文件


head -1 /etc/passwd > /mnt/sysroot/etc/passwd
   root:x:0:0:root:/root:/bin/sh              #改为/bin/sh
head -1 /etc/group > /mnt/sysroot/etc/group   #提供组
head -1 /etc/shadow > /mnt/sysroot/etc/shadow #提供组密码

提供一个登录欢迎信息、创建一个issue文件
 vim /mnt/sysroot/etc/issue
 MyLinux is CentOS release 6.5 Kernel \r on an \m

提供主机名
 mkdir /mnt/sysroot/etc/sysconfig
 vim /mnt/sysroot/etc/sysconfig/network
 HOSTNAME=Mylinux

提供命令提示符和环境变量
vim /mnt/sysroot/etc/profile
export PS1=‘[\[email protected]\h \A \W]\$ ‘PATH="/usr/local/sbin:/usr/local/bin:/sbin/:/bin:/usr/sbin:/
usr/bin:$PATH"
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit

 sync  同步数据到磁盘中去  #这不很重要 如果不能同步成功的话 打开新虚拟机会出错

由于安装的BusyBox里已经提供了/sbin/init 所以就不用写入/sbin/init 内容了



8) 现在可以把宿主机挂起新建一个主机进行开机启动了。


进去以后如果tty1进不去可以切换到tty2登入到主机   切换方式 Ctrl+alt+(F1..F6)



三:安装dropbear

dropbear可以为小linux提供远程连接功能。

 tar xf dropbear-2013.58.tar.bz2
 cd dropbear-2013.58
 ./configure
 make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" 
 make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
 mkdir /etc/dropbear 
 生成两个密钥文件
 dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key   #必须为1024位
 dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
 验证一下生的这两个文件
 ls /etc/dropbear

也可以为此dropbear提供开机启动服务脚本,此次实验我们用手动打开dropbear就不再停供开机启动服务脚本。

脚本配置文件/etc/sysconfig/dropbear

为dropbear提供端口和加入到环境变量中。把端口改为22222避免跟已经使用的22号端口重复

keysize=2048
port=22222  端口号
export PATH=/usr/local/sbin:$PATH   #加入到变量中这样进入系统就可以手动输入dropbear启动了

在宿主机上测试能否连接上去可以的话就把文件复制到我们的新建系统硬盘上吧。

先提供一个cp文件的脚本,这个脚本可以把文件所依赖的库文件一并复制过去。

    #!/bin/bash
    #
    dirPath=/mnt/sysroot
    clearcmd(){        if which $1 &> /dev/null;then
            cmdPath=`which --skip-alias $1`        else
            echo "Command not exist!"
            return 4
        fi
    }
    cpCmd(){
        dirName=`dirname $1`
        [ -d ${dirPath}${dirName} ] || mkdir -p ${dirPath}${dirName}
        [ -f ${dirPath}${cmdPath} ] || cp $1 ${dirPath}${dirName}
    }
    cpLib(){     
        for i in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do
            dirLib=`dirname $i`
            [ -d ${dirPath}${dirLib} ] || mkdir -p ${dirPath}${dirLib}
            [ -f ${dirPath}$i ] || cp $i ${dirPath}${dirLib}        done
    }    while true;do
        read -p "Enter a command:" cmd        if [ "$cmd" == ‘quit‘ ];then
            echo "quit!"
            exit 0
        fi
        clearcmd $cmd
        [ $? -eq 4 ] && continue
        cpCmd $cmdPath
        cpLib $cmdPath    done

把这三个命令移植过去就可以了:dropbear、dropbearkey、dbclient复制完后就去创建这个目录/mnt/sysroot/etc/dropbear、而后为移植过去的dropbear生成两个密钥文件:密钥文件是ssh连接所依赖的。

 mkdir /mnt/sysroot/etc/dropbear
 dropbearkey -t rsa -s 1024 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
 dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key

dropbear要认证用户、而认证用户要用到名称解析、这就意味着libnss库要复制过去、libnss库框架、而后给nss提供配置文件:

 cp -d /lib64/libnss_files* /mnt/sysroot/lib64
 cp -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64/
 cp -d /usr/lib64/libnss_files.so /  mnt/sysroot/usr/lib64/
 cp /etc/nsswitch.conf /mnt/sysroot/etc/

在用户登录时dropbear认为用户的默认shell并不在/etc/shells下所在的用户shell中的话、他是不允许登录的、那我们就得给dropbear提供一个安全shell的配置文件了

vim /mnt/sysroot/etc/shells 
/bin/sh
/bin/hush
/bin/ash
/sbin/nologin
/bin/bash

dropbear启动时在/var/run/下会生成一个pid文件所以要创建

mkdir /mnt/sysroot/var/run

再创建/dev/pts这个目录:
    mkdri /mnt/sysroot/etc/profile.d
    cp /etc/profile.d/*  /mnt/sysroot/etc/profile.d/
    mkdir /mnt/sysroot/dev/pts
    sync

OK 测试一下能否能录首先要进入系统运行界面执行dropbear 因为我们没有开机启动执行脚本,所以要手动执行启动,看监听在0.0.0.0:22号端口上。

现在就可以连接我们的小Linux系统了



四:安装nginx

  yum -y install pcre-devel
  tar xf nginx-1.4.2.tar.bz
  cd nginx-1.4.2
  
  ./configure --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --without-pc
  re --without-http_rewrite_module
  
  make && make install
  
  创建nginx用户
  useradd nginx
  
  把用户复制到新建主机系统
  grep "^nginx" /etc/passwd >> /mnt/sysroot/etc/passwd
  grep "^nginx" /etc/group >> /mnt/sysroot/etc/group
  grep "^nginx" /etc/shadow >> /mnt/sysroot/etc/shadow
  
  
  
  cp -r /etc/nginx/   /mnt/sysroot/etc/
  cp -r /usr/local/nginx  /mnt/sysroot/usr/local
  
  最好用我们上面提供的cp脚本进行复制
  
  
  而在nginx启动时需要依赖于日志目录和pid文件目录、所以我们要事先给nginx创建这两目录先、还
  给创建锁文件
   mkdir /mnt/sysroot/var/log/nginx
   mkdir /mnt/sysroot/usr/local/logs
   mkdir -pv /mnt/sysroot/var/lock/subsys
   chmod +x /mnt/sysroot/var/log/nginx
   chmod +x /mnt/sysroot/tmp/
   
   vim /mnt/sysroot/etc/profiled
   export PS1=‘[\[email protected]\h \A \W]\$ ‘
PATH="/usr/local/sbin:/usr/local/bin:/sbin/:/bin:/usr/sbin:/usr/bin:$PATH:/usr/local/ngin
x/sbin"   #把/usr/local/nginx/sbin 写进去
   
  
   sync
   sync

测试能否连接 (因为没有提供开机启动脚本需要我们手动开启

服务已启动并且处在监听状态。



好了,我们的小系统安装完毕。

 


时间: 2024-10-06 12:15:26

基于BusyBox定制Mylinux的相关文章

使用kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务的迷你主机

在运维工作中很多时候我们需要裁剪Linux系统,减少系统性能的消耗,提升系统服务的性能,以往通过光盘安装的Linux都是比较臃肿的,但出现这样的需求后,我可以对Linux进行重新编译再busybox工具移植即可实现,接下来我们一步一步实现kernel编译+busybox定制Linux系统--实现ssh远程登录+web服务: 实现过程如下: 一.规划子主机的磁盘存储规划 1.添加一个大小为10G的硬盘 2.查询系统硬件信息参数: # lspci  00:00.0 Host bridge: Inte

基于busybox和LFS的linux系统定制

自从在大学知道了Linux这玩意是可以定制的之后,一直想做出一版属于自己的Linux系统.最近工作比较闲,终于塌下心来好好学习了一下. 目前来说,我接触的定制Linux的方法主要有两种: 1.以busybox为核心,通过构建initrd+busybox做出的fs+内核这三大块,构建Linux 2.采用更底层方式,基于源代码级,通过编译&构建自己的工具链+编译&构建自己的lfs+内核这三大块,构建Linux,其中最典型的就是我刚刚完成的LFS系统. 关于两种方法的优缺点呢,由于我接触的还比较

为基于busybox根文件系统的ARM嵌入式Linux交叉编译dropbear使能SSH

最近使用busybox为基于ARM的板卡定制了一个极简单的根文件系统,由于busybox仅支持telnet而不支持ssh,本文将详细描述如何交叉编译dropbear并将其移植到目标板卡上使能dropbear. 目标环境: CPU:ARM 内核版本:4.X 工具下载: zlib-1.2.8 dropbear-2016.74.tar.bz2 第一步:编译zlib-1.2.8 下载zlib-1.2.8.tar.gz,笔者将其放在/home/liangwode/test目录下. mkdir -pv bu

手动订制一个基于BusyBox的微型Linux系统

前提: 1.一个作为宿主机的Linux:系统版本为Redhat Enterprise Linux 5.8: 2.busybox源码:版本为busybox-1.20.2.busbox将大量命令打包在一起 3.在宿主机上添加一块额外的硬盘作为新系统的存储盘,这里添加使用一块IDE接口的新硬盘: 4.通过https://busybox.net/和https://www.kernel.org/分别下载Linux内核源码和busybox源码 5.全部在vmware10.0下新建一个redhat5.8主机用

基于kickstart定制自动化安装的linux镜像系统

使用软件和平台 1.基于平台:                  Vmware workstation 8.0 2.基于系统镜像:               rhel-server-5.8-i386-dvd.iso   3.ISO编辑软件:               UltraISO 4.自定义配置文件:             ks.cfg 5.需要重新编辑的配置文件:      isolinux.cfg 6.其他:                     针对不需要的文件包进行删减 Ki

使用 linux kernel +busybox 定制linux系统

目的: 了解linux的启动过程 主要内容: 1.grub 是启动程序的bootloader 2.linux-kernel 是linux的开源内核 3.busybox 是linux的工具集合 启动顺序: grub-> bzimage > initrd > init > chroot sbin/init (从内存镜像转换成rootfs)>/etc/inittab > fstab>etc/init.d/rcS 实验环境: 操作系统(编译使用): CentOS 7.4K

基于itchat定制聊天机器人

#coding=utf8import requestsimport itchat #key自己到图灵注册一个 KEY = '****************************************' def get_response(msg):   # 这里我们就像在"3. 实现最简单的与图灵机器人的交互"中做的一样  # 构造了要发送给服务器的数据   apiUrl = 'http://www.tuling123.com/openapi/api'  #图灵机器人接口   da

Busybox构建根文件系统和制作Ramdisk

定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统.它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整.功能丰富的文件系统,其中包括大量常用的应用程序.下面详细介绍有关Busybox定制根文件系统. 一.系统环境: 1.操作系统:Ubuntu140.4 2.交叉编译工具:gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08) 3.busybox源码包:busybox-1.26.2 二.构建rootf

日志系统之基于flume收集docker容器日志

最近我在日志收集的功能中加入了对docker容器日志的支持.这篇文章简单谈谈策略选择和处理方式. 关于docker的容器日志 docker 我就不多说了,这两年火得发烫.最近我也正在把日志系统的一些组件往docker里部署.很显然,组件跑在容器里之后很多东西都会受到容器的制约,比如日志文件就是其中之一. 当一个组件部署到docker中时,你可以通过如下命令在标准输出流(命令行)中查看这个组件的日志: docker logs ${containerName} 日志形如: 但这种方式并不能让你实时获