怎样自己从内核开始定制一个自己的专属系统:

如今电脑种类繁多,系统也形形***,我们从网上下载的系统是否能完成自己所要的功能?而功能多的系统往往占内存大,且有一些我们用不到的功能。那么下边我们便来根据自己的电脑配置属性来给自己量身打造一个自己的专属系统。


首先我们需要查看一下自己电脑的一些硬件属性,以方便一会的系统定制功能选取。

本实验环境为虚拟机实现。

查看CPU:cat /proc/cpuinfo

查看内存:cat /proc/meminfo

各种桥设备的信息:lspci

定制一个自己的专属linux系统_电脑配置

定制一个自己的专属linux系统_linux_02

查看USB信息:lsusb

查看cpu:lscpu

查看块设备:lsblk


准备系统编译条件:

首先需要将系统编译需要的库文件安装上,

下载一个Linux最新的kernel,本实验使用的是linux-3.13.6.tar.xz

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


内核编译准备:

编译有三种选择

Y --将该功能编译进内核   (*)  
N--不将该功能编译进内核 ( )    
M--将该功能编译成可以在需要时动态插入到内核中的模块(M)

Code maturity level options

-->prompt for development and/or incomplete code/drivers,如果你要试验现在仍处于实验阶段的功能就必须把该项选择为Y了;否则可以把它选择为N。

Loadable module support :对模块的支持。

-->Enable loadable module support:加载模块

-->Set version information on all module symbols:可以不选

-->Kernel module loader:让内核在启动时有自己装入必需模块的能力

Processor type and features :CPU类型

-->Processor family:选择CPU类型。 
-->High Memory Support:大容量
内存的支持。 
-->MTTR support:MTTR支持。可不选。 
-->Symmetric multi-processing support:对称多处理支持。

General setup :属性进行设置。

-->Networking support:网络支持。必须,没有网卡也建议你选上。

-->PCI support:PCI支持。

-->PCI access mode:PCI存取模式。可供选择的有BIOS、Direct和Any,

-->Support for hot-pluggabel devices:热插拔设备支持

-->PCMCIA/CardBus support:PCMCIA/CardBus支持。。

-->System V IPC :sysv风格  
-->BSD Process Accounting :BSD风格    
-->Sysctl support:以上三项是有关进程处理/IPC调用    
-->Power Management support:
电源管理支持。 
-->Advanced Power Management BIOS support:高级电源管理BIOD支持。

Memory Technology Device(MTD) :MTD设备支持

Parallel port support :串口支持

Plug and Play configuration 即插即用支持。

Block devices :块设备支持。

-->Normal PC floppy disk support:普通PC软盘支持。  
-->Mulex DAC960/DAC1100 PCI RAID Controller support:RAID镜像用的。 
-->Loopback device support: 
Network block device support:网络块设备支持。    
Logical volume manager(LVM)support:逻辑卷管理支持。 
Multiple devices driver support:多设备驱动支持。 
RAM disk support:RAM盘支持。

Networking options :网络选项。

-->TCP/IP networking

-->Unix domain sockets

-->UNIX: socket monitoring interface(nginx的支持)

Telephony Support :电话支持

ATA/IDE/MFM/RLL support :这个是有关各种接口的硬盘/光驱/磁带/软盘支持

SCSI support :SCSI设备的支持。

Network device support :网络设备支持。

-->Ethernet(10 or 100 Mbit)

-->Ethernet(1000Mbit)、

-->Wireless LAN(non-hamradio)、

-->Token Ring device、

-->Wan interfaces、

-->PCMCIA network device support

ISDN subsystem :ISDN上网

File systems :文件系统

-->Quota support:限制每个用户可以使用的硬盘空间的上限, 
-->DOS FAT fs support:DOS FAT文件格式的支持,    
-->ISO 9660 CD-ROM file system support:光盘使用的文件格式。 
-->NTFS file system support:ntfs是NT使用的文件格式。

-->/proc file system support:用户和系统进行交互的通道

-->Network File Systems:网络文件系统

-->Partition Types:分区类型

-->Native Language Support:本地语言支持

Console drivers :控制台驱动。

