Chinaunix首页 | 论坛 | 博客
  • 博客访问: 118313
  • 博文数量: 42
  • 博客积分: 932
  • 博客等级: 准尉
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-18 22:33
文章分类
文章存档

2011年(42)

分类: LINUX

2011-08-09 22:41:42

  接着上次的话题,还是如何基于宿主机创建个小LINUX以及全自动的实现,这次的功能要比上次的完善些!添加了诸如打印个登陆界面可以实现让用户如入用户名密码再登陆,还有啊如果有人按上次那个做的话是不是发现没办法关机呢?呵呵,这次也同样的添加了关机的功能!首先要说明下这是在redhat的虚拟机环境下做的,如果有人想自己动手完整的从头做这个的话可以参考http://marion.cublog.cn
在Linux系统管理目录里有一篇一步步手动构建小于10M的类嵌入式Linux系统 的文章,自己可以按照上面的步骤一步一步自己动手做,里面用的Busybox就是模拟名利的东西,它能模拟出上百个常用的命令,因此就省去了复制命令和拷贝库文件这些过程!这个博客是我们老师的博客可惜已停止维护了!我也照着这个步骤做过一次,虽然上面说了是step by step不过不细心的人到最后还是发现kernel panic这种严重的错误(就像我),所以在这里稍微提醒大家注意几个地方吧!首先在宿主机上提供一块额外的硬盘作为新系统的存储盘,为了降低复杂度,这里添加使用一块IDE接口的新硬盘 这里一定要注意选择使用IDE接口的硬盘,在虚拟机环境下一般默认的是SCSI接口的,所以指定的时候一定要改下!还有在编译内核的时候(在接下来的博文中会有这部分的相关知识)一定要注意,如果和我一样英文功底不是很好的有很多看不懂的请参考如果此链接不好用的话,请在百度(说实话应该多用google)上搜金步国关于内核编译配置选项!上次边看这个文档边选,最后编译内核的时候12分钟就编好了!!不过最后做完的时候已经是晚上2点多了!上课刚开始学习编译内核的时候用的是redhat的配置文档,基本上很多看不懂的都没动!最后编译的时候花了1个多小时才弄好!可想而知如果是这样第二天恐怕上课的时候要睡大觉被骂了吧!其他的就不多说了,上面写的很清楚,还是提醒大家细心多注意就好了!别像我一样粗心大意的!到最后才发现出了大错!好的不多说了!还是把我改过的6合一脚本放这里望大家能给点儿宝贵的意见以助于这个脚本更加完善吧!因为老感觉时间不够用所以写的时候很多时候都是从以前的脚本中复制粘贴的(哎!不是偷懒实在是时间不够用啊!)很多不完善的地方还希望有时间有精力的人多给意见哈!
  1. #!/bin/bash
  2. #
  3. HELP() {
  4. 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"
  5. }
  6. CHECKDISK() {
  7. fdisk -l $1 | grep "^\/dev"
  8. FENQU=`fdisk -l $1 | grep "^\/dev" | awk '{print $1}'`
  9. for I in $FENQU;do
  10. if mount | grep "$I" &> /dev/null;then
  11. mount | grep "$I"
  12. else
  13. echo "$I is not mounted"
  14. fi
  15. done
  16. }
  17. SPART() {
  18. dd if=/dev/zero of=$1 bs=512 count=1
  19. sleep .1
  20. echo "
  21. n
  22. p
  23. 1
  24. +50M
  25. n
  26. p
  27. 2
  28. +521M
  29. n
  30. p
  31. 3
  32. +256M
  33. t
  34. 3
  35. 82
  36. w
  37. " | fdisk $1
  38. mke2fs -j $11
  39. mke2fs -j $12
  40. mkswap -f $13
  41. partprobe $1
  42. }
  43. MYMOUNT (){
  44. if [ -d $2 ] ;then
  45. if mount | awk '{print$3}' | grep "$2" ;then
  46. fuser -km $2
  47. umount $2
  48. mount $1 $2
  49. else
  50. mount $1 $2
  51. fi
  52. else
  53. mkdir $2
  54. mount $1 $2
  55. fi
  56. }
  57. CHROOTS(){
  58. cd /mnt/$1
  59. 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
  60. chmod 777 tmp
  61. #the script for init 0 to shutdown the system
  62. cd /mnt/$1/etc/rc.d
  63. touch shutdown.sh
  64. cat >>shutdown.sh<
  65. #!/bin/bash
  66. sync
  67. sleep 2
  68. sync
  69. sync
  70. umount /dev/sda1
  71. umount /dev/sda2
  72. exec /sbin/halt -p
  73. EOF
  74. chmod +x shutdown.sh
  75. #the /sysroot/etc/inittab file and creat it
  76. touch /mnt/$1/etc/inittab
  77. cd /mnt/$1/etc
  78. cat >>inittab<
  79. #default level.
  80. id:3:initdefault:
  81. #--->rc.sysinit.
  82. si::sysinit:/etc/rc.d/rc.sysinit
  83. #----->init 0 to shutdown.
  84. l0:0:wait:/etc/rc.d/shutdown.sh
  85. #----->single user mode.
  86. l1:1:wait:/sbin/init -t1 S
  87. #----->the terminals of the minilinux
  88. 1:2345:respawn:/sbin/mingetty tty1
  89. 2:2345:respawn:/sbin/mingetty tty2
  90. EOF
  91. #cp the INTERNET CARD module to the minilinux
  92. cd /mnt/$1/lib
  93. mkdir -p modules
  94. cd modules
  95. cp /lib/modules/2.6.18-164.el5/kernel/drivers/net/mii.ko ./
  96. cp /lib/modules/2.6.18-164.el5/kernel/drivers/net/pcnet32.ko ./
  97. #the /etc/sysctl.conf file
  98. cd /mnt/$1/etc
  99. touch sysctl.conf
  100. cat >>sysctl.conf<
  101. net.ipv4.ip_forward = 0
  102. net.ipv4.ip_forward = 1
  103. net.ipv4.conf.default.rp_filter = 1
  104. net.ipv4.conf.default.accept_source_route = 0
  105. kernel.sysrq = 0
  106. kernel.core_uses_pid = 1
  107. net.ipv4.tcp_syncookies = 1
  108. kernel.msgmnb = 65536
  109. kernel.msgmax = 65536
  110. kernel.shmmax = 4294967295
  111. kernel.shmall = 268435456
  112. EOF
  113. #the /etc/rc.d/rc.sysinit file
  114. cd /mnt/$1/etc/rc.d
  115. touch rc.sysinit
  116. cat >>rc.sysinit<
  117. #!/bin/bash
  118. echo -e "\t\tWelcome to \033[31mMyLittle\033[0m Linux..."
  119. ##the network modules an set IP address to the minilinux##
  120. if [[ -x /sbin/sysctl && -r /etc/syctl.conf ]];then
  121. echo $"configuring kernel paremeters"
  122. /sbin/sysctl -p /etc/sysctl.conf
  123. echo $"....kernel parameters done."
  124. fi
  125. [ -e /lib/modules/mii.ko ] && /sbin/insmod /lib/modules/mii.ko
  126. [ -e /lib/modules/pcnet32.ko ] && /sbin/insmod /lib/modules/pcnet32.ko
  127. echo "load the eth cart drivers ok.."
  128. echo "set ip "
  129. /sbin/ifconfig lo 127.0.0.1/8
  130. /sbin/ifconfig eth0 192.168.0.57/24
  131. ##the network modules an set IP address to the minilinux##
  132. ###########The hostname for the minilinux
  133. [ -f /etc/sysconfig/network ] && source /etc/sysconfig/network
  134. [ -z $HOSTNAME ] && HOSTNAME=LocalHost
  135. echo $HOSTNAME > /proc/sys/kernel/hostname
  136. ##########hostname for the systerm
  137. mount -n -o remount,rw /
  138. mount -n -a
  139. EOF
  140. chmod +x rc.sysinit
  141. #the fstab file
  142. cd /mnt/$1/etc/
  143. touch fastab
  144. cat >> fstab << EOF
  145. /dev/sda2 / ext3 defaults 0 0
  146. /dev/sda1 /boot ext3 defaults 0 0
  147. sysfs /sys sysfs defaults 0 0
  148. proc /proc proc defaults 0 0
  149. EOF
  150. #the issue file to show the login infomation
  151. cd /mnt/$1/etc/
  152. touch issue
  153. cat >>issue<
  154. Red Hat Enterprise Linux Server release 5.4 (Tikanga)
  155. Kernel \r on an \m
  156. *************************
  157. *welcome to Ro's minilinux*
  158. *login:root;passwd: redhat*
  159. *************************
  160. EOF
  161. ##the /proc/sys/kernel file
  162. mkdir -p /mnt/sysroot/proc/sys/kernel/
  163. touch hostname
  164. cat >>hostname<
  165. Younan.littlelinux.com
  166. EOF
  167. #the yum.conf files
  168. mkdir -p /mnt/$1/etc/yum.repos.d/
  169. touch myyum.repo
  170. cat >>myyum.repo<
  171. [base]
  172. name=Instructor Server Repository
  173. baseurl=ftp://192.168.0.254/pub/Server
  174. gpgcheck=0
  175. [VT]
  176. name=Instructor VT Repository
  177. baseurl=ftp://192.168.0.254/pub/VT
  178. gpgcheck=0
  179. [Cluster]
  180. name=Instructor Cluster Repository
  181. baseurl=ftp://192.168.0.254/pub/Cluster
  182. gpgcheck=0
  183. [ClusterStorage]
  184. name=Instructor ClusterStorage Repository
  185. baseurl=ftp://192.168.0.254/pub/ClusterStorage
  186. gpgcheck=0
  187. EOF
  188. cd /mnt/$1/root/
  189. touch .bash_profile
  190. echo "PS1='[\u@\h \W]\$'">.bash_profile
  191. }
  192. LIB() {
  193. #cp the "login" file
  194. cp /tmp/myscript/login /mnt/sysroot/bin
  195. chmod +x /mnt/sysroot/bin/login
  196. #CP libnss files
  197. cp /usr/lib/libnss3.so /mnt/sysroot/usr/lib/
  198. cp /usr/lib/libnssckbi.so /mnt/sysroot/usr/lib/
  199. cp /usr/lib/libnssutil3.so /mnt/sysroot/usr/bin/
  200. cp -d /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/
  201. cp -d /usr/lib/libnss_compat.so /mnt/sysroot/usr/lib/
  202. cp -d /lib/libnss_files* /mnt/sysroot/lib/
  203. cp -d /lib/libnss_compat* /mnt/sysroot/lib/
  204. #cp login files
  205. cp -d /lib/libcrypt.so.1 /mnt/sysroot/lib/
  206. cp -d /lib/libcrypt-2.5.so /mnt/sysroot/lib/
  207. cp /lib/libm.so.6 /mnt/sysroot/lib/
  208. #cp -d /lib/libcrypt-2.5.so /mnt/sysroot/lib/
  209. #cp user and passwd files
  210. cp /etc/passwd /mnt/sysroot/etc/
  211. cp /etc/shadow /mnt/sysroot/etc/
  212. cp /etc/group /mnt/sysroot/etc/
  213. cp /etc/gshadow /mnt/sysroot/etc/
  214. #cp nsswitch.conf file
  215. cp /etc/nsswitch.conf /mnt/sysroot/etc/
  216. }
  217. MINGLING() {
  218. if which $1;then
  219. DR=`which $1 | grep -o "/.*" | sed -n 's/\(.*\)\/.*/\1/p'`
  220. FR=`which $1 | grep -o "/.*"`
  221. [ -d ${2}$DR ] || mkdir -pv ${2}$DR &> /dev/null
  222. [ -e ${2}$FR ]|| cp $FR ${2}$DR
  223. LIB=`ldd $FR | sed -n 's/.*\/lib\/\(.*\)/\1/gp' | awk '{print $1}'`
  224. for I in $LIB;do
  225. LDR=`ldd $FR | grep -o '/.*' | awk '{print $1}' | sed -n 's@\(/.*\)/'"$I"'@\1@gp'`
  226. [ -d ${2}$LDR ] || mkdir -pv ${2}$LDR &> /dev/null
  227. [ ! -e ${2}"$LDR"/"$LIB" ] && cp -f "$LDR"/"$I" ${2}$LDR
  228. done
  229. else
  230. echo "$1 is not exit."
  231. fi
  232. }
  233. NBOOTINIT() {
  234. TMPDIR=`mktemp -d /tmp/little.XX`
  235. cd $TMPDIR
  236. zcat /boot/initrd-2.6.18-164.el5.img | cpio -id
  237. sed -i 's/echo Scanning and configuring dmraid supported devices/#&/g' $TMPDIR/init
  238. sed -i 's/echo Scanning logical volumes/#&/g' $TMPDIR/init
  239. sed -i 's/lvm vgscan --ignorelockingfailure/#&/g' $TMPDIR/init
  240. sed -i 's/echo Activating logical volumes/#&/g' $TMPDIR/init
  241. sed -i 's/lvm vgchange -ay --ignorelockingfailure vol0/#&/g' $TMPDIR/init
  242. sed -i 's/resume LABEL=SWAP-sda3/#&/g' $TMPDIR/init
  243. sed -i 's@mkrootdev -t ext3 -o defaults,ro /dev/vol0/root/@mkrootdev -t ext3 -o defaults,ro sda2@#&@g' $TMPDIR/init
  244. find . | cpio -H newc -o --quiet | gzip -9 > $1/initrd.gz
  245. cp /boot/vmlinuz-2.6.18-164.el5 $1/vmlinuz
  246. }
  247. GRUB(){
  248. # install grub
  249. grub-install --root-directory=/mnt $CHOICE &>/dev/null
  250. #the context of grub file
  251. mkdir /mnt/boot/grub
  252. cd /mnt/boot/grub
  253. touch grub.conf
  254. cat >>grub.conf<
  255. default=0
  256. timeout=10
  257. title Welcome to Ro_Qi minilinux
  258. root (hd0,0)
  259. kernel /vmlinuz-2.6.28.10-myminilinux ro root=/dev/sda2
  260. initrd /initrd.gz
  261. EOF
  262. }
  263. while getopts "ad:mrbkgh" OPTS;do
  264. case $OPTS in
  265. a)
  266. read -p "please choose a disk:" UDISK
  267. CHECKDISK $UDISK
  268. SPART $UDISK
  269. MYMOUNT ${UDISK}1 /mnt/sysroot
  270. MYMOUNT ${UDISK}2 /mnt/sysroot
  271. CHROOTS sysroot
  272. LIB
  273. 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
  274. MINGLING $I /mnt/sysroot
  275. done
  276. ln -sv bash sh &>/dev/null
  277. NBOOTINIT /mnt/boot
  278. rm -rf $TMPDIR
  279. GRUB
  280. sync
  281. sync
  282. sleep 2
  283. ;;
  284. d)
  285. CHECKDISK $OPTARG
  286. SPART $OPTARG
  287. ;;
  288. m)
  289. MYMOUNT ${UDISK}1 /mnt/boot
  290. MYMOUNT ${UDISK}2 /mnt/sysroot
  291. ;;
  292. r)
  293. CHROOTS sysroot
  294. ;;
  295. b)
  296. LIB
  297. 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
  298. MINGLING $I /mnt/sysroot
  299. done
  300. ln -sv bash sh &>/dev/null
  301. ;;
  302. k)
  303. NBOOTINIT /mnt/boot
  304. rm -rf $TMPDIR
  305. ;;
  306. g)
  307. GRUB
  308. sync
  309. sync
  310. sleep 2
  311. ;;
  312. h)
  313. HELP
  314. ;;
  315. *)
  316. HELP
  317. ;;
  318. esac
  319. done

这个是前天做的,由于当天要用Busybox按老师博客里重做小Linux还有在用Xshell总是卡死掉线!所以是在虚拟终端里一个字一个字打的时间上不够用因此很多地方都没加注释不过如果看过上篇的话这里还是比较容易看的里面多了个拷贝库文件的这是用来打印登陆界面用的,还有这里没有使用系统自带的login程序,用的是老师提供的!系统自带的似乎很麻烦!这个具体还不是很清楚为什么,老师说以后会讲到,等我弄清楚了再来补充吧!还有这里比较懒直接把存储用户及组,密码等信息的文件直接拷贝过去了,但是拷贝过去的用户是没有家目录的所以,大家在做的时候可以只拷贝部分内容可以结合head -n来做,然后在小Linux中可以为这些无家可归的用户指定家目录就OK啦!好了这个话题基本上就到此结束了!里面涉及的部分知识和在此过程中接触和学习的新东西会在以后的博客中陆续发布!敬请关注!
阅读(1123) | 评论(0) | 转发(0) |
0

上一篇:LINUX学习之路12

下一篇:LINUX学习之路16

给主人留下些什么吧!~~