编译内核、自制linux
自制简单的linux
前提约定
CentOS 6.8 , Kernel-2.6.32-642.el6.x86_64
基于GRUB – 0.97
/ 分区与 boot 分区独立, /boot 分区 100M+ ,/ 根分区看具体需求,此处为 1G
Vmware 12.1,新建一个Linux虚拟机,硬盘选择现有磁盘,即制作Linux的磁盘
VMware 添加一块磁盘设备,并划分一个多于100M的boot分区以及根分区,格式化为ext4分区
[root@cent6]~>fdisk /dev/sdc
Command (m for help): n
Partition number (1-4): 1
First cylinder (1-1697, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1697, default 1697): +100M
Command (m for help): n
Partition number (1-4): 2
First cylinder (15-1697, default 15):
Using default value 15
Last cylinder, +cylinders or +size{K,M,G} (15-1697, default 1697): +1G
Command (m for help): w
[root@cent6]~>partx -a /dev/sdc
[root@cent6]~>lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 13G 0 disk
├─sdc1 8:33 0 109.8M 0 part #作为boot
└─sdc2 8:34 0 1G 0 part #作为 /
[root@cent6]~>mkfs.ext4 /dev/sdc1
[root@cent6]~>mkfs.ext4 /dev/sdc2
挂载boot分区,生成grub引导,写grub配置文件,拷贝vmlinuz与initramfs文件到boot分区下
[root@cent6]~>mkdir /mnt/{boot,root}
[root@cent6]~>mount /dev/sdc1 /mnt/boot/
[root@cent6]~>cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/ #挂载点的上层目录
[root@cent6]~>grub-install --root-directory=/mnt/boot/ /dev/sdc #boot分区无boot目录
[root@cent6]~>vim /mnt/boot/boot/grub/grub.conf
default=0
timeout=2
title diylinux
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-642.el6.x86_64.img #设备名为sda,关闭selinux,init启动bash作为第一个进程
默认情况下stage2(GRUB启动菜单):由Grub通过读取grub.conf,载入当前根(boot)下的内核镜像和initrd镜像到内存,之后 stage2 的引导加载程序释放控制权,kernel阶段就开始了
Kernenl是一个zImage kernel启动后就可以访问磁盘设备和 / 根文件系统,
挂载根分区,创建FHS所需的目录结构,增加 fstab 文件
[root@cent6]~>mount /dev/sdc2 /mnt/root/
[root@cent6]~>mkdir -pv /mnt/root/{boot,bin,dev,etc,home,lib,lib64,mnt,opt,proc,root,sys,sbin,srv,tmp,usr,var}
#/proc是内核状态和统计信息的输出接口
[root@cent6]~>vim /mnt/root/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
拷贝bash到等外部命令的二进制文件和库文件到根分区,这里使用脚本完成
[root@cent6]~>bash copycmd.sh
Please input a executable command:bash
Please input a executable command:ls
Please input a executable command:cat
Please input a executable command:vi
Please input a executable command:mount
Please input a executable command:halt
Please input a executable command:date
Please input a executable command:train
拷贝命令脚本copycmd.sh如下:
1 #!/bin/bash
2 #
3 #Author:jasonmc
4 #Connect me:jasonmc@helloc.me
5 #Date:Nov 22 ETS 2016
6 #Description:
7 #
8 #
9 clear
10
11 dest_dir=/mnt/root
12
13 [ -d $dest_dir ]||mkdir $dest_dir
14
15 read -p "Please input a executable command:" cmd
16
17 until [[ "$cmd" = 'quit' || "$cmd" = 'q' ]]
18 do
19 cmd_path=`which $cmd 2> /dev/null`
20
21 if [ $? -eq 0 ]
22 then
23 if [ ! -e "$dest_dir$cmd_path" ]
24 then
25 cp -p -u --parents $cmd_path $dest_dir &&\
26 ldd $cmd_path|grep -o '/.* '| \
27 cp -p -u --parents `xargs` $dest_dir
28 else
29 echo "the $dest_dir$cmd_path does exist."
30 fi
31 else
32 echo " Confirm the existence of the command you entered."
33 fi
34 read -p "Please input a executable command:" cmd
35 done
尝试chroot到根分区
[root@cent6]~>chroot /mnt/root/
bash-4.1# ls
bin dev home lib64 mnt proc sbin sys var
boot etc lib lost+found opt root srv usr
新建VMware虚拟机,添加自制Linux所在的磁盘
启动虚拟机,进入GRUB菜单
进入系统,看到 init 启动的 bash
注意,如果 / 分区与 /boot分区不独立时有两个地方与上面不同
1、 fstab 文件只有一条记录 /dev/sda1 / ext4 default 1 2
2、 grub.conf文件:(1)root (hd0,0) (2)kernel /boot/vmzlinux-xxxx (3)initrd /boot/initramfs-xxxx.img
编译内核
前提条件:
(1)准备好开发环境(开发工具,开发库)
(2)获取目标主机的硬件设备信息
(3)添加需求,获取目标主机所需的功能,如启用的文件系统
(4)获取合适版本的内核:www.kernel.org
当前内核版本和发行版信息
[root@cent7]~>uname -r
3.10.0-327.el7.x86_64
[root@cent7]~>cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
安装开发工具,下载内核源码包
#安装开发工具和服务器开发平台
[root@centos7]~>yum groupinstall "Development tools" "Server Platform Development" -y
#确认安装的包组中有 ncurses 软件包
[root@centos7]~>yum list all *ncurses*
查看主机的硬件设备信息
#CPU信息
[root@centos7]~>cat /proc/cpuinfo
[root@centos7]~>lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
Model name: Intel(R) Xeon(R) CPU E5-2650L v3 @ 1.80GHz
Stepping: 2
CPU MHz: 1799.998
BogoMIPS: 3599.99
Virtualization: VT-x
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 30720K
NUMA node0 CPU(s): 0,1
#PCI设备信息
[root@centos7]~>lspci [-v][-vv]
[root@centos7]~>lsusb
[root@centos7]~>hal-device
获取内核源码,解压内核
[root@centos7]~>wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.7.4.tar.xz
#官方特别推荐放在 /usr/src 目录下
[root@centos7]~>tar -xf linux-4.7.4.tar.xz -C /usr/src
#linux-xxx 目录链接为 linux 目录,方便将来需要编译某个驱动时访问 linux 目录
[root@centos7]~>cd /usr/src/
[root@centos7]/usr/src/linux>ln -sv linux-4.7.4 linux
[root@centos7]/usr/src/linux>ls linux #平台、文档、驱动等
arch crypto include kernel net security
block Documentation init lib README sound
certs drivers ipc MAINTAINERS REPORTING-BUGS tools
COPYING firmware Kbuild Makefile samples usr
CREDITS fs Kconfig mm scripts virt
编译内核并安装
#获取编译帮助
[root@centos7]/usr/src/linux>make help #Configuration targets帮助信息
#最易用的字符界面 Configure,需安装 ncurses-devel,也可以使用图形界面的工具
[root@centos7]~>yum -y install ncurses-devel
#拷贝配置文件的模板,在其他发行版中是 /proc/config.gz 文件
[root@centos7]~>cp /boot/config-3.10.0-327.22.2.el7.x86_64 /usr/src/linux/.config
#启动字符界面的编译配置
[root@centos7]/usr/src/linux>make menuconfig 选择需要的模块 * 打进内核、M编译成模块
#如果系统连续运行足够长的时间,现在被加载的就是需要的,否则就不需要
#General setup -- Default hostname
# (1.el7)local version
#Processor type -- Processor family -- Xcon
#BUS options
#Networking -- ipv6、wireless #移除不要的模块
#Device Drives
#File system -- ntfs
#Security #SELinux相关
#Cryptographic #加密解密库
#
[root@centos7]/usr/src/linux>screen #远程编译时运行screen防止网络中断造成编译未完成
[root@centos7]/usr/src/linux>make -j4 #开始编译,使用 -j 指定线程数量
#在 arch/x86/boot/目录下就是内核文件如bzImage
[root@centos7]/usr/src/linux>make modules_install #安装内核模块
[root@centos7]~>ls /lib/modules/
3.10.0-327.28.3.el7.x86_64 4.7.4first.el7
[root@centos7]/usr/src/linux>make install #安装内核
#在/boot目录下生成vmlinuz-xxx文件和initramfs-xxx.img文件等
#在grub2.cfg文件自动创建了一个内核启动项,内核镜像由gzip和cpio解压
#编译时间为25分钟,时间取决于编译模块的数量
[root@centos7]/usr/src/linux>ll -h /boot/vmlinuz-4.7.4first.el7 /boot/initramfs-4.7.4first.el7.img
-rw------- 1 root root 30M Sep 18 13:15 /boot/initramfs-4.7.4first.el7.img
-rw-r--r-- 1 root root 5.4M Sep 18 13:14 /boot/vmlinuz-4.7.4first.el7
选择新内核启动
[root@centos7]~>grub2-reboot 1
[root@centos7]~>reboot
进入系统,查看ntfs模块信息
[root@centos7]~>uname -a
Linux centos7 4.7.4first.el7 #1 SMP Sun Sep 12 13:06:46 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@centos7]~>modinfo ntfs
filename: /lib/modules/4.7.4first.el7/kernel/fs/ntfs/ntfs.ko
license: GPL
version: 2.1.32
description: NTFS 1.2/3.x driver - Copyright (c) 2001-2014 Anton Altaparmakov and Tuxera Inc.
author: Anton Altaparmakov <anton@tuxera.com>
alias: fs-ntfs
srcversion: 895AC4F48E15A9818751453
depends:
intree: Y
vermagic: 4.7.4first.el7 SMP mod_unload modversions
将来需要编译内核中的某一模块
(1)只编译子目录的相关代码
cd /usr/src/linux
make path/dir/
(2)只编译一特定的模块
cd /usr/src/linux
make path/file.ko
cp /lib/modules/3-xx/kernel/xxx/
清理内核编译的文件
make clean #清理编译产生的文件,保留config文件和一些模块文件
make mrproper #清理编译生成的所有文件
make distclean #额外清理mrproper、patches以及编辑器备份文件
原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/47625