linux系统搭建(一)--简单定制linux系统
原创
©著作权归作者所有:来自51CTO博客作者不远晴空的原创作品,请联系作者获取转载授权,否则将追究法律责任
这是一些学习笔记,存在不足之处,请指正。
平台:vmware 12 操作系统:centos5.1
准备硬盘,20G
分区
格式化分区
mke2fs -j /dev/sdb1
mkswap /dev/sdb2
mke2fs -j /dev/sdb3
挂载硬盘
mkdir /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot
mount /dev/sdb3 /mnt/sysroot
生成grub
grub-install --root-directory=/mnt /dev/sdb
/mnt:可以理解为根分区
/dev/sdb1:挂在到/mnt/boot下的分区
ls -l /mnt/boot
drwxr-xr-x 2 root root 1024 Aug 3 07:45 grub
drwx------ 2 root root 12288 Aug 3 07:42 lost+found
vmlinuz
此处为了方便,不编译内核,,直接复制现有的内核
cp /boot/vmlinuz-2.6.18-398.el5 /mnt/boot/vmlinuz
initrd
initrd是在内存上加载的驱动根目录文件系统的一个文件,要在现有的/boot/initrd-2.6.18-398.el5.img稍作修改即可
file initrd-2.6.18-398.el5.img
initrd-2.6.18-398.el5.img: gzip compressed data, from Unix, last modified: Wed Jul 20 15:23:58 2011, max compression
initrd-2.6.18-398.el5.img为压缩文件,先复制为gzip可以识别的格式,再解压
cp /boot/initrd-2.6.18-398.el5.img /~/initrd-2.6.18-164.el5.img.gz
cd
gunzip initrd-2.6.18-164.el5.img.gz
说明:
initrd也可以这样操作,更加简便。在/root/test下
zcat /boot/initrd-2.6.18-398.el5.img | cpio -id
然后就可以看到文件的内容:
ls
bin dev etc init lib proc sbin sys sysroot
initrd-2.6.18-398.el5.img为cpio归档文件
file initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5.img: ASCII cpio archive (SVR4 with no CRC)
mkdir test
cd !$
在一个单独的文件夹下进行解压
cpio -id < initrd-2.6.18-164.el5.img
修改init文件
vim init
找到
mkrootdev -t ext3 -o defaults,ro /dev/vol0/root
改为
mkrootdev -t ext3 -o defaults,ro /dev/sda3
说明:当硬盘挂载到新的虚拟机上时,/根所在分区会被识别为/dev/sda3
重新打包,并放到/mnt/boot下
find . | cpio -H newc -o --quiet | gzip -9 > /mnt/boot/initrd.gz
在/mnt/sysroot/创建/根下的文件夹
mkdir -pv bin sbin usr/{bin,sbin,local} boot proc sys home root mnt media lib etc/rc.d var/{log,run,lock/subsys,tmp}
mkdir -pv bin sbin etc/{rc.d/init.d,sysconfig} lib proc dev sys root home boot
init
系统启动需要/sbin/init
cp /sbin/init /mnt/sysroot/sbin/
init还需要一些库文件的支持
ldd /sbin/init
linux-vdso.so.1 => (0x00007fff3adc4000)
libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003f67a00000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003f67600000)
libc.so.6 => /lib64/libc.so.6 (0x0000003f5f800000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003f60000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003f5f400000)
这样复制命令和库文件较为麻烦,因此写了如下的脚本,只要将需要复制的命令名称输入,即可复制对应命令库文件
#!/bin/bash
#
dst=/mnt/sysroot
libcp(){
lib_path=${1%/*}
[ ! -d $dst$lib_path ] && mkdir -p $dst$lib_path
[ ! -e $dst$1 ] && cp $1 $dst$lib_path && echo "copy $1 finished."
}
bincp(){
cmd_path=${1%/*}
[ ! -d $dst$cmd_path ] && mkdir -p $dst$cmd_path
[ ! -e $dst$1 ] && cp $1 $dst$cmd_path
for lib in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp $lib
done
}
read -p "Enter the command that you want to copy: " user_cmd
until [ $user_cmd == "q" ]; do
! which $user_cmd && echo -e "\e[31;5m\tWrong Command!\e[0m" && read -p "Enter the command that you want to copy: " user_cmd && continue
cmd_real_path=`which $user_cmd | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $cmd_real_path
echo "Command $user_cmd copy finished."
echo -e "\e[32m##########################################################\e[0m"
read -p "Enter the command that you want to copy: " user_cmd
done
在这里我复制的命令有bin下:
basename cat chown date hostname mkdir mv rm sleep sync touch bash chmod cp gzip ls mount ping sh(软连接到bash) stty tar tree seq ln
sbin下
agetty halt ifconfig init insmod mingetty modinfo modprobe poweroff reboot route shutdown
到此处,可以使用chroot /mnt/sysroot/ 切换到其中,可以发现,刚才复制的命令都可以使用。
inittab
cd /mnt/sysroot/etc/
vim inittab
#在里面写入:
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
# 2016-04-19
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
10:0:wait:/etc/rc.d/rc 0
13:3:wait:/etc/rc.d/rc 3
16:6:wait:/etc/rc.d/rc 6
20:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1
21:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2
这定义了开机之后以第3中模式(即命令行模式进入系统),并启动系统sysinit
rc.sysinit
- vim /etc/rc.d/
rc
.sysinit
#!/bin/bash
echo -e "===================================="
echo -e " \e[31;5mWelcome to MY Linux\3[0m"
echo -e " \e[32m`date`\e[0m"
echo -e "===================================="
insmod /lib/modules/mii.ko
insmod /lib/modules/pcnet32.ko
ifconfig eth0 192.168.8.61/16
ifconfig lo 127.0.0.1
/bin/bash
#!/bin/bash
. /etc/rc.d/functions
echo -e "===================================="
echo -e " \e[31;1m\tWelcome to My Linux Space\e[0m"
echo -e " \e[32;1m\t`date`\e[0m"
echo -e "===================================="
echo "Remount rootfs..."
mount -n -o remount,rw /
success "Remount rootfs"
echo "Set hostname"
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
[ -z $HOSTNAME -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost
/bin/hostname $HOSTNAME
success "Set hostname"
echo "Initializing network device..."
insmod /lib64/modules/mii.ko && success mii.ko || failed mii.ko
insmod /lib64/modules/pcnet32.ko && success pcnet32.ko || failed pcnet32.ko
定义了系统启动后好后,显示的内容,以及启用的shell,这里是/bin/bash
说明:这两个模块和网络驱动相关
insmod /lib/modules/mii.ko
insmod /lib/modules/pcnet32.ko
增加执行权限
grub.conf
进入/mnt/boot/grub下,找到grub.conf,编辑
default=0
timeout=5
title My Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3 quiet
initrd /initrd.gz
这个文件定义了开机加电自检之后,系统读取了MBR中bootloarder,如何去加载内核等相关信息
到此,制作完成。
在vmware中新建一个虚拟机,使用刚才制作的硬盘启动,OK。