怎样自己从内核开始定制一个自己的专属系统:
如今电脑种类繁多,系统也形形***,我们从网上下载的系统是否能完成自己所要的功能?而功能多的系统往往占内存大,且有一些我们用不到的功能。那么下边我们便来根据自己的电脑配置属性来给自己量身打造一个自己的专属系统。
首先我们需要查看一下自己电脑的一些硬件属性,以方便一会的系统定制功能选取。
本实验环境为虚拟机实现。
查看CPU:cat /proc/cpuinfo
查看内存:cat /proc/meminfo
各种桥设备的信息:lspci
查看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
[root@www ~]# ls /mnt/boot/
grub lost+found
[root@www ~]# vim /mnt/boot/grub/grub.conf
vim sbin/init
chmod +x sbin/init
内核编译完成后它会在当前目录下生成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
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 命令也都可以使用。
到现在系统已经算成功配建起来了,当然这个系统还没有给大家提供登陆的接口,下边我们变为系统添加上这一项:
我们又切回宿主机来。在/mnt/sysroot/下
而要实现登陆,就是要提供终端,而我们编辑的etc/inittab中console是直接打开页面,不提示登陆,提示登陆的是一个名为getty的程序
我们来看看getty
我们用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 ###修正后的
出错了,是什么原因呢?
查看,原来是我们把单引号写到)里边了。
切换太快使得在宿主机的操作没有同步过来,悲剧啊。。。。
把/mnt/sysroot/下的文件归档一下
find . |cpio -o -H newc |gizp -9 > /root/sys.gz
卸载/dev/sdd2
格式化重新挂载。
gunzip /root/sys.gz
cpio -i < /root/sys
重启,OK!!!