-->VGA text console

Sound :声卡驱动。

USB supprot :USB支持。


我自己本实验勾选的选项要手动勾选的内核选项

64-kit kernel                                                    64位支持

Ceneral setup

 --> Local version - append to kernel release   版本号定制

 --> System V IPC                                            sysV风格支持

Enable loadable module support

 --> Module unloading                                 模块卸载

Enable the block layer

 --> Block layer SG support v4

Processor type and features

 --> Symmetric multi-processing support

 --> Processor family

  --> Core 2/newer Xeon                                内核选择

 --> Multi-core scheduler suppor

Bus options (PCI etc.)                                   系统总线

 --> PCI support

Executable file formats / Emulations

 --> Kernel support for ELF binaries

 --> Kernel support for scripts starting with #!

Networking support

 --> Networking options

      --> TCP/IP networking                            网络功能支持

      --> Unix domain sockets                         支持nginx

      --> UNIX: socket monitoring interface

Device Drivers                                             自动挂载,文件系统挂载支持

 --> Generic Driver Options

      --> Maintain a devtmpfs filesystem to mount at /dev

      --> Automount devtmpfs at /dev, after the kernel mounted the rootfs

 --> SCSI device support                                 SCSI磁盘驱动支持

      --> SCSI device support

      --> SCSI disk support

 --> Fusion MPT device support

      --> Fusion MPT ScsiHost drivers for SPI

      --> Fusion MPT logging facility

 --> Network device support

      --> Ethernet driver support

           --> Intel devices                                网卡驱动支持

                --> Intel(R) PRO/1000 Gigabit Ethernet support

                --> Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support

 --> Input device support                             鼠标键盘支持

          --> Mouse interface

          --> Keyboards

          --> Mice

 --> USB support                                          USB功能支持,

          --> xHCI HCD (USB 3.0) support

          --> EHCI HCD (USB 2.0) support

          --> OHCI HCD (USB 1.1) support

          --> UHCI HCD (most Intel and VIA) support

File systems

     --> The Extended 4 (ext4) filesystem      ext4文件系统

选择完成后,保存


编译内核:

make -j 2

让它慢慢泡着吧,我们下边准备一下磁盘分区

挂载一个磁盘,10G

fdisk分区,一个50M,一个500M

mke2fs -t ext4 /dev/sdd1

mke2fs -t ext4 /dev/sdd2

mkdir /mnt/{boot,sysroot}

mount /dev/sdd1 /mnt/boot

mount /dev/sdd2 /mnt/sysroot

定制一个自己的专属linux系统_电脑配置_03

[root@www ~]# ls /mnt/boot/    
grub lost+found    
[
root@www ~]# vim /mnt/boot/grub/grub.conf

定制一个自己的专属linux系统_电脑配置_04

定制一个自己的专属linux系统_电脑配置_05

vim sbin/init

定制一个自己的专属linux系统_linux_06

chmod +x sbin/init

定制一个自己的专属linux系统_电脑配置_07


内核编译完成后它会在当前目录下生成arch/x86/boot/bzImage

bzImage就是编译好的内核。

系统要运行许多命令都依赖于GCC标准库,可是GCC标准库太大,移植过去太麻烦,所以就有了BUSYBOX这个可以模拟出大多数常用命令的工具,下边我们讲一下怎么把busybox加进去。


BUSYBOX

编译busybox:busybox-1.22.1.tar.bz2

tar -xf busybox-1.22.1.tar.bz2

cd busybox-1.22.1.tar.bz2/

编译busybox需要glibc-static 此库存在于CentOS6.5的第二张光盘镜像

make menuconfig

一定要选定Build BusyBox as a stayic binary

定制一个自己的专属linux系统_linux_08

make编译开始

