前言

在上一篇博客中(http://freeloda.blog.51cto.com/2033581/1220803),我们说明了怎样快速建立一个自己的专属Linux,但是这个小型Linux还是不特别和完善,只有简单的开机界面和bash功能,在这一篇博客中我们将完善它,我们将增加开关机功能,登录功能,网络功能 ……

1. 写一个脚本,实现对二进制命令及相应库文件的复制

(1). 目的:

在上一篇博客中,我们复制二进制命令及对应的库文件复制时,都是一个一个复制,先是用 which 命令查找路径,后用 ldd 命令查找相关的库文件,很是不方便!下面我们就写个脚本,实现自动复制二进制命令及相应库文件! ^_^ ……

(2). 具体要求如下:

1)、写一个函数,接受两个参数(参数1,为要复制的命令,参数2,为复制命令对应的目标位置,如/mnt/sysroot),完成以下功能:    
  a. 判断“参数1” 所对应的命令是否存在,如果存在:取得其目录路径,及命令对应的文件的名字,而后将此命令复制到“参数2” 对应的路径下,跟此命令原来的目录路径相同的子目录中;比如,如果“参数2” 为/mnt/sysroot,而命令路径为/bin/ls,则需要将ls复制到/mnt/sysroot/bin目录;如果命令路径为/usr/bin/man,则需要将man复制至/mnt/sysroot/usr/bin/中去。

b. 复制命令的同时,判定此命令所依赖的库文件,而后对每一个库文件做如下操作,取得其目录路径,及命令对应的文件的名字,而后将此命令复制到“参数2” 对应的路径下,跟此命令原来的目录路径相同的子目录中;但如果此库文件已经复制过,则不需要再次复制。    
2)、执行此函数 。

(3). 具体脚本如下:

