自制linux系统
分区并创建文件系统
- 可以用u盘或者硬盘来安装制作一个精简版linux
- 将要安装linux的u盘或设备分区
fdisk /dev/sdb
分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根 /
mkfs.ext4 /dev/sdb1
挂载boot
- mkdir /mnt/boot 子目录必须为boot
- mount /dev/sdb1 /mnt/boot
安装grub
grub-install --root-directory=/mnt /dev/sdb
恢复内核和initramfs文件
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
- 装内核文件时可以用rpm 安装要指定root在哪
rpm -ivh /mnt/cd1/Packages/kernel-2.6.32-696.el6.x86_64.rpm --root=/mnt
- 这样装不只是装库文件和initramfs文件了,还会把/lib/modules驱动模块文件装上所所以我们直接复制主机上的
建立grub.conf
vim /mnt/boot/grub.conf
title wanglinux
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash //因为没有init进程,所以我们指定bash进程为init
initrd /initramfs-2.6.32-642.el6.x86_64.img
- chroot /mnt/sysroot 切根进入刚刚创建的linux系统。
创建一级目录
mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir –pv
/mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
复制bash和相关库文件
- 使用脚本文件,用此脚本将命令复制指定目录
#!/bin/bash
cpTopath=/app
findcmd(){
filePathe=`which $1`
fileDir=$cpTopath`dirname $filePath`
if [ ! -d "$fileDir" ];then
mkdir -p $fileDir
cp -a $filePath $fileDir
else
cp -a $filePath $fileDir
fi
}
findlib() {
libPath=`which $1`
libDir=$cpToPath/lib64
if [ ! -d "$libDir" ] ; then
mkdir -p $libDir
fi
for i in `ldd $libPath |grep -Eo "/lib64/.*\.so.[0-9]\b"`;do
cp -a $i $libDir
cp -a `ls -l $i | sed -nr 's#.* -> (.*)$#/lib64/\1#p'` $libDir &>/dev/null
done
}
testCmd() {
type $1 $>/dev/null
if [ "$?" -eq 0 ]; then
cmdType=`type $1`
if [[ "$cmdType" =~ ^.*builtin$ ]];then
echo "$cmdType,No need to copy!"
continue
fi
else
echo -e "\033[31;5m\tInput error!\033[0m" && echo_prompt
continue
fi
}
echo_prompt() {
echo -e "\t====================================================="
echo
echo -e "\t\033[31m(1)input need to copy command.(like:ls,ip)"
echo -e "\t(2)if your need to quit ,input:quit \033[0m"
echo
echo -e "\t======================================================"
}
echo_prompt
while true ;do
read -p "please input command :" cmd
if [ "$cmd" == quit ] ;then
break
else
testCmd $cmd
findcmd $cmd
findlib $cmd
fi
done
复制相关命令及相关库文件
- 如:ifconfig,insmod,ping,mount,ls,cat等
内核编译
- 单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
- 一般不推荐编译安装,除非有特种需求,因为编译安装无法知道内核是否稳定
- 内核组成部分:
- kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE
- kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/
- [ ]: N 不要此功能
- [M]: M 表示生成/lib/moudules/版本号/这个目录里
- [*]: Y 表示生成vmlinuz-version-release这个文件里
- 辅助文件:ramdisk
- initrd
- initramfs
内核版本
uname命令:
uname - print system information
uname [OPTION]…
-n: 显示主机名称
-r: 显示VERSION-RELEASE
-a:显示所有信息
内核模块命令
lsmod命令:
显示由核心已经装载的内核模块
显示的内容来自于: /proc/modules文件
- 模块是有依赖性的,可以被多个模块使用
modinfo命令:
显示模块的详细描述信息
modinfo [ -k kernel ] [ modulename|filename… ]
-n: 只显示模块文件路径
-p: 显示模块参数
-a: author
-d: description
-l: license
lsmod |grep xfs;modinfo xfs
内核模块管理
modprobe命令: 装载或卸载内核模块 rmmod 模块名
modprobe [ -C config-file ] [ modulename ] [ moduleparame-ters… ]
- 配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
- modprobe [ -r ] modulename…
depmod命令
内核模块依赖关系文件及系统信息映射文件的生成工具装载或卸载内核模块
insmod命令:指定模块文件,不自动解决依赖模块,这个命令要写模块路径
insmod [ filename ] [ module options… ]
insmodmodinfo –n exportfs
//可以用modinfo -n 模块,调出模块路径
lnsmodmodinfo –n xfs
rmmod命令:卸载模块
rmmod [ modulename ]
rmmod xfs
rmmod exportfs
编译内核
- 前提
- 准备好开发环境
- 获取目标主机上硬件设备的相关信息
- 获取目标主机系统功能的相关信息
- 例如:需要启用相应的文件系统
- 获取内核源代码包
- www.kernel.org
开发环境准备
- 包组(CentOS 6)
Server Platform Development
Development Tools
- 目标主机硬件设备相关信息
CPU:
cat /proc/cpuinfo
x86info -a /默认是没有安装的,安装包是x86info
lscpu
硬件设备
- lspci
- -v 显示详细内容
- -vv 显示更详细内容
- lsusb
- -v
- -vv
- lsblk 块设备
了解全部硬件设备信息
hal-device:在CentOS6中可以看
- ntfs分区在linux系统中无法识别,也无法挂载,当然可以安装NTFS驱动模块就可以支持
- 在boot分区中这个文件存放那个些模块在内核中哪些在/lib/modules
- 这里y集成在内核核心里,就是boot下vmlinuz中
- m是以模块方式来存在的
- 还有一种no set 表示不启用此功能
内核编译安装系统
- 安装开发包组
- 下载源码文件并解包
[root@centos7 app]# tar xvf linux-4.14.12.tar.xz
[root@centos7 app]# du -sh linux-4.14.12/
882M linux-4.14.12/
- 因为这里功能模块太多,我们要实现让linux支持ntfs文件系统,所有把/boot/config-3.10.0.697.el7.x86_64 这个文件复制到刚刚解压缩的linux目录中,并命名为.config把这个当模板,我们在这之上加上ntfs,这个文件是编译时选择启用或禁用那些功能的模板
- .config:准备文本配置文件
- make menuconfig:配置内核选项
- make [-j #]
- make modules_install:安装模块
- make install :安装内核相关文件
- 安装bzImage为/boot/vmlinuz-VERSION-RELEASE
- 生成initramfs文件
- 编辑grub的配置文件
编译安装内核示例
- tar xf linux-3.10.67.tar.xz -C /usr/src
- cd /usr/src
- ln -sv linux-3.10.67 linux
- cd /usr/src/linux
- cp /boot/config-$(uname -r) ./.config
- make help
- make menuconfig
- make -j 2
- make modules_install
- make install
- reboot
编译内核
- 配置内核选项
- 支持“更新”模式进行配置:make help
- make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
- make menuconfig:基于curses的文本窗口界面
- make gconfig:基于GTK (GNOME)环境窗口界面
- make xconfig:基于QT(KDE)环境的窗口界面支持“全新配置”模式进行配置
- make defconfig:基于内核为目标平台提供的“默认”配置进行配置
- make allyesconfig: 所有选项均回答为“yes“
- make allnoconfig: 所有选项均回答为”no“
- 编译
- 全编译:make [-j #]
- 编译内核的一部分功能
- 只编译某子目录中的相关代码
bash
cd /usr/src/linux //就是进入解压缩的目录中
make dir/
- 只编译一个特定的模块
bash
cd /usr/src/linux
make dir/file.ko
例如:只为e1000编译驱动:
make drivers/net/ethernet/intel/e1000/e1000.ko
- 只编译某子目录中的相关代码
如何交叉编译内核
- 编译的目标平台与当前平台不相同
- make ARCH=arch_name
- 要获取特定目标平台的使用帮助
- make ARCH=arch_name help
- make ARCH=arm help
在已经执行过编译操作的内核源码树做重新编译
- 需要事先清理操作
- make clean:清理大多数编译生成的文件,但会保留config文件等
- make mrproper: 清理所有编译生成的文件、config及某些备份文件
- make distclean:mrproper、patches以及编辑器备份文件
卸载内核
- 删除/lib/modules/目录下不需要的内核库文件
- 删除/usr/src/linux/目录下不需要的内核源码
- 删除/boot目录下启动的内核和内核映像文件
- 更改grub的配置文件,删除不需要的内核启动列表
- 删除centos7时是grub2目录,并且grub.conf改为grub.cfg文件要删除
- 相当于grub.conf中从title 到initrd的内容
- 如果grub2/grub.cfg文件删除了,可以用grub2-make -o grub.cfg 生成此文件
编译内核操作
- 选择下载linux,kernel包,在选择内核包时最最好不要相差2个大版本
- 下载源码文件并解包
[root@centos7 app]# tar xvf linux-4.14.12.tar.xz
[root@centos7 app]# du -sh linux-4.14.12/
882M linux-4.14.12/
- 准备.config文件,这个文件定义了那些功能启用或禁用,可以参考现有的linux系统中/boot/config-3.10.0-693.el7.x86_64 这个文件
- 由于功能很多,所有直接用现有的config-3.10.0-693.el7.x86_64文件,并且改名为.config
[root@centos7 app]# cp /boot/config-3.10.0-693.el7.x86_64 /app/linux-4.14.12/.config
- 以菜单的方式来定制功能,用make menuconfig,要进入解压包里
- 但是可能会包这样的错误缺少一些包组,我们安装
- 安装对应的包组,先用yum grouplist 查看一下
- 安装包组
[root@centos7 linux-4.14.12]# yum groupinstall Development\ Tools
- 我们在次进行打开菜单发现还是缺少包,根据提示安装对应的包,这个包是一个字符界面的窗口库
yum install -y ncurses-devel
- 这样就不缺少包了
- 这是菜单界面,后面有—> 这种的就是由子菜单可以进去,先进入总的设置,按+或-是上下功能键
- 这个就是我们用uname -r 命令看到的最后几位数字的设置
- 现在我们也添加一个自己的标识,按照对应的格式来写
- 其它的设置不想改了,可以按exit返回上一级菜单
- 在继续设置其它的,因为我们想要linux支持ntfs格式的找文件系统这一个选项
- 找到这一个选项,进去
- 按空格键可以选择是否启用或禁用,以及生成模块文件,这里选择启用成模块
- 启用ntfs时会出来两个选项,这里我们一并也启用,支持ntfs写,这样就完成了,退出保存
- 刚刚菜单操作就是更改.config文件,相当于编译安装成中.configrue这一步
-
- 编译
- -j是指定用几个核心编译,当然是根据电脑自身配置,内核越多编译越快
- 因为编译时间较长我们可以设置编译完后打出响声来提示我们,这样我们就可以干其它事情
[root@centos7 linux-4.14.12]# make -j 4 ; for i in {1..10};do sleep 0.3;echo -e "\a" ;done
- 这里还缺少一些库文件,我们直接安装就好,这里只有装其中一个就行
linux 内核编译时出现scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h错误的解决办法yum install openssl-devel
编译安装完后执行make modules_install 安装模块
- 安装前
[root@centos7 linux-4.14.12]# ls /lib/modules
3.10.0-693.el7.x86_64
- 安装后
[root@centos7 linux-4.14.12]# make modules_install
[root@centos7 linux-4.14.12]# ls /lib/modules
3.10.0-693.el7.x86_64 4.14.12-1.0-wawa
make install :安装内核相关文件
- 安装bzImage为/boot/vmlinuz-VERSION-RELEASE
- 生成initramfs文件
- 编辑grub的配置文件
- 查看一下grub2目录中grub2.cfg文件
- 完成后重启机器然后用新内核启动
[root@1234 ~]# uname -r
4.14.12-1.0-wawa
测试
- 将u盘插进系统看是否识别
- 但是我们发生是只读模式,重新挂载一下变成读写的
[root@1234 ~]# mount -o rw,remount /run/media/root/老毛桃u盘/
mount: cannot remount /dev/sdb1 read-write, is write-protected
- 发现无法变成只读模式,如果想写入,要安装ntfs-3g 这个包,视频epel源的