从零构建属于自己的小linux
本文讲述的是利用一个宿主机一步步根据自己喜好构建属于自己的一个小型linux系统。
直接切入正题开始构建属于自己的linux系统。
准备工作:
本次制是在VMware 9 上实现的
宿主机:redhat5.8 ; 内核2.6.18-308.el5
一块10G大小IDE硬盘,10G 已经完全足够
业务不是很熟练在, 在做裁剪linux 有写错或者使用不当的地方希望各位技术达人和博友 批评指正,也希望此博文能给大家带来帮助,更希望达人们给予指导。
!!!!在此先谢过!!!!
制作过程:
- 制作过程:
- 1,添加两块磁盘格式化并挂载
- #mkdir -pv /mnt/{boot,sysroot}
- #mke2fs -j /dev/hda1
- #mke2fs -j /dev/hda2
- #mount /dev/hda1 /mnt/boot/
- #mount /dev/hda2 /mnt/sysroot/
- ################# 添加内核和grub阶段##################
- 2,#cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz
- 3, #mkdir test
- 4, #cd test/
- 5, #zcat /boot/initrd-2.6.18-308.el5.img | cpio -id #展开initrd 文件
- 6, #vim init
- 找到: mkrootdev -t ext3 -o defaults,ro /dev/vol0/root
- 改为 mkrootdev -t ext3 -o defaults,ro /dev/hda2 #
- 7, #cd test/lib/
- rm -f dm-*
- 8, #cd ..
- 9, #find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz #把当前目录下所有东西打包压缩
- 10, #grub-instasll -root-directory=/mnt /dev/hda #生成grub目录
- 11, #ls /mnt/boot
- 12, #vim /mnt/boot/grub/grub.conf #手动配置grub引导内核和initrd
- default=0
- timeout=3
- title mageedu linux(2.6.18)
- root(hd0,0)
- kernel /vmlinuz
- initrd /initrd.gz
- 14, #cd /mnt/sysroot
- 15, #mkdir etc/{rc.d/init.d} bin sbin proc sys dev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home boot opt -pv
- 16, #vim /etc/inittab #创建系统启动等级 和初始化环境执行脚本
- id:3:initdefault:
- si::sysinit:/etc/rc.d/rc.sysinit
- 17, #vim /etc/rc.d/rc.sysinit #配置系统初始化内容 和脚本
- #!/bin/bash
- echo -e "\tWelcome to \033[34mMageEdu\033[0m linux"
- /bin/bash
- 18, #chmod +x /etc/rc.d/rc.sysinit
- 19, #cd
- ############################# 此脚本作用是拷贝小linux上所用到的各种系统命令和依赖包##################
- 20, 新建 bincp.sh 脚本 复制命令
- #!/bin/bash
- #
- DEST=/mnt/sysroot
- libcp() {
- LIBPATH=${1%/*}
- [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
- [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."
- }
- bincp() {
- CMDPATH=${1%/*}
- [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
- [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH
- for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
- libcp $LIB
- done
- }
- read -p "Your command: " CMD
- until [ $CMD == 'q' ]; do
- ! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continue
- COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
- bincp $COMMAND
- echo "copy $COMMAND finished."
- read -p "Continue: " CMD
- done
- 21, 运行 ./bincp.sh 复制 init bash ls
- 22, #sync
- 21, # chroot /mnt/sysroot #切换到小linux上测试一下利用脚本复制的命令
- 22,创建一个新的虚拟机 测试一下
- 23,运行 bincp.sh 拷贝命令
- 24,#mkdir rm mv cp cat mount umount vi vim chmod chown ping ifconfig insmod modprobe rmmod route halt reboot shutdown hostname
- #以上就是添加小linux所用的到的命令
- 25, #sync
- 26, 重新切换到小系统 测试 cp过来的命令 这里的切换时把宿主机挂起,添加一个新的虚拟机,在把硬盘挂载上去
- 27,#mount -n -o remount,rw / #重新以读写方式挂载 根文件系统
- 28,切换到宿主机
- ###################################### 添加关机功能################################
- 29,#cd /mnt/sysroot/
- 30, #vim etc/rc.d/rc.sysdone #添加关机功能脚本
- #!/bin/bash
- sync
- sleep 2
- exec /sbin/halt -p
- 31, #chmod + etc/rc.d/rc.sysdone
- 31, # ./bincp.sh 启动脚本拷贝 sync 命令
- 32,#cd /mnt/sysroot/
- 33, #vim etc/inittab #指定切换到0级别下的关机动作
- 添加: l0:0:wait:/etc/rc.d/rc.sysdone
- 34, #sync #同步一下数据
- 35, 切换到小系统上测试 是否可以正常关机 (切换的时候先把宿主机挂起)
- 36, #init 0 或者 halt
- 37, 关闭小linux 切换到宿主机 添加重启功能
- ##################################添加重启功能#####################
- 38, #cd /mnt/sysroot
- 39, #vim etc/inittab #添加6级别下重启脚本
- l6:6:wait:/etc/rc.d/rc.reboot
- 40, #vim etc/rc.d/rc.reboot 定义重启脚本
- #!/bin/bash
- sync
- sleep 1
- sync
- exec /sbin/reboot
- 41, #chmod +x etc/rc.d/rc.reboot
- 42, #sync
- 43, #cd
- 44, 挂起宿主机 切换到小linux
- 45, #init 6 测试重启
- 46, 关闭小linux 切换到 宿主机
- 47, 规范小linux的关机和重启功能,把init 0 和init 6 整合到一起
- #################, 规范小linux的关机和重启功能,把init 0 和init 6 整合到一起############
- 48, #cd /mnt/sysroot
- 49, #vim /etc/rc.d/init.d/halt 整合关机和重启脚本
- #!/bin/bsha
- case $0 in
- *reboot)
- COMMAND='/sbin/reboot' ;;
- *halt)
- COMMAND='/sbin/halt -p' ;;
- esac
- case $1 in
- start)
- ;;
- stop)
- ;;
- *)
- echo "Usage: `basename $0` {start|stop}"
- esac
- exec $COMMAND
- 50, #chmod +x etc/rc.d/init.d/halt
- 51, 创建符号链接 方便使用脚本里的 *reboot *halt 调用
- 52, #cd etc/rc.d/
- 53, #mkdir rc0.d rc6.d
- 54, # cd rc0.d/
- 55, # ln -sv ../init.d/halt S99halt
- 56, # ll 查看一下链接是否创建
- 57, # cd ..
- 58, # cd rc6.d/
- 59, # ln -sv ../init.d/halt S99reboot
- 60, # cd ..
- 61, # rm -rf rc.reboot rc.sysdone #删除这两个脚本现在已经不需要了
- 62, 创建rc 脚本 功能是把所有 S开头的开启 把所有K 开头的都关闭
- 63, # vim rc
- #!/bin/bash
- RUNLEVEL=$1
- for I in /etc/rc.d/rc$RUNLEVEL.d/K*;do
- $I stop
- done
- for I in /etc/rc.d/rc.$RUNLEVEL.d/S*;do
- $I start
- done
- 64, # chmod +x rc
- 65, # cd ..
- 66, # vim inittab #修改启动参数
- l0:0:wait:/etc/rc.d/rc 0
- l6:6:wait:/etc/rc.d/rc 6
- 67, # sync
- 68, 挂起宿主机 切换到小linux 测试
- 69, # init 0
- 70, # init 6
- 80, 切换回宿主机
- 90, 添加 init 3 级别
- 91, # cd /mnt/sysroot
- 92, # vim etc/inittab 添加:
- l3::wait:/etc/rc.d/rc 3
- 93, # cd etc/rc.d/
- 94, # mkdir rc3.d
- 95, # vim init.d/tserver
- #!/bin/bash
- # chkconfig: 35 66 33
- # description: test service script
- prog=`basename $0`
- lockfile=/var/lock/subsys/$prog
- start(){
- echo "starting $prog..."
- touch $lockfile
- }
- stop() {
- echo "stopping $prog..."
- rm -f $loclfile
- }
- status(){
- if [ -f $lockfile ]; then
- echo "Running..."
- else
- echo"Stopped..."
- fi
- }
- usage() {
- echo "Usage:$prog {start|stop|status|restart}"
- }
- case $1 in
- start)
- start ;;
- stop)
- stop ;;
- restart)
- stop
- start
- ;;
- status)
- status
- ;;
- *)
- usage
- exit 1
- ;;
- esac
- 96, # chmod +x init.d/tserver
- 97, # init.d/tserver start 测试脚本
- 98, # ls /var/lock/subsys 查看此目录下是否有 tserver 文件
- 99, # init.d/tserver stop 查看是否删除 tserver 文件
- 100,# cd rc3.d/
- 101,# ln -sv ../init.d/tserver S66tserver
- 102,# cd ..
- 103,# cd rc0.d/
- 104,# ln -sv ../init.d/tserver K33tserver
- 105,# sync
- 此处加一步如下:
- 1, cd
- 2, stty -F /dev/console speed 查看屋里终端速率
- ##################实现tty终端########
- 106,# cd /mnt/sysroot/etc/
- 107,# vim inittab
- 1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1
- 1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2
- 108,# vim rc.d/rc.sysinit
- #!/bin/bash
- echo -e "\tWelcome to \033[34mMageEdu\033[0m linux"
- /bin/bash ## 去掉此行
- 109,# cd
- 110,# ./bincp.sh 移植 agetty basename seq stty
- 111,# syuc
- 112,# cd /mnt/sysroot
- 113,# ln -sv bash sh
- 114,# sync
- 115, 挂起 宿主机 开启小linux 测试
- 如果文件系统错乱 修复方法如下:
- 切换到宿主机上
- 1,# cd /mnt/sysroot/
- 2,# find . | cpio -H newc --quiet -o | gzip > /root/sysroot.gz
- 3,# cd
- 4,# umount /dec/hda2
- 5,# fuser -km /dev/hda2
- 6,# umount /dev/hda2
- 7,# mke2fs -j /dev/hda2 或者用 e2fsck -f /dev/hda2
- 8,# mount /dev/hda2 /mnt/sysroot
- 9,# cd /mnt/sysroot
- 10,# zcat /root/sysroot.gz |cpio -id
- 11,# sync
- 116, ###################实现让根文件系统能自动挂载#############
- 117,# cd /mnt/sysroot
- 118,# vim etc/fstab 创建fstab 文件
- /dev/hda2 / ext3 defaults 0 0
- /dev/hda1 /boot ext3 defaults 0 0
- proc /proc ext3 defaults 0 0
- sysfs /sys sysfs defaults 0 0
- 119,# mkdir etc/sysconfig
- ####################### 添加主机名###############
- 120,# vim etc/sysconfig/network 设置主机名
- HOSTNAME=minilinux.magedu.com
- 121,# vim etc/rc.d/rc.sysinit 让开机以读写方式挂载根文件系统,并设置主机名
- echo "Remount rootfs"
- mount -n -o remount,rw /
- echo "set the hostname..."
- [ -f /etc/sysconfig/network ] && /etc/sysconfig/network
- [ -z $HOSTNAME -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost
- /bin/hostname $HOSTNAME
- 122,# sync
- 123,# 切换到 小linux 测试
- 124,# 切换到宿主机 添加系统启动时 显示的 绿色OK 和 红色报错
- ###################添加系统启动时 显示的 绿色OK 和 红色报错#############################
- 125,# cd /mnt/sysroot
- 126,# vim etc/rc.d/init.d/functions #定义启动时候的绿色 [ OK ] 和红色 [FAILED]
- SCREEN=`stty -F /dev/console size 2> /dev/null`
- COLUMNS=${SCREEN#*}
- [ -z $COLUMNS ] && COLUMNS=80
- SPA_COL=$[COLUMNS-14]
- RED='\033[31m'
- GREEN='\033[32m'
- YELLOW='\033[33m'
- BLUE='\033\34m'
- NORMAL='\033[0m'
- success() {
- string=$1
- RT_SPA=$[$SPA_COL-${#string}]
- echo -n "$string"
- for I in `seq 1 $RT_SPA`;do
- echo -n " "
- done
- echo -e "[ ${GREEN}OK${NORMAL} ]"
- }
- failure() {
- string=$1
- RT_SPA=$[$SPA_COL-${#string}]
- echo -n "$string"
- for I in `seq 1 $RT_SPA`;do
- echo -n " "
- done
- echo -e "[ $[RED]FAILED${NORMAL}]"
- }
- 127,# vim etc/rc.d/init.d/tserver 修改成如下内容:
- #!/bin/bash
- # chkconfig: 35 66 33
- # description: test service script
- . /etc/rc.d/init.d/functions
- prog=tserver
- lockfile=/var/lock/subsys/$prog
- start(){
- touch $lockfile
- [ $? -eq 0 ] && success "Starting $prog" || failure "Staring $prog"
- }
- stop() {
- rm -f $loclfile
- [ $? -eq 0 ] && success "Stoppting $prog" || failure "Stopping $prog"
- }
- status(){
- if [ -f $lockfile ]; then
- echo "Running..."
- else
- echo"Stopped..."
- fi
- }
- usage() {
- echo "Usage:$prog {start|stop|status|restart}"
- }
- case $1 in
- start)
- start ;;
- stop)
- stop ;;
- restart)
- stop
- start
- ;;
- status)
- status
- ;;
- *)
- usage
- exit 1
- ;;
- esac
- 128,# sync
- 129, 切换到下linux 下测试 启动信息是否 显示 绿色 [ OK ]
- 130, 切换到 宿主机 添加 ip地址功能
- #########################实现网卡功能#####################
- 131,# cd /mnt/sysroot
- 132,# mkdir lib/modules
- 133,# modinfo pcnet32 查看网卡模块都有那些依赖块
- 134,# cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules
- 135,# modinfo mii
- 136,# cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko /mnt/sysroot/lib/modules
- 137,# vim etc/rc.d/rc.sysinit 让系统启动自动装载网卡模块
- echo "Initializing network device..."
- /sbin/insmod /lib/modules/mii.ko
- /sbin/insmod /lib/modeles/pcnet32.ko
- 138,# mkdir etc/sysconfig/network-scripts 创建网卡目录
- 139,# vim etc/sysconfig/network-scripts/ifcfg-eth0
- DEVICE=eth0
- BOOTPROTO=static
- IPADDR=172.16.100.5
- NETMASK=255.255.0.0
- GATEWAY=172.16.0.1
- ONBOOT=yes
- 140,# vim etc/rc.d/init.d/network 让ip能在服务启动脚本自动启动
- #!/bin/bash
- # chkconfig: 35 09 90
- prog=network
- . /etc/rc.d/init.d/functions
- CONF=/etc/sysconfig/network-scripts/ifcfg-eth0
- . $CONF
- NETMASK=16
- start() {
- ifconfig eth0 $IPADDR/$NETMASK up
- [ -z $GATEWAY ] && route add default gw $GATEWAY
- }
- stop() {
- ifconfig eth0 down
- }
- status() {
- ifconfig eth0
- }
- usage() {
- echo "$prog: {start|stop|restart|status}"
- }
- case $1 in
- start)
- start
- success "Config network eth0"
- ;;
- stop)
- stop
- success "Config network card eth0"
- ;;
- restart)
- stop
- start
- success "Restart network card eth0"
- ;;
- status)
- status
- return 0
- ;;
- *)
- usage
- exit 1
- ;;
- esac
- 141,# chmod +x etc/rc.d/init.d/network
- 142, 让网卡能在级别3 开启 级别6 和 0 关闭
- 143,# cd et/rc.d/rc0.d/
- 144,# ln -sv ../init.d/network K90network
- 145,# cd ../rc6.d
- 146,# ln -sv ../init.d/network K90network
- 147,# cd ../rc3.d
- 148,# ln -sv ../init.d/network S09network
- 149,# sync
- 150, 测试一下网卡是否可以启动
- 151,# chroot /mnt/sysroot 在宿主机上切换到小linux
- 152,# /etc/rc.d/init.d/network start
- 到此为止 以个简小的linux 制作完成。 由于初次做裁剪linux 有写错或者使用不当的地方希望各位技术达人和博友 批评指正。
- !!!!在此先谢过!!!!