自制Linux系统
自制Linux系统
自制linux系统
分区并创建文件系统
fdisk /dev/sdb
分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根 /
mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2
挂载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
建立grub.conf
default=0
timeout=5
title linux
kernel /vmlinuz root=UUID==xxx selinux=0 init=/bin/bash
initrd /initramfs.img
chroot /mnt/sysroot
创建一级目录
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和相关库文件
复制相关命令及相关库文件 如:ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid等
示例:
新建一个硬盘20G, echo ‘ - - - ‘ > /sys/class/scsi_host/host2/scan
fdisk /dev/sdb ,分一个主分区100M;在分一个主分区(剩余其他空间)
mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2
mkdir /mnt/boot 创建挂载点(子目录必须是boot)
mount /dev/sdb1 /mnt/boot 挂载分区
grub-install --root-directory=/mnt /dev/sdb //指定父目录
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img
vim /mnt/boot/grub/grub.conf //写配置文件
default=0
timeout=5
title linux
kernel /vmlinuz root=UUID(或/dev/sda2) selinux=0 init=/bin/bash
initrd /initramfs.img
mkdir /mnt/rootfs
mount /dev/sdb2 /mnt/rootfs
复制bash和相关库文件 (可以再次使用copycmd.sh脚本来辅助复制命令相关的库文件)
复制相关命令及相关库文件 如:ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid等
mkdir /mnt/rootfs/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot, dev,mnt,media}
cp /lib/modules/2.6.xxxxx/kernel/drivers/net/e1000/e1000.ko /mnt/rootfs/lib //网卡驱动
sync
关机,拆卸新硬盘,复制到目录下
在一台新机子上:删除原硬盘,使用新的硬盘
加载网卡驱动,insmod /lib/e1000.ko 后,可配ip地址
----------------------------------------------------------------------------------------------------------------------------
救援环境
- 在根文件系统无法使用时需要,如/bin/mount删除
- 对系统没有特殊要求
- 从光盘引导(boot.iso或者安装光盘#1)
- 从USB盘(由boot.iso制作)引导
- 文件系统重组
Anaconda将会询问是否应该挂载文件系统
/mnt/sysimage/*
/mnt/stage2
$PATH包括硬盘的目录
- 文件系统节点
提供系统特定的设备文件
mknod了解major/minor
系统配置文件丢失修复:
系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模
式才可以解决此类问题。
· 有备份文件的回复方法
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
chroot /mnt/sysimage
cp /etc/inittab.bak /etc/inittab
· 没有备份文件的恢复办法
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包
chroot /mnt/sysimage
rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64
exit 退出chroot模式
挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)
mount /dev/sr0 /mnt/source
CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用--root选项指定其位置。 覆盖安装/etc/inittab文件所在的RPM包:
rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
其中的rpm命令选项“--replacepkgs”表示覆盖安装,执行完成后,即已经恢复
了此文件
如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:
rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab
cp etc/inittab /mnt/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可
/proc目录:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
参数:只读:输出信息
可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
/proc/sys
(1) sysctl命令用于查看或设定此目录中诸多参数
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=mail.magedu.com
(2) echo命令通过重定向方式也可以修改大多数参数的值
echo 'VALUE' > /proc/sys/path/to/parameter
echo “websrv” > /proc/sys/kernel/hostname
sysctl命令:
sysctl命令:
默认配置文件:/etc/sysctl.conf 保存了部分内核参数,没有全部写入该文件
(1) 设置某参数
sysctl -w parameter=VALUE //设置某参数且让其立即生效,临时有效
(2) 通过读取配置文件设置参数
sysctl -p [/path/to/conf_file] // 重新读取配置文件,使之生效
(3) 查看所有生效参数
sysctl -a
常用的几个参数:(在该路径下proc/sys/)
net.ipv4.ip_forward
net.ipv4.icmp_echo_ignore_all = 1 禁止ping命令ping通
vm.drop_caches 清除缓存【一般不清缓存】
/sys目录:
/sys目录:
sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性
udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序
专用工具:udevadmin, hotplug
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及 /usr/lib/udev/rules.d目录下(可修改设备名称)
内核编译:
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
内核组成部分:
kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE
kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/
/boot/config-xxxx 该文件中保存了,哪些存放于内核核心文件,哪些不用
[ ]: N
[M]: M
[*]: Y
辅助文件: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命令:
装载或卸载内核模块
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]
配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf
modprobe [ -r ] modulename…
内核编译安装系统:
- 安装开发包组
- 下载源码文件
- .config:准备文本配置文件
- make menuconfig:配置内核选项
- make [-j #]
- make modules_install:安装模块
- make install :安装内核相关文件
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
安装,编译内核示例:
1.安装包组: Development Tools
2. 下载源码文件(解压缩tar xf linux-xxx.tar.xz -C /usr/src)
3. cd /usr/src/linux-xxx/
4. .config: 准备文本配置文件 : cp /boot/config-xxxx .config
5. make menuconfig //可以打开一个图形界面(再此过程中缺什么包,安装什么包)
在general setup 下,可配置local version (内核版本信息)
6. make [-j #]
7. make modules_install : 安装模块
8. make install 安装内核相关文件
9.reboot
编译内核:
(1) 配置内核选项
支持“更新”模式进行配置:make help
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面
(d) make xconfig:基于QT(KDE)环境的窗口界面
支持“全新配置”模式进行配置
(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
(b) make allyesconfig: 所有选项均回答为“yes“
(c) make allnoconfig: 所有选项均回答为“no“
(2) 编译
全编译:make [-j #]
编译内核的一部分功能:
(a) 只编译某子目录中的相关代码
cd /usr/src/linux
make dir/
(b) 只编译一个特定的模块
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(手机基于arm架构)
内核编译:
在已经执行过编译操作的内核源码树做重新编译
需要事先清理操作:
make clean:清理大多数编译生成的文件,但会保留config文件等
make mrproper: 清理所有编译生成的文件、config及某些备份文件
make distclean:mrproper、patches以及编辑器备份文件
卸载内核:
删除/lib/modules/目录下不需要的内核库文件
删除/usr/src/linux/目录下不需要的内核源码
删除/boot目录下启动的内核和内核映像文件
更改grub的配置文件,删除不需要的内核启动列表
实验:自制Linux,启动自动配置ip
方法:grub.conf
kernel /vmlinuz root=/dev/sda2 selinux=0
vim /sbin/init
#!/bin/bash
insmod /lib/e1000.ko
ifconfig eth0 192.268.239.135/24
实验:根是挂载到逻辑卷上的,基于逻辑卷的破坏,/etc/fstab
方法:进入救援模式,mkdir /mnt/rootfs
vgchange -ay //激活逻辑卷
mount /dev/VolGroup/lv_root /mnt/rootfs
赞 (0)