脚本编程知识点:
1、变量中字符的长度:${#VARNAME}
2、变量赋值等:
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;A=3 echo ${A:-30} unset A echo ${A:-30}(30) echo $A(空)
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
${parameter:offset}echo A=’hello world’${A:2}
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
3、脚本配置文件
/etc/rc.d/init.d/服务脚本
服务脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件
4、局部变量
local VAR_NAME=
a=1
test() {
a=$[3+4]
}
test
for I in `seq $a 10`; do
echo $I
done
5、命令mktemp
创建临时文件或目录
mktemp /tmp/file.XX
-d:创建为目录
6、信号
kill -SIGNAL PID
1:HUP
2:INT
9:KILL
15:TERM
脚本中,能实现信号捕捉,但9和15无法捕捉
Ctrl+c: SIGINT 2
trap命令:
trap'COMMAND' 信号列表
7、一行执行多个语句,语句间用分号分隔
任务计划:
1、在未来的某个时间点执行一次某任务;
at
batch
at时间(at now+3minutes
ls /var
cat /etc/fstab
Ctrl+d
)
at>COMMAND
at>Ctrl+d
指定时间:
绝对时间:HH:MM,DD.MM.YY MM/DD/YY
相对时间:now+#
单位:minutes,hours, days, weeks
模糊时间:noon,midnight, teatime(喝茶时间下午4点)
命令的执行结果:将以邮件的形式发送给安排任务的用户
at-l = atq(查看作业)
at-d AT_JOB_ID = atrm AT_JOB_ID(at –d 2 )
(at–l )
2、周期性地执行某任务;
cron:自身是一个不间断运行的服务
anacron:cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务在恢复正常执行一次;
cron:
系统cron任务:
/etc/crontab
分钟 小时 天 月 周 用户 任务
用户cron任务:
/var/spool/cron/USERNAME
分钟 小时 天 月 周 任务
时间的有效取值:
分钟:0-59
小时:0-23
天:1-31
月:1-12
周:0-7,0和7都表示周日
时间通配表示:
*:对应时间的所有有效取值
3* * * * 每个小时的第3分钟
3* * * 7 每周日的每小时的第三分钟
1312 * * * 每天的12点13分钟
1312 6 7 *每年的7月6号12点13分
,:离散时间点:
10,4002 * * 2,5 每周二或是周五的02点10或者是40分
-:连续时间点:
1002 * * 1-5 周一到周五的02点10或者是40分
/#:对应取值范围内每多久一次
*/3* * * * 每3分钟一次任务
每两小时执行一次:
08*/2 * * *
每两天执行一次:
1004 */2 * *
执行结果将以邮件形式发送给管理员:
*/3* * * * /bin/cat /etc/fstab &> /dev/null
cron的环境变量:cron执行所有命令都去PATH环境变量指定的路径下去找
PATH /bin:/sbin:/usr/bin:/usr/sbin
用户任务的管理:
crontab
-l:列出当前用户的所有cron任务
-e:编辑
-r:移除所有任务
-uUSERNAME: 管理其用户的cron任务
anacron:(/etc/anacrontab)
1天没执行了 开机以后65分钟执行
service cron status
chkconfig –list crond
cross compile:交叉编译
x86, 32bit,
ARM
shutdown
halt
reboot
poweroff
init 0
init 6
RHEL6:
upstart --> init
/etc/inittab
/etc/init/*.conf
/etc/rc.d/init.d/functions脚本,可用于控制服务脚本的信息显示:
SCREEN=`stty -F /dev/console size2>/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"
forI 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"
forI in `seq 1 $RT_SPA`;do
echo -n " "
done
echo -e "[ ${RED}FAILED${NORMAL} ]"
}
/etc/rc.d/init.d/tserver脚本,测试SysV服务的定义格式:
#!/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 $lockfile
[$? -eq 0 ] && success "Stopping $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
/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/agetty -n -l /bin/bash38400 tty1
2:2345:respawn:/sbin/agetty -n -l /bin/bash38400 tty2
/etc/fstab文件示例:
/dev/hda2 / ext3 defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/etc/rc.d/rc.sysinit脚本示例:
#!/bin/bash
#
echo -e "\tWelcome to\033[34mMageEdu\033[0m Linux"
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
echo "Initializing networkdevice..."
/sbin/insmod /lib/modules/mii.ko
/sbin/insmod /lib/modules/pcnet32.ko
/etc/rc.d/rc脚本示例:
#!/bin/bash
#
RUNLEVEL=$1
for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do
$Istop
done
for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do
$Istart
done
1、关机和重启;
2、终端
3、主机名
4、IP地址(模块的装载和服务的实现)
5、functions
6、终端提示信息
/etc/issue文件的内容
7、rc.sysinit:挂载/etc/fstab中定义的其它文件系统;
8、设定内核参数
/etc/sysctl.conf
sysctl -p
9、用户
PAM: Pluggable Authentication Module
/etc/pam.d/*
绕过PAM,
/bin/login:
用户:UID
组: GID
login: 验正
nsswitch: Network Service Switch
框架:/etc/passwd, /etc/shadow, /etc/group
库:libnss_file.so,libnss_nis.so, libnsss_ldap.so
配置文件:/etc/nsswitch.conf
/etc/passwd,/etc/shadow
NIS,LDAP, MySQL
/etc/mypasswd
/etc/passwd
/etc/group
名称解析是如何工作的?
10、单用户模式
内核编译:
busybox:
Kernel+ROOTFS()
kernel+initrd(ramdisk)
kernel+
busybox-->initrd
kernel+initrd(busybox)-->rootfs(busybox)
kenrel
RHEL5.8 + busybox(initrd) + rootfs(busybox)
查看本机硬件设备信息:
1、cat /proc/cpuinfo
2、lsusb
3、lspci
4、hal-device
HardwareAbstract Layer
编译内核:
1、配置
make menuconfig
make gconfig
make kconfig
make oldconfig
make config
保存为.config
2、
make
make modules_install
make install
模块安装位置:/lib/modules/KERNEL_VERSION/
如何实现部分编译:
1、只编译某子目录下的相关代码:
make dir/
make arch/
make drivers/net/
2、只编译部分模块
make M=drivers/net/
3、只编译某一模块
make drivers/net/pcnet32.ko
4、将编译完成的结果放置于别的目录中
make O=/tmp/kernel
5、交叉编译
make ARCH=
如何编译busybox:
IDE:
/dev/hda1: ext3 /boot
/dev/hda2: ext3 /
内核初始化:
硬件探测
装载驱动
挂载根文件系统(rootfs)
启动用户空间中的第一个进程init
http://youbest.cublog.cn
文件系统
进程管理
内存管理
网络管理
安全功能
驱动程序
Linux内核及编译
Linux系统安装和kickstart
故障排除
Kernel + initrd(busybox制作,提供ext3文件系统模块) + ROOTFS(busybox制作)
make arch/
arch/x86/boot/bzImage
硬件驱动:initrd
initrd:仅需要提供内核访问真正的根文件系统所在设备需要的驱动
存储设备和文件系统相关的模块
系统初始化rc.sysinit:初始其它硬件的驱动程序;
ROOTFS:busybox, init不支持运行级别
/etc/inittab:格式也不尽相同
ash,hush
bash
内核编译:
makeSUBDIR=arch/
makearch/x86/
/boot/vmlinuz (ext3, IDE)
/mnt/boot: /dev/hda1
/mnt/sysroot: /dev/hda2
1、安装grub
2、提供内核
3、提供initrd
4、创建根文件系统
Linux上的日志系统
syslog
syslog-ng: 开源
日志系统:syslog()
A:
B:
D:
syslog服务:
syslogd:系统,非内核产生的信息
klogd:内核,专门负责记录内核产生的日志信息
kernel --> 物理终端(/dev/console)--> /var/log/dmesg
# dmesg命令查看上面的文件
# cat /var/log/dmesg
日志需要滚动(日志切割):(滚动logrotate /etc/ logrotate.conf配置文件/etc/ logrotate.d)
messages messages.1 messages.2 messages.3
/sbin/init
/var/log/messages:系统标准错误日志信息;非内核产生引导信息;各子系统产生的信息;
/var/log/maillog:邮件系统产生的日志信息;
/var/log/secure:登录系统日志
syslog: 服务(service syslogstatus)
syslogd进程
klogd进程
配置文件:/etc/syslog.conf
/etc/logrotate.d/
信息详细程序:日志级别
子系统:facility, 设施
动作:
syslog: syslogd和klogd
配置文件定义格式为: facility.priority action
facility,可以理解为日志的来源或设备目前常用的facility有以下几种:
auth # 认证相关的
authpriv # 权限,授权相关的
cron # 任务计划相关的
daemon # 守护进程相关的
kern # 内核相关的
lpr # 打印相关的
mail # 邮件相关的
mark # 标记相关的
news # 新闻相关的
security # 安全相关的,与auth 类似
syslog # syslog自己的
user # 用户相关的
uucp # unix tounix cp 相关的
local0 到 local7 # 用户自定义使用
* # *表示所有的facility
priority(log level)日志的级别,一般有以下几种级别(从低到高)
debug # 程序或系统的调试信息
info # 一般信息
notice # 不影响正常功能,需要注意的消息
warning/warn # 可能影响系统功能,需要提醒用户的重要事件
err/error # 错误信息
crit # 比较严重的
alert # 必须马上处理的
emerg/panic # 会导致系统不可用的
* # 表示所有的日志级别
none # 跟* 相反,表示啥也没有
action(动作)日志记录的位置
系统上的绝对路径 # 普通文件 如: /var/log/xxx
| # 管道 通过管道送给其他的命令处理
终端 # 终端 如:/dev/console
@HOST # 远程主机 如: @10.0.0.1
用户 # 系统用户 如: root
* # 登录到系统上的所有用户,一般emerg级别的日志是这样定义的
定义格式例子:
mail.info /var/log/mail.log # 表示将mail相关的,级别为info及
# info以上级别的信息记录到/var/log/mail.log文件中
auth.=info @10.0.0.1 # 表示将auth相关的,基本为info的信息记录到10.0.0.1主机上去
# 前提是10.0.0.1要能接收其他主机发来的日志信息
user.!=error # 表示记录user相关的,不包括error级别的信息
user.!error # 与user.error相反
*.info # 表示记录所有的日志信息的info级别
mail.* # 表示记录mail相关的所有级别的信息
*.* # 你懂的.
cron.info;mail.info # 多个日志来源可以用";"隔开
cron,mail.info # 与cron.info;mail.info 是一个意思
mail.*;mail.!=info # 表示记录mail相关的所有级别的信息,但是不包括info级别的
加横线表示异步写入
service syslog reload
telnet: 远程登录协议, 23/tcp
C/S
S:telnet服务器
C:telnet客户端
ssh: Secure SHell, 应用层协议,22/tcp
通信过程及认证过程是加密的,主机认证
用户认证过程加密
数据传输过程加密
ssh v1, v2
man-in-middle
sshv2
认证过程:
基于口令认证
基于密钥认证:
shh是协议:规范
实现:服务器端、客户端
Linux: openSSH
C/S
服务器端:sshd, 配置文件/etc/ssh/sshd_config
客户端:ssh, 配置文件/etc/ssh/ssh_config
ssh-keygen:密钥生成器
ssh-copy-id:将公钥传输至远程服务器
scp:跨主机安全复制工具
ssh 172.16.200.1 yes 密钥存放在家目录下的known_ hosts
ssh:32:04
sshUSERNAME@HOST
ssh-l USERNAME HOST
sshUSERNAME@HOST 'COMMAND'不登陆执行命令
scp:
scpSRC DEST
-r
-a
scpUSERNAME@HOST:/path/to/somefile /path/to/local
scp/path/to/local USERNAME@HOST:/path/to/somewhere
ssh-keygen
-trsa
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
-f/path/to/KEY_FILE
-P'': 指定加密私钥的密码
公钥追加保存到远程主机某用户的家目录下的.ssh/authorized_keys文件或.ssh/authorized_keys2文件中
ssh-copy-id
-i ~/.ssh/id_rsa.pub
ssh-copy-id-i ~/.ssh/id_rsa.pub USERNAME@HOST
dropbear: 嵌入式系统专用的ssh服务器端和客户端工具
服务器端:dropbear
dropbearkey
客户端:dbclient
dropbear默认使用nsswitch实现名称解析
/etc/nsswitch.conf
/lib/libnss_files*
/usr/lib/libnss3.so
/usr/lib/libnss_files*
dropbear会在用户登录检查其默认shell是否当前系统的安全shell
/etc/shells
主机密钥默认位置:
/etc/dropbear/
RSA:dropbear_rsa_host_key
长度可变, 只要是8的整数倍,默认为1024
DSS:dropbear_dss_host_key
长度固定,默认为1024
dropbearkey
-trsa|dsa
-f/path/to/KEY_FILE
-sSIZE
博客作业:
日志系统
cron任务计划
shell知识点总结及例子
RHEL5.8系统裁减:具有用户登录等功能
微型系统制作:具有IP地址、有虚拟终端、有主机名、能ssh远程登录;
挂载好hda1 hda2 /mnt/root sysroot
cp /boot/vmlinuz-2.6.18-308.e15/mnt/boot/vmlinuz 复制内核
mkdir test
cd test
zcat /boot/initrd -2.6.18-308.e15.img |cpio –id
vim init
mkrootdev –t ext3 –o defaults,ro/dev/hda2
注释dm模块
.,+20s@^@#g
注释echo Scanning logical volumes
一直到交换分区
Resume LABEL=SWAP-sda3
wq
cd lib/
rm –f df-*
cd ..
find .| cpio –H newc –quiet –o | gzip -9> /mnt/boot/initrd.gz (-o表示创建文件–H 表示保持当前目录结构newc表示新规范)
ls –lh /mnt/boot/
initrd.gz 只有3.3M
grub-install –root-directory=/mnt /dev/had
ls /mnt/boot/
看到gurb
vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title pengpeng(2.6.18)
root(hd0,0)
kernel/vmlinuz
initrd/initrd.gz
wq
cd /mnt/sysroot
mkdir etc{rc.d/init.d} bin sbin proc sysdev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmphome opt boot –pv
vim /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit/
wq
vim /etc/rc.d/rc.sysinit
#!/bin/bash
#
Echo –e “\t Welcome to\033[34mpengpeng\033[0m linux”
/bin/bash
Wq
chmod +x /etc/rc.d/rc.sysinit
复制命令的脚本
#!/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 “wrongcommand” && read –p “INPUT againe” CMD && continue
bincp $COMMAND
echo “copy $COMMAND finished”
read –p “continue:” CMD
done
./bincp.sh
Init
bash
ls
sync
chroot /mnt/sysroot
尝试启动系统
./bincp.sh
mkdir
cat
touch
rm
mv
cp
mount
umount
vi
vim
chmod
chown
ping
ifconfig
insmod
modprobe
rmmod
route
halt
reboot
shutdown
hostname
q
touch /tmp/a.txt
mount –o remount,rw /重新挂载跟
Mtab追踪当前文件系统mount挂载保存在这个文件 会发生错误
mount –n 不更新mtab文件
cat /proc/mounts
mount –n –o,rw /
touch /tmp/a.txt
1777 1表示stick
Halt 关机 只切换到0 关闭当前子进程 不能切断电源
exec halt –p (-p切断电源 exec用当前进程结束父进程)
cd /mnt/sysroot
vim /etc/rc.d/rc.sysdone
#!/bin/bash
#
sync
sleep 2
sysc
exec /sbin/halt –p
wq
chmod +x etc/rc.d/rc.sysdone
./bincp.sh
sync
sleep
sync
cd /mnt/sysroot/ect/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc.sysdone
sync
sync
再次启动小系统
Init 0
然后就关机了
cd /mnt/sysroot/etc/inittab
加
l6:wait:/etc/rc.d/rc.reboot
vim /mnt/sysroot /etc/ rc.d/rc.reboot
#!/bin/bash
sync
sleep 1
sync
exec /sbin/reboot
sync
sync
chmod +x /mnt/sysroot /etc/ rc.d/rc.reboot
再次启动小系统
(忘记改权限在小系统中改)
mount –n –o remount,rw /
chmod +x /etc/rc.d/rc.reboot
sync
sync
Init 6
vim /etc/rc,d/init.d/halt
#!/bin/bash
#
case $0 in
*reboot)
COMMAD=’/sbin/halt -p’;;
*halt)
COMMAD=’/sbin/reboot’;;
*)
echo “Only call this script by *reboot OR *halt”
;;
esac
case $1 in
start)
;;
stop)
;;
*)
echo “usage:” ` basename &0` {start|stop}”
;;
Esac
exec $COMMAND
chmod +x /etc/rc.d/init.d/halt
cd etc/rc.d
mkdir rc0.d rc6.d
cd rc0.d
ln –sv ../init.d/halt S99halt
ll
cd ..
cd rc6.d
ln –sv ../init.d/halt S99reboot
./S99reboot
rm –f rc.reboot rc.sysdone
ls
sync
sync
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
chmod +x rc
vim 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
sync
sync
cd /mnt/sysroot
vim etc/inittab
l3:3:wait:/etc/rc.d/rc 3
cd etc/rc.d
mkdir rc3.d
vim init.d/tserver
#!/bin/bash
#
#chkconfig:35 66 33
#description:test service script
prog=`basename $0`
lockfile=/var/locksubsys/&prog
start() {
echo “starting $prog..”
touch &lockfile
}
stop () {
echo “Stop &prog”
rm –f $lockfile
}
Status()
{
If [ -f $lockfile ]; then
echo “RUNNING”
else
echo “Stop..”
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
wq
chmod +x init.d/tserver
init.d/tserver start
ls /var/lock/subsys/
init.d/tserver status
init.d/tserver statuss
cd rc3.d
ln –sv ../init.d/server S66tserver
ll
cd ..
cd rc0.d/
ln –sv ../init.d/tserver K33tservet
sync
vim inittab
1:2345:respawn:/sbin/mingetty –loginiprog=/bin/bashtty1
2:2345:respawn:/sbin/mingetty –loginiprog=/bin/bashtty2
wq
vim rc.d/rc.sysinit
删去/bin/bash
./bincp.sh
migetty basename
cd /mnt/sysroot/bin/
ln –sv bash sh
sync
sync
重启小系统
cd /mnt/sysroot/
vim /etc/fstab
/dev/hda2 / ext3 defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
vim etc/sysinit
加一行
echo “Remount rootfs..”
mount –n –o remount,rw /
echo “set hostname”
[ -f /etc/sysconfig/network ] && ./ect/sysconfig/network
[ -z $HOSTNAME –o “$HOSTNAME”==’(none)’ ]$$ HOSTNAME=localhost
/bin/hostname $HOSTNAME
wq
hostname
mkdir etc/sysconfig
vim /etc/sysconfig/network
HOSTNAME=pengpeng.com
chroot /mnt/sysroot
/etc/rc.d/rc.sysinit
exit
man mingetty
man agetty
man mgetty
man s
tty
sty –F /dev/console speed
./bincp.sh
agetty
cd /mnt/sysroot
ls
vim etc/inittab
改
1:2345;respawn:/sbin/agetty -n –l /bin/bash38400(速率) tty1
2:2345;respawn:/sbin/agetty –n –l /bin/bash38400(速率) tty2
又重启
在另一台机器上修复文件系统
cd /mnt/sysroot
ls
find . | cpio –H newc –quiet –o | gzip >/root/sysroot.gz
umount /dev/hda2 发现卸载不掉
fuser –km /dev/hda2
umount /dev/hda2
mke2fs –j /dev/hda2
mount /dev/hda2 /mnt/sysroot/
cd /mnt/sysroot/
zcat /root/sysroot.gz | cpio –id
ls
cat etc/inittab
sync
sync
sleep
cat /etc/rc.d/init.d/functions 这是红帽的脚本
cd /mnt/sysroot
vim etc/rc.d/init.d/functions
#!/bin/bash
#为了执行加上的binbash本身作为函数不需要执行
echo –e “[ \033[1;32mO K\033[0m ] ”
试下
chmod +x etc/rc/d/init.d/functions
A=”Starting tserver ”
echo $[#A] 看A有多少字符
屏幕长度stty –F /dev/console size 25 80 25行80列
stty –F /dev/console size 25 80| cut –d ‘ ’–f2
stty –F /dev/console size 25 80 | awk ‘{print $2}’
A=` stty –F /dev/console size 25 80`
echo ${A#* }以空格作为分隔符从左向右去掉第一个空格向左的内容
echo ${A##* }以空格作为分隔符从左向右去掉最后一个空格向左的内容
echo ${A% *}以空格作为分隔符从右向左去掉第一个空格向右的内容
echo ${A%% *}以空格作为分隔符从右向左去掉最后一个空格向右的内容
vim etc/rc.d/init.d/funtions
#!/bin/bash
#
SCREEN=`sty –F /dev/console size`
COLUMNS=${ SCREEN#* }
SPA_CLO=$[$COLUMNS-&14]
RED =’\033[31m’
GREEN=’\033[32m’
YELLOW=’033[33m
NORMAL=’033[0m’
success()
{
string=$1
RT_SPA=$[$SPA_CLO-${#string}]
echo –n “$string”
for I in `seq 1 $ RT_SPA`;do
echo –n “ ”
done
echo –e “[ ${CREEN}OK${NORMAL} ]”
}
failure ()
{
string=$1
RT_SPA=$[$SPA_CLO-${#string}]
echo –n “$string”
for I in `seq 1 $ RT_SPA`;do
echo –n “ ”
done
echo –e “[ ${RED }FAILED ${NORMAL} ]”
}
#success "starting tserver”
#success "starting tserverpengpeng ”
#failure "starting tserver”
尝试执行脚本
vim init.d/tserver
#!/bin/bash
#
./etc/rc.d/init.d/functions 加
#chkconfig:35 66 33
#description:test service script
prog=`basename $0` 改成tserver
lockfile=/var/locksubsys/&prog
start() {
#echo “starting $prog..”
touch &lockfile
[ $? –eq 0 ] &&success “starting$proc” || failure “String $prog ”
}
stop () {
#echo “Stop &prog”
rm –f $lockfile
[ $? –eq 0 ] &&success “stopping$proc” || failure “String $prog
}
Status()
{
If [ -f $lockfile ]; then
echo “RUNNING”
else
echo “Stop..”
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
chroot /mnt/sysroot/
发现要移植seq
/root/bincp.sh
seq stty
q
chroot /mnt/sysroot/
找不到/dev/console 文件
vim etc/rc.d/init.d/funtions
#!/bin/bash
#
SCREEN=`sty –F /dev/console size 2>/dev/null`改
COLUMNS=${ SCREEN#* }
[ -z $ COLUMNS ]&& COLUMNS=80 加
SPA_CLO=$[$COLUMNS-&14]
RED =’\033[31m’
GREEN=’\033[32m’
YELLOW=’033[33m
NORMAL=’033[0m’
success()
{
string=$1
RT_SPA=$[$SPA_CLO-${#string}]
echo –n “$string”
for I in `seq 1 $ RT_SPA`;do
echo –n “ ”
done
echo –e “[ ${CREEN}OK${NORMAL} ]”
}
failure ()
{
string=$1
RT_SPA=$[$SPA_CLO-${#string}]
echo –n “$string”
for I in `seq 1 $ RT_SPA`;do
echo –n “ ”
done
echo –e “[ ${RED }FAILED ${NORMAL} ]”
}
#success "starting tserver”
#success "starting tserverpengpeng ”
#failure "starting tserver”
chroot /mnt/sysroot/
/etc/rc.d/init.d/tserver start
/etc/rc.d/init.d/tserver stop
cd /mnt/sysroot/
mkdir lib/modules
modinfo pcnet32
cp filename(….) /mnt/sysroot/lib/modules
modinfo mii(因为有依赖关系)
cp filename(….) /mnt/sysroot/lib/modules
vim etc/rc.d/tc.sysinit
加一行
echo “Inittailizing network device”
/sbin/insmod /lib/modules/mii.ko
/sbin/insmod /lib/modules/pcnet32.ko
wq
vim etc/rc.d/init.d/network
mkdir –pv etc/sysconfig/network-scripts
vimetc/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
wq
vim etc/rc.d/init.d/network
#!/bin/bash
#
CONF=/etc/sysconfig/network-scripts/ifcfg-eth0
prog=network
. $ CONF
NETMASK=16
usage()
{
echo “$prog: {start|stop|restart|status}”
}
start()
{
Ifconfig eth0 $IPADDR/$NETMASK
[ -z GATEWAY ] && route add defaultgw $GATEWAY
}
stop()
{
Ifconfig eth0 down
}
status()
{
Ifconfig eth0
}
case $1 in
start)
start
success “Config network eth0”
;;
stop)
stop
success “stop network card eth0”
;;
restart)
stop
start
success “Restart network eth0”
;;
status)
status
;;
*)
usage
;;
chmod +x etc/rc.d/init.d/network
cd etc/rc.d/rc0.d/
ln –sv ../init.d/network K90network
cd ../rc3.d
ln –sv ../init.rd/network K90network
cd ../rc6.d/
cd ../rc3.d/
ln –sv ../init.d/network S90network
cd ..
vim init.d/network
加两行
# ckconfig:35 09 90
# description: network service
wq
chroot /mnt/sysroot/
/etc/rc.d/init.d/network start
出错
etc/rc.d/init.d/network
加
NETMASK=16
下午
/etc/issue
登录显示的信息
man mingetty
\r uname -r
\m uname –m
man agetty
cp /etc/issue /mnt/sysroot/etc/
vim /mnt/sysroot/etc/issue
PENGPENG linux
Kernel \r on an \m
wq
挂载文件系统/etc/fstab
/proc/mounts 表示挂载的设备
awk ‘{print $1}’ /proc/mounts | grep“/dev/hda2”找到就被挂载了
编写脚本挂载文件系统
awk ‘{print $1 }’ /etc/fstab 取可能要挂载的设备(有的已经挂载,有的还需要挂载,交换分区的话,需要用激活的方式)
去掉第二段为swap
grep –v –E “\<swap|proc|sysfs\>” /etc/fstab | awk ‘{print $1}’|while readLINE;do awk ’{print $1}’ /proc/mounts | grep “^$LINE”;done
cd /mnt/sysroot/
vim etc/rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to\033[34mMageEdu\033[0m Linux"
echo "Remount rootfs..."
mount -n -o remount,rw /
[ $? –eq 0 ] &&success “Remountrootfs”|| failure “Remount rootfs”
mount –a
echo "Set the hostname..."
[ -f /etc/sysconfig/network ] && ./etc/sysconfig/network
[ -z $HOSTNAME -o "$HOSTNAME" =='(none)' ] && HOSTNAME=localhost
/bin/hostname $HOSTNAME
echo "Initializing networkdevice..."
/sbin/insmod /lib/modules/mii.ko
/sbin/insmod /lib/modules/pcnet32.ko
/etc/rc.d/rc脚本示例:
#!/bin/bash
#
RUNLEVEL=$1
for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do
$Istop
done
for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do
$Istart
done
bincp.sh
sysctl
q
vim etc/sysctl.conf
net.ipv4.ip_forward=1
参照/etc/sysctl.conf
vimetc/rc.d/rc.sysinit
加
sysctl –p &>/dev/null
[ $? –eq 0 ] && success “Set kernelparameter”|| failure “Set kernel parameter”
sync
sync
重启系统
vim /mnt/sysroot/grub/grub.conf
default=0
timeout=3
title pengpeng(2.6.18)
root(hd0,0)
kernel/vmlinuz ro root=/dev/hda2 quiet
initrd/initrd.gz
cd test
cd test
vim init
只留了这几行
echo “Loading jbd.ko.module”
insmod /lib/jbd.ko
echo “Loading ext3.ko module”
insmod /lib/ ext3.ko
ls /lib
ext3.ko fireware jbd.ko
ll –h /mnt/boot/
1.8M initrd
重启系统
下一步支持用户帐号
下载一个不需要PAM的login
cat /etc/nsswitch.conf
cp –d /lib/libnss_file* /mnt/sysroot/lib/
ls /mnt/sysroot/lib –l
cp –d /usr/lib/libnss_files.so/mnt/sysroot/usr/lib/
cp –d /usr/lib/libnss3.so/usr/lib/libnssckbi.so /usr/lib/libnssutil3.so /mnt/sysroot/usr/lib/
sync
cp /etc/nsswitch.conf /mnt/sysroot/etc/
vim /mnt/sysroot/etc/
只保留这四行
passwd:files
shadow:files
group:files
hosts:files dns
useradd hadoop
passwd hadoop
grep –E “^(root|hadoop)\>” /etc/passwd> /mnt/syroot/etc/passwd
grep –E “^(root|hadoop)\>” /etc/shadow> /mnt/syroot/etc/shadow
grep –E “^(root|hadoop)\>” /etc/group> /mnt/syroot/etc/ group
sync
./bincp.sh
mingetty
passwd
useradd
userdel
usermod
groupadd
cd /mnt/sysroot/
vim /etc/inittab
改
mingetty tty1
mingetty tty2
wq
cd
login
重启后到小系统后
cd /root/
vim .bash_profile
PS1=`[\u@\h \w]\$`
export PS1 \u用户名\h主机名 \W工作目录的基名\w 全名
加单用户模式
改小系统root目录权限
Chmod –R og=--- root/
vim etc/inittab
定义一级别
L1:1:wait:/etc/rc.d/rc 1
ls etc/rc.d/init.d/
cd etc/
mkdir rc1.d
cd rc1.d/
ln –sv ../init.d/tserver K33tserver
ln –sv ../init.d/network K90network
ll
cd ..
ls
cd ..
vim rc.d/init.d/single
#!/bin/bash
#
# chkconfig:
# description:
#
case $1 in
start)
;;
*)
echo “usage :single start”
;;
esac
exec /sbin/init S
chmod +x rc.d/init.d/single
cd rc.d/rc1.d/
ln –sv ../init.d/single S98single
ll
sync
sync
备份后重启
下载busybox解压
tar xf busybox-1.20.2.tar.bz1
cd busybox-1.20.2
make menuconfig
选择
busybox setting buildoptions
build busybox as a static binary
installation options (“make installbehavior”)
make install
编译可能会出错
需要新版的内核支持
下载新版的内核
解压内核然后复内核文件下include mtd 下的ubi-user.h
cd /root/busybox-1.20.2
cd include
mkdir mtd
cp /usr/src/linux_____ /include/mtd/ubi-user.hmtd/
cd ..
make install
编译到当前目录_install
cp _install /tmp/busybox –a
cd /tmp/busybox
rm linuxrc
mkdir proc sys etc dev sysroot lib/modules–pv
modinfo ext3
modinfo jbd
cp filename--- lib/modules/
cp filename --- lib/modules/
pwd
vim init
#!/bin/sh
#
mount -t proc proc /proc
mount -t sysfs sysfs /sys
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
mdev -s
mount -t ext3 /dev/hda2 /mnt/sysroot
exec switch_root /mnt/sysroot /sbin/ini
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
wq
chmod +x init
在busybox建立目录
mkdir mnt/sysroot –pv
rm –rf sys
mknod dev/console c 51
mknod dev/null c 1 3
tree dev/
mkdir tmp
find .| cpio –H newc –quiet –o | gzip -9> /mnt/boot/initrd.gz
cp /boot/vmlinuz-2.6.18-308.e15/mnt/boot/vmlinuz
grub-install –root-directory=/mnt /dev/had
ls /mnt/boot
看到grub
vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title PENGPeng
root(hd0,0)
kernel/vmlinuz ro root=/dev/hda2
initrd/initrd.gz
cd busybox-1.20.2
cp _install/* /mnt/sysroot –a
cd /mnt/sysroot
rm linuxrc
mkdir proc sys dev tmp var/{log,lock,run}lib/modules etc/rc.d/init.d root boot mnt media –pv
ls sbin/
vim etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
vim etc/fstab
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
/dev/hda2 / ext3 defaults 1 1
mknod dev/console c 5 1
mkmod dev/null c 1 3
vim etc/rc.d/rc.sysinit
#!/bin/sh
echo -e "\tWelcome to \033[31mMageEdu\033[0m Linux"
echo -e "Remounting the rootfilesystem ..."
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /
echo -e "Creating the files of device..."
mdev -s
echo -e "Mounting the filesystem..."
mount -a
swapon –a
chmod +x etc/rc.d/rc.sysinit
sync
在busybox添加sys目录