接着上次的话题,还是如何基于宿主机创建个小LINUX以及全自动的实现,这次的功能要比上次的完善些!添加了诸如打印个登陆界面可以实现让用户如入用户名密码再登陆,还有啊如果有人按上次那个做的话是不是发现没办法关机呢?呵呵,这次也同样的添加了关机的功能!首先要说明下这是在redhat的虚拟机环境下做的,如果有人想自己动手完整的从头做这个的话可以参考
http://marion.cublog.cn
在Linux系统管理目录里有一篇
一步步手动构建小于10M的类嵌入式Linux系统 的文章,自己可以按照上面的步骤一步一步自己动手做,里面用的Busybox就是模拟名利的东西,它能模拟出上百个常用的命令,因此就省去了复制命令和拷贝库文件这些过程!这个博客是我们老师的博客可惜已停止维护了!我也照着这个步骤做过一次,虽然上面说了是step by step不过不细心的人到最后还是发现kernel panic这种严重的错误(就像我),所以在这里稍微提醒大家注意几个地方吧!首先在宿主机上提供一块额外的硬盘作为新系统的存储盘,为了降低复杂度,这里添加使用一块IDE接口的新硬盘 这里一定要注意选择使用IDE接口的硬盘,在虚拟机环境下一般默认的是SCSI接口的,所以指定的时候一定要改下!还有在编译内核的时候(在接下来的博文中会有这部分的相关知识)一定要注意,如果和我一样英文功底不是很好的有很多看不懂的请参考如果此链接不好用的话,请在百度(说实话应该多用google)上搜金步国关于内核编译配置选项!上次边看这个文档边选,最后编译内核的时候12分钟就编好了!!不过最后做完的时候已经是晚上2点多了!上课刚开始学习编译内核的时候用的是redhat的配置文档,基本上很多看不懂的都没动!最后编译的时候花了1个多小时才弄好!可想而知如果是这样第二天恐怕上课的时候要睡大觉被骂了吧!其他的就不多说了,上面写的很清楚,还是提醒大家细心多注意就好了!别像我一样粗心大意的!到最后才发现出了大错!好的不多说了!还是把我改过的6合一脚本放这里望大家能给点儿宝贵的意见以助于这个脚本更加完善吧!因为老感觉时间不够用所以写的时候很多时候都是从以前的脚本中复制粘贴的(哎!不是偷懒实在是时间不够用啊!)很多不完善的地方还希望有时间有精力的人多给意见哈!
- #!/bin/bash
- #
- HELP() {
- echo "./createlinux2.sh -a:make a new linux|-d DEVICE_NAME:make a new fdisk|-m:mount the filesystem|-r:Initialize the rootfs | -b:copy the lib and command|-k:edit the interd file|-g:make grub.conf| -h:help files"
- }
- CHECKDISK() {
- fdisk -l $1 | grep "^\/dev"
- FENQU=`fdisk -l $1 | grep "^\/dev" | awk '{print $1}'`
- for I in $FENQU;do
- if mount | grep "$I" &> /dev/null;then
- mount | grep "$I"
- else
- echo "$I is not mounted"
- fi
- done
- }
- SPART() {
- dd if=/dev/zero of=$1 bs=512 count=1
- sleep .1
- echo "
- n
- p
- 1
- +50M
- n
- p
- 2
- +521M
- n
- p
- 3
- +256M
- t
- 3
- 82
- w
- " | fdisk $1
- mke2fs -j $11
- mke2fs -j $12
- mkswap -f $13
- partprobe $1
- }
- MYMOUNT (){
- if [ -d $2 ] ;then
- if mount | awk '{print$3}' | grep "$2" ;then
- fuser -km $2
- umount $2
- mount $1 $2
- else
- mount $1 $2
- fi
- else
- mkdir $2
- mount $1 $2
- fi
- }
- CHROOTS(){
- cd /mnt/$1
- mkdir {boot,proc,sys,dev,home,root,etc/{rc.d,sysconfig,init.d},bin,sbin,lib,usr/{bin,sbin,lib,include},var/{log,run},tmp,mnt,opt,media} -pv &>/dev/null
- chmod 777 tmp
- #the script for init 0 to shutdown the system
- cd /mnt/$1/etc/rc.d
- touch shutdown.sh
- cat >>shutdown.sh<
- #!/bin/bash
- sync
- sleep 2
- sync
- sync
- umount /dev/sda1
- umount /dev/sda2
- exec /sbin/halt -p
- EOF
- chmod +x shutdown.sh
- #the /sysroot/etc/inittab file and creat it
- touch /mnt/$1/etc/inittab
- cd /mnt/$1/etc
- cat >>inittab<
- #default level.
- id:3:initdefault:
- #--->rc.sysinit.
- si::sysinit:/etc/rc.d/rc.sysinit
- #----->init 0 to shutdown.
- l0:0:wait:/etc/rc.d/shutdown.sh
- #----->single user mode.
- l1:1:wait:/sbin/init -t1 S
- #----->the terminals of the minilinux
- 1:2345:respawn:/sbin/mingetty tty1
- 2:2345:respawn:/sbin/mingetty tty2
- EOF
- #cp the INTERNET CARD module to the minilinux
- cd /mnt/$1/lib
- mkdir -p modules
- cd modules
- cp /lib/modules/2.6.18-164.el5/kernel/drivers/net/mii.ko ./
- cp /lib/modules/2.6.18-164.el5/kernel/drivers/net/pcnet32.ko ./
- #the /etc/sysctl.conf file
- cd /mnt/$1/etc
- touch sysctl.conf
- cat >>sysctl.conf<
- net.ipv4.ip_forward = 0
- net.ipv4.ip_forward = 1
- net.ipv4.conf.default.rp_filter = 1
- net.ipv4.conf.default.accept_source_route = 0
- kernel.sysrq = 0
- kernel.core_uses_pid = 1
- net.ipv4.tcp_syncookies = 1
- kernel.msgmnb = 65536
- kernel.msgmax = 65536
- kernel.shmmax = 4294967295
- kernel.shmall = 268435456
- EOF
- #the /etc/rc.d/rc.sysinit file
- cd /mnt/$1/etc/rc.d
- touch rc.sysinit
- cat >>rc.sysinit<
- #!/bin/bash
- echo -e "\t\tWelcome to \033[31mMyLittle\033[0m Linux..."
- ##the network modules an set IP address to the minilinux##
- if [[ -x /sbin/sysctl && -r /etc/syctl.conf ]];then
- echo $"configuring kernel paremeters"
- /sbin/sysctl -p /etc/sysctl.conf
- echo $"....kernel parameters done."
- fi
- [ -e /lib/modules/mii.ko ] && /sbin/insmod /lib/modules/mii.ko
- [ -e /lib/modules/pcnet32.ko ] && /sbin/insmod /lib/modules/pcnet32.ko
- echo "load the eth cart drivers ok.."
- echo "set ip "
- /sbin/ifconfig lo 127.0.0.1/8
- /sbin/ifconfig eth0 192.168.0.57/24
- ##the network modules an set IP address to the minilinux##
- ###########The hostname for the minilinux
- [ -f /etc/sysconfig/network ] && source /etc/sysconfig/network
- [ -z $HOSTNAME ] && HOSTNAME=LocalHost
- echo $HOSTNAME > /proc/sys/kernel/hostname
- ##########hostname for the systerm
- mount -n -o remount,rw /
- mount -n -a
- EOF
- chmod +x rc.sysinit
- #the fstab file
- cd /mnt/$1/etc/
- touch fastab
- cat >> fstab << EOF
- /dev/sda2 / ext3 defaults 0 0
- /dev/sda1 /boot ext3 defaults 0 0
- sysfs /sys sysfs defaults 0 0
- proc /proc proc defaults 0 0
- EOF
- #the issue file to show the login infomation
- cd /mnt/$1/etc/
- touch issue
- cat >>issue<
- Red Hat Enterprise Linux Server release 5.4 (Tikanga)
- Kernel \r on an \m
- *************************
- *welcome to Ro's minilinux*
- *login:root;passwd: redhat*
- *************************
- EOF
- ##the /proc/sys/kernel file
- mkdir -p /mnt/sysroot/proc/sys/kernel/
- touch hostname
- cat >>hostname<
- Younan.littlelinux.com
- EOF
- #the yum.conf files
- mkdir -p /mnt/$1/etc/yum.repos.d/
- touch myyum.repo
- cat >>myyum.repo<
- [base]
- name=Instructor Server Repository
- baseurl=ftp://192.168.0.254/pub/Server
- gpgcheck=0
- [VT]
- name=Instructor VT Repository
- baseurl=ftp://192.168.0.254/pub/VT
- gpgcheck=0
- [Cluster]
- name=Instructor Cluster Repository
- baseurl=ftp://192.168.0.254/pub/Cluster
- gpgcheck=0
- [ClusterStorage]
- name=Instructor ClusterStorage Repository
- baseurl=ftp://192.168.0.254/pub/ClusterStorage
- gpgcheck=0
- EOF
- cd /mnt/$1/root/
- touch .bash_profile
- echo "PS1='[\u@\h \W]\$'">.bash_profile
- }
- LIB() {
- #cp the "login" file
- cp /tmp/myscript/login /mnt/sysroot/bin
- chmod +x /mnt/sysroot/bin/login
- #CP libnss files
- cp /usr/lib/libnss3.so /mnt/sysroot/usr/lib/
- cp /usr/lib/libnssckbi.so /mnt/sysroot/usr/lib/
- cp /usr/lib/libnssutil3.so /mnt/sysroot/usr/bin/
- cp -d /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/
- cp -d /usr/lib/libnss_compat.so /mnt/sysroot/usr/lib/
- cp -d /lib/libnss_files* /mnt/sysroot/lib/
- cp -d /lib/libnss_compat* /mnt/sysroot/lib/
- #cp login files
- cp -d /lib/libcrypt.so.1 /mnt/sysroot/lib/
- cp -d /lib/libcrypt-2.5.so /mnt/sysroot/lib/
- cp /lib/libm.so.6 /mnt/sysroot/lib/
- #cp -d /lib/libcrypt-2.5.so /mnt/sysroot/lib/
- #cp user and passwd files
- cp /etc/passwd /mnt/sysroot/etc/
- cp /etc/shadow /mnt/sysroot/etc/
- cp /etc/group /mnt/sysroot/etc/
- cp /etc/gshadow /mnt/sysroot/etc/
- #cp nsswitch.conf file
- cp /etc/nsswitch.conf /mnt/sysroot/etc/
- }
- MINGLING() {
- if which $1;then
- DR=`which $1 | grep -o "/.*" | sed -n 's/\(.*\)\/.*/\1/p'`
- FR=`which $1 | grep -o "/.*"`
- [ -d ${2}$DR ] || mkdir -pv ${2}$DR &> /dev/null
- [ -e ${2}$FR ]|| cp $FR ${2}$DR
- LIB=`ldd $FR | sed -n 's/.*\/lib\/\(.*\)/\1/gp' | awk '{print $1}'`
- for I in $LIB;do
- LDR=`ldd $FR | grep -o '/.*' | awk '{print $1}' | sed -n 's@\(/.*\)/'"$I"'@\1@gp'`
- [ -d ${2}$LDR ] || mkdir -pv ${2}$LDR &> /dev/null
- [ ! -e ${2}"$LDR"/"$LIB" ] && cp -f "$LDR"/"$I" ${2}$LDR
- done
- else
- echo "$1 is not exit."
- fi
- }
- NBOOTINIT() {
- TMPDIR=`mktemp -d /tmp/little.XX`
- cd $TMPDIR
- zcat /boot/initrd-2.6.18-164.el5.img | cpio -id
- sed -i 's/echo Scanning and configuring dmraid supported devices/#&/g' $TMPDIR/init
- sed -i 's/echo Scanning logical volumes/#&/g' $TMPDIR/init
- sed -i 's/lvm vgscan --ignorelockingfailure/#&/g' $TMPDIR/init
- sed -i 's/echo Activating logical volumes/#&/g' $TMPDIR/init
- sed -i 's/lvm vgchange -ay --ignorelockingfailure vol0/#&/g' $TMPDIR/init
- sed -i 's/resume LABEL=SWAP-sda3/#&/g' $TMPDIR/init
- sed -i 's@mkrootdev -t ext3 -o defaults,ro /dev/vol0/root/@mkrootdev -t ext3 -o defaults,ro sda2@#&@g' $TMPDIR/init
- find . | cpio -H newc -o --quiet | gzip -9 > $1/initrd.gz
- cp /boot/vmlinuz-2.6.18-164.el5 $1/vmlinuz
- }
- GRUB(){
- # install grub
- grub-install --root-directory=/mnt $CHOICE &>/dev/null
- #the context of grub file
- mkdir /mnt/boot/grub
- cd /mnt/boot/grub
- touch grub.conf
- cat >>grub.conf<
- default=0
- timeout=10
- title Welcome to Ro_Qi minilinux
- root (hd0,0)
- kernel /vmlinuz-2.6.28.10-myminilinux ro root=/dev/sda2
- initrd /initrd.gz
- EOF
- }
- while getopts "ad:mrbkgh" OPTS;do
- case $OPTS in
- a)
- read -p "please choose a disk:" UDISK
- CHECKDISK $UDISK
- SPART $UDISK
- MYMOUNT ${UDISK}1 /mnt/sysroot
- MYMOUNT ${UDISK}2 /mnt/sysroot
- CHROOTS sysroot
- LIB
- for I in ls ifconfig ping vim useradd userdel usermod yum lsmod modprobe touch insmod mkdir mingetty hostname mv rm vi runlevel sync halt chmod swapoff swapon sysctl umount cp cat init bash ;do
- MINGLING $I /mnt/sysroot
- done
- ln -sv bash sh &>/dev/null
- NBOOTINIT /mnt/boot
- rm -rf $TMPDIR
- GRUB
- sync
- sync
- sleep 2
- ;;
- d)
- CHECKDISK $OPTARG
- SPART $OPTARG
- ;;
- m)
- MYMOUNT ${UDISK}1 /mnt/boot
- MYMOUNT ${UDISK}2 /mnt/sysroot
- ;;
- r)
- CHROOTS sysroot
- ;;
- b)
- LIB
- for I in pwd ls ifconfig ping useradd userdel usermod yum lsmod modprobe touch insmod mkdir mingetty hostname mv rm vi runlevel sync halt chmod swapoff swapon sysctl umount cp cat init bash ;do
- MINGLING $I /mnt/sysroot
- done
- ln -sv bash sh &>/dev/null
- ;;
- k)
- NBOOTINIT /mnt/boot
- rm -rf $TMPDIR
- ;;
- g)
- GRUB
- sync
- sync
- sleep 2
- ;;
- h)
- HELP
- ;;
- *)
- HELP
- ;;
- esac
- done
这个是前天做的,由于当天要用Busybox按老师博客里重做小Linux还有在用Xshell总是卡死掉线!所以是在虚拟终端里一个字一个字打的时间上不够用因此很多地方都没加注释不过如果看过上篇的话这里还是比较容易看的里面多了个拷贝库文件的这是用来打印登陆界面用的,还有这里没有使用系统自带的login程序,用的是老师提供的!系统自带的似乎很麻烦!这个具体还不是很清楚为什么,老师说以后会讲到,等我弄清楚了再来补充吧!还有这里比较懒直接把存储用户及组,密码等信息的文件直接拷贝过去了,但是拷贝过去的用户是没有家目录的所以,大家在做的时候可以只拷贝部分内容可以结合head -n来做,然后在小Linux中可以为这些无家可归的用户指定家目录就OK啦!好了这个话题基本上就到此结束了!里面涉及的部分知识和在此过程中接触和学习的新东西会在以后的博客中陆续发布!敬请关注!
阅读(1123) | 评论(0) | 转发(0) |