vim addcom.sh
#!/bin/bash
#
DEST=/mnt/sysroot
DIRE() {
if [ -d $DEST/$CMD ]; thenecho "this direstory is inxted"elsemkdir -p $DEST/$CMD &> /dev/nullecho "$CMD is a directory,mkdir finished"
fi
}
libcp() {
LIBPATH=${1%/*}[ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH[ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib64 $1 finished."
}
bincp() {
CMDPATH=${1%/*}[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH[ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATHfor LIB in  `ldd $1 | grep -o "/.*lib64/[^[:space:]]\{1,\}"`; dolibcp $LIBdone
}
read -p "Your command: " CMD
until [ $CMD == 'q' ]; dowhich $CMD &>/dev/null
MM=`echo $?`if [ $MM -eq 0 ]; then! which $CMD && echo "Wrong command" && read -p "Input againe: " CMD && continue
COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`bincp $COMMANDecho "copy $COMMAND finished."read -p "Continue:  " CMDelseDIREread -p "Continue:  " CMD
fi
done
:wq

注意:我这边的操作系统是CentOS 5.5 64位操作系统,所有的lib文件都在/mnt/sysroot/lib64中,若你是32位系统,请修改16与22行,将lib64目录改为lib目录!

(4). 效果如下:

[root@localhost ~]# sh addcom.sh
Your command: ifconfig
/sbin/ifconfig
copy /sbin/ifconfig finished.
Continue:
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# /mnt/sysroot/sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:16:63:C0inet addr:192.168.1.116  Bcast:255.255.255.255  Mask:255.255.255.0   inet6 addr: fe80::20c:29ff:fe16:63c0/64 Scope:Link   UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1   RX packets:19633 errors:0 dropped:0 overruns:0 frame:0   TX packets:13649 errors:0 dropped:0 overruns:0 carrier:0   collisions:0 txqueuelen:1000   RX bytes:4932356 (4.7 MiB)  TX bytes:2409236 (2.2 MiB)
lo        Link encap:Local Loopbackinet addr:127.0.0.1  Mask:255.0.0.0   inet6 addr: ::1/128 Scope:Host   UP LOOPBACK RUNNING  MTU:16436  Metric:1   RX packets:32 errors:0 dropped:0 overruns:0 frame:0   TX packets:32 errors:0 dropped:0 overruns:0 carrier:0   collisions:0 txqueuelen:0   RX bytes:6138 (5.9 KiB)  TX bytes:6138 (5.9 KiB)

2. 实现关机与重启功能

1)、修改inittab文件

[root@localhost ~]# vim /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
#新增两行
l0:0:wait:/etc/rc.d/rc 0
l6:6:wait:/etc/rc.d/rc 6
: wq

2)、复制两个命令reboot和halt

[root@localhost ~]# sh addcom.sh
Your command: reboot
/sbin/reboot
copy /sbin/reboot finished.
Continue:  halt
/sbin/halt
copy /sbin/halt finished.
Continue:  sync
/bin/sync
copy /bin/sync finished.
[root@localhost ~]# cd /mnt/sysroot/sbin/
[root@localhost sbin]# ls
halt  ifconfig  init  reboot
[root@localhost sbin]# cd /mnt/sysroot/bin
[root@localhost bin]# ls
bash  ls  mount  sync
[root@localhost bin]#

3)、新增开关机脚本

[root@localhost init.d]# pwd
/mnt/sysroot/etc/rc.d/init.d
[root@localhost init.d]# vim halt
#!/bin/bash
#
case $0 in
*reboot)
COMMAND='/sbin/reboot'
;;
*halt)
COMMAND='/sbin/halt –p'
;;
*)
echo "only call thsi script *reboot *halt"
;;
esacexec $COMMAND
:wq
[root@localhost rc.d]#

4)、新增 rc 脚本

[root@localhost rc.d]# pwd
/mnt/sysroot/etc/rc.d
[root@localhost rc.d]# ls
init.d  rc  rc0.d  rc6.d  rc.sysinit
[root@localhost rc.d]# 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
:wq
[root@localhost rc.d]#

5)、测试效果

init 0 关机效果:

init 6 重启效果:

3. 增加 rc3.d 级别的运行脚本

在上面的测试中,我们实现了关机与重启功能,同时大家也看到了,我们实现了 rc0.d,rc6.d 级别脚本的运行,下面我们看一下怎么实现 rc3.d 级别下实现脚本运行!

1)、修改 inittab 文件

[root@localhost ~]# vim /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l3:3:wait:/etc/rc.d/rc 3 #新增一行
l6:6:wait:/etc/rc.d/rc 6

2)、增加一个测试脚本 tserver 来测试第三级别的运行情况

#!/bin/bash
#
# chkconfig: 35 55 44
# description: test service script
#
FILE=/var/lock/subsys/`basename $0`
start() {
echo "starting `basename $0`..."
touch $FILE
}
stop() {
echo "stopping `basename $0`..."
rm -rf $FILE
}
status() {
if [ -e $FILE ]; thenecho "Running.."
elseecho "stopping..."
fi
}
usage() {
echo "please insernt like start|stop|restart|status"
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)stopstart
;;
status)
status
;;
*)
usage
exit 1
;;
esac

3)、移植相关命令

[root@localhost ~]# sh addcom.sh
Your command: chkconfig
/sbin/chkconfig
copy /sbin/chkconfig finished.
Continue:  basename
/bin/basename
copy /bin/basename finished.
Continue:
[root@localhost ~]#

经过上面的是三个步骤,应该是可以执行的,但是还是不能执行的!我们还得进行下面的步骤!

4)、增加 rc3.d 目录和相关的软链接

[root@localhost ~]# cd /mnt/sysroot/etc/rc.d/
[root@localhost rc.d]# mkdir rc3.d
[root@localhost rc.d]# ls
init.d  rc  rc0.d  rc3.d  rc6.d  rc.sysinit
[root@localhost rc.d]# cd rc3.d
[root@localhost rc3.d]# ln -sv ../init.d/tserver S55tserver
[root@localhost rc.d]#cd rc0.d
[root@localhost rc0.d]# ln -sv ../init.d/tserver K44tserver
[root@localhost rc.d]#cd rc6.d
[root@localhost rc6.d]# ln -sv ../init.d/tserver K44tserver

5)、修改inittab文件

[root@localhost ~]# vim /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l3:3:wait:/etc/rc.d/rc 3
l6:6:wait:/etc/rc.d/rc 6
#新增下面两行
1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1
2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2
#loginprog运行依赖/bin/sh.把bin下的bash连接为sh即可实现

6)、移植 mingetty 命令

[root@localhost ~]# sh addcom.sh
Your command: mingetty
/sbin/mingetty
copy /sbin/mingetty finished.

7)、loginprog运行依赖/bin/sh,把bin下的bash连接为sh即可实现

[root@localhost ~]# cd /mnt/sysroot/bin/
[root@localhost bin]# ls
basename  bash  df  ls  mkdir  mount  sync  tar  touch  umount
[root@localhost bin]# ln -sv bash sh
create symbolic link `sh' to `bash'
[root@localhost bin]# ll
total 1384
-rwxr-xr-x 1 root root  20984 Jun 13 04:02 basename
-rwxr-xr-x 1 root root 801512 Jan 22  2009 bash
-rwxr-xr-x 1 root root  43192 Jun 13 03:11 df
-rwxr-xr-x 1 root root  91240 Mar  1  2010 ls
-rwxr-xr-x 1 root root  31664 Jun 13 03:10 mkdir
-rwsr-xr-x 1 root root  60432 Jan 20  2010 mount
lrwxrwxrwx 1 root root      4 Jun 13 04:32 sh -> bash
-rwxr-xr-x 1 root root  20216 Jun 13 01:18 sync
-rwxr-xr-x 1 root root 230464 Jun 13 03:11 tar
-rwxr-xr-x 1 root root  42696 Jun 13 03:10 touch
-rwsr-xr-x 1 root root  40208 Jun 13 03:11 umount
[root@localhost bin]#

8)、修改 rc.sysinit 文件

[root@localhost ~]# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux"
mount -n -o remount.rw /
mount -n –a
/bin/bash # 删除这一行
:wq

9)、测试

最后大家会发现 mingetty 只能启动两个终端,但还是不能启动 3 级别的脚本!而且还没有主机名只显示 (none),大家别急,下面我们再来完善它!

4. 增加主机名

从上图中我们可以看出没有主机名,下面我们不先添加主机名!

1)、修改 rc.sysinit 文件

[root@localhost sysconfig]# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
#
#显示开机提示符
echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux"
#重新挂载垠文件系统
echo "mount /"
mount -n -o remount,rw /
#挂载所有文件系统
echo "mount all partitions"
mount -n -a
#增加主机名
echo "set the hsotname"
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
[ -z $HOSTNAME -o "$HSOTNAME" == '(none)' ] && HOSTNAME=localhost
/bin/hostname $HOSTNAME

2)、移植 hostname 命令

[root@localhost ~]# sh addcom.sh
Your command: hostname
/bin/hostname
copy /bin/hostname finished.

3)、测试

主机名增加完成 !

5. 开启虚拟终端

由于mingetty需要用户登陆,且无法启动三级别的脚本,下面利用agetty来进行登陆验证

1)、移植 agetty 命令

[root@localhost ~]# sh addcom.sh
Your command: agetty
/sbin/agetty
copy /sbin/agetty finished.

2)、修改 inittab 文件

[root@localhost ~]# vim /mnt/sysroot/etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l3:3:wait:/etc/rc.d/rc 3
l6:6:wait:/etc/rc.d/rc 6
#下面两行删除
1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1
2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2
#新增下面两行
1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1
2:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2

3)、测试

大家看到了吧, Tserver 启动了,而且还进入了终端!但是touch时不能新建文件是因为我们这里没有subsys目录!修改如下

4)、修正

新建subsys目录

[root@localhost ~]# cd /mnt/sysroot/var/lock/
[root@localhost lock]# ls
[root@localhost lock]# mkdir subsys
[root@localhost lock]# ls
subsys
[root@localhost lock]#

再测试一下

测试成功!现在我们的小Linux 已经有了, 开关机功能,也能在 3 级别下运行脚本(服务)!下一篇博客中我们将增加网络功能 ^_^ ……

转载于:https://blog.51cto.com/freeloda/1221075

从 CentOS 5.5 中精简出属于自己的专属Linux(二)相关推荐

  1. 在CentOs 5.1中使用rpm安装NGINX+php+mysql(二)

    算是原创.转载请注明此地址,随着对NGINX认知的深入,此文会不定期更新或是修正. 以下兵分两路来说明:一是直接利用php-cgi的FastCGI运行方式:二是利用Lighttpd的spawn-fcg ...

  2. 爱情指数测试脸型软件,性格解析测试 从6类脸型中透视出你的性格及爱情

    [IMG1] 性格解析测试 从6类脸型中透视出你的性格及爱情 据最新性格解析测试得出, 一个人的脸型会泄露你的性格,而不同的性格遇到的爱情也是截然不同的,所以还可以从一个人的脸型透视你的爱情运势,那么 ...

  3. centos查找linux大文件,centos中查找出大文件命令汇总

    在linux中简单的查找文件与目录大小很简单 #已易读的格式显示指定目录或文件的大小,-s选项指定对于目录不详细显示每个子目录或文件的大小 du -sh [dirname|filename] 如: 当 ...

  4. 【网络安全】如何使用PacketSifter从pcap中筛选出有用的信息

    关于PacketSifter PacketSifter这款工具旨在帮助广大研究/分析人员从捕捉到的数据包文件(pcap)中筛选出其中有价值或值得分析的流量数据.PacketSifter可以接受一个pc ...

  5. centos在文本中搜索字符串_Google和Baidu的搜索技巧你会吗?

    今日分享:人要有三个头脑,天生的一个头脑,从书中得来的一个头脑,从生活中得来的一个头脑.----<蒙田随笔> 前言 搜索引擎我们经常使用,但是我们最常用的可能就是把要搜索的内容直接复制到搜 ...

  6. linux 7 tmpfs,技术|如何在RHEL/CentOS 7.0中使用tmpfs

    今天我们来谈谈 Centos 7 中的一个文件系统tmpfs,这是一个将所有文件和文件夹写到虚拟内存中而不是实际写到磁盘中的虚拟文件系统.这意味中tmpfs中所有的内容都是临时的,在tmpfs卸载.系 ...

  7. c++ 进程快照_如何在 Linux 中找出内存消耗最大的进程

    很多次,你可能遇见过系统消耗了过多的内存.如果是这种情况,那么最好的办法是识别出 Linux 机器上消耗过多内存的进程. -- Magesh Maruthamuthu(作者) 很多次,你可能遇见过系统 ...

  8. 获取线程中抛出的异常信息

    1 ScheduledExecutorService service = Executors.newScheduledThreadPool(10); 2 // 从现在开始delay毫秒之后,每隔一天执 ...

  9. 【面试现场】如何在10亿数中找出前1000大的数

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已经挂了两家,今天小史去了BAT中的最后一家面试了. 简单的 ...

最新文章

  1. 第三周项目三-输出星号图(2)
  2. 抢红包的红包生成算法
  3. Mozilla发布2015年度报告:搜索合作成营收大头
  4. 采用计算机发布调度命令时 必须严格遵守,实用文档其他之铁路调度命令格式图片调度命令规范格式...
  5. 软件测试用例_软件测试用例设计实战场景法
  6. Java设计模式 - 示例教程
  7. 日志组件logback的介绍及配置使用方法(一)
  8. 删除Word2016文本外的黑边框,有截图
  9. 计算机硬件基础-笔记
  10. poj 1961 Period kmp基础
  11. visio2016下载与安装
  12. Xshell6 + Xftp6 绿色破解
  13. 英文写作第一反应词替换表
  14. 自抗扰控制中的扩张状态观测器收敛性分析1
  15. 【newCoder】2016校招真题在线编程 风口的猪-中国牛市
  16. C ++ primer
  17. Camera Raw图解析
  18. 基于javaweb+jsp的医院住院管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Bootstrap)
  19. python--1、入门
  20. 【揭秘】1024特企- 前端仔微信里都藏着什么

热门文章

  1. 怎么让java技术变强_java中的方法
  2. Docker的mysql镜像_详解docker下的Mysql镜像的使用方法
  3. python怎么处理数据集的缺失值_python 对数据集的缺失值补全方法 sklearn.preprocessing.Imputer...
  4. mysql 调用存储过程 inout_MySQL存储过程in、out和inout参数示例和总结
  5. 计算机网络的功能分布计算,网络中心的分布计算(转帖)
  6. hive和hadoop关系
  7. 物联网核心安全系列——智能家居与数据安全问题
  8. 抄底指标:秘密买卖点
  9. 乔丹LeCun李开复隔空对话:我们对智能一无所知;AI研究的12大趋势
  10. javaweb项目自动设置热加载