cp -a /root/busybox-1.22.1/_install/* /mnt/sysroot/

sync

sync

chroot /mnt/sysroot 测试启动

cd /mnt/sysroot/

创建/mnt/sysroot/etc/inittab

vim etc/inittab

::sysinit:/etc/rc.d/rc.sysinit       -----------init的固定格式

console::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot          -----------执行ctrl+Alt+del时执行/sbin/reboot文件

::shutdown:/bin/umount -a -r  -----------  -a  -r 卸载所有的文件系统,所以还需要提供一个fstab文件

vim etc/fstab                           -----------定义的自动挂载的选项

/dev/sda2   /   ext4  defaults   0   0

/dev/sda1   /boot   ext4  defaults   0   0

proc   /proc   proc   defaults   0   0

sysfs   /sys     sysfs   defaults   0   0


我们可以看到,在etc/inittab文件中还有etc/rc.d/rc.sysinit文件,所以我们创建之

mkdir  etc/rc.d

vim etc/rc.d/rc.sysinit

#!/bin/sh
#

ehco -e "Welcome to \033[32mAOLENS\033[0m Linux "

echo "Remouting root filesystem"

mount -n -o remount,rw  /dev/sda2  /

echo "mount all filesystem"

mount -a

echo "create device file"

mdev -s                              自动创建设备文件,在/dev/下


给他执行权限chmod +x  etc/rc.d/rc.sysinit

挂起宿主机,创建一个新的虚拟机,定义使用宿主机上的/dev/sdd磁盘,启动Linux系统,求佛祖保佑不要出错!!!哈哈

下边就是我们启动的界面,是使用的/bin/sh   shell 命令也都可以使用。

定制一个自己的专属linux系统_linux_09

到现在系统已经算成功配建起来了,当然这个系统还没有给大家提供登陆的接口,下边我们变为系统添加上这一项:

我们又切回宿主机来。在/mnt/sysroot/下

而要实现登陆,就是要提供终端,而我们编辑的etc/inittab中console是直接打开页面,不提示登陆,提示登陆的是一个名为getty的程序

我们来看看getty

定制一个自己的专属linux系统_linux_10

我们用getty来替换console

vim etc/inittab

::sysinit:/etc/rc.d/rc.sysinit       -----------init的固定格式

::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时执行/sbin/reboot文件

::shutdown:/bin/umount -a -r  -----------  -a  -r 卸载所有的文件系统,所以还需要提供一个fstab文件


这下回去调用login来登陆,可是我们现在还没有账号!

所以下来我们来创建账号。密码

vim etc/passwd                    创建用户

root:x:0:0::/root:/bin/sh

aolens:x:500:500::/home/aolens:/bin/sh


mkdir home/aolens

vim etc/group                      创建组

root:x:0:

aolens:x:500:


vim etc/shadow                     创建密码

openssl passwd -1 -salt 'openssl rand -hex 4'
$1$openssl $spUllMGiqUoDT/EmfdEVL.


root:$1$openssl $spUllMGiqUoDT/EmfdEVL.:16113:0:99999:7:::

aolens:$1$openssl $spUllMGiqUoDT/EmfdEVL.:16113:0:99999:7:::

提供显示信息

vim etc/profile

export PS1='[\u@\h \W]\$'

提供用户名显示:

mdkir etc/sysconfig

vim  etc/sysconfig/network

HOSTNAME=www.aolens.com

修改etc/rc.d/rc.sysinit为

#!/bin/sh
#
echo -e "Welcome to \033[32maolens\033[0m Linux"

echo "Remounting root filesystem"

mount -n -o remount,rw /dev/sda2 /

echo "mount all filesystem"

mount -a

echo "create device file"

mdev -s

[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network

[ -z "HOSTNAME" -o "HOSTNAME" == '(none) ] && hostname localhost || hostname $HOSTNAME  ###修正后的

出错了,是什么原因呢?

定制一个自己的专属linux系统_linux_11

查看,原来是我们把单引号写到)里边了。

定制一个自己的专属linux系统_linux_12

切换太快使得在宿主机的操作没有同步过来,悲剧啊。。。。

把/mnt/sysroot/下的文件归档一下

find . |cpio -o -H newc |gizp -9 > /root/sys.gz

卸载/dev/sdd2

定制一个自己的专属linux系统_linux_13

格式化重新挂载。

定制一个自己的专属linux系统_linux_14

gunzip /root/sys.gz

cpio -i < /root/sys

重启,OK!!!

定制一个自己的专属linux系统_linux_15