Linux信号捕捉、任务计划、系统裁剪、日志系统syslog、系统裁剪之为系统添加ssh服务
cross compile:交叉编译
x86, 32bit,
ARM
交叉编译:
如何实现部分编译:
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=
脚本编程知识点:
1、变量中字符的长度:${#VARNAME}
2、变量赋值等:
${parameter:-word}:如果parameter为空或未定义,则变量展开为"word";否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为"word"值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为"word",并将展开后的值赋值给parameter;
${parameter:?word}:如果parameter为空或未定义,则显示为错误,错误信息是后面给的"word"值;
截取子片:做字符串切片;
${parameter:offset}:取字符串,从offset处的后一个字符开始,取剩余所有子串;
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
3、脚本配置文件
/etc/rc.d/init.d/服务脚本
服务脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件
4、局部变量
local VAR_NAME=:它只在局部范围内有效,只要变量加上local关键字,它就只在局部范围内有效;
a=1
test() {
a=$[3+4]
}
test
for I in `seq $a 10`; do
echo $I
done
5、命令mktemp
创建临时文件或目录
mktemp /tmp/file.XX:为了创建的临时文件和别人创建的名称不会相同,使用file.XX,XX代表随机字符,XX可以有多个;
-d: 创建为目录
这种临时文件放到/tmp目录下,就算没有删这个文件,它们也会定期被清理的,/tmp目录一般来讲每隔30天会做一次清理,30天再也没有被访问过的都会被清理掉;
6、信号:进程间通信的一种方式,一个进程向另一个进程发送短小的信息,能够实现控制另外进程的运作机制;
kill -SIGNAL PID:-SIGNAL信号,PID进程号;
1: HUP:让一个进程不用重启,就可以重读其配置文件,并让新的配置信息生效;
2: INT:Ctrl+C,中断一个进程;
9: KILL:杀死一个进程,强制杀死;
15: TERM:终止一个进程,默认信号;
脚本中,能实现信号捕捉,但9和15无法捕捉
Ctrl+c: SIGINT 中断一个进程;
trap命令:bash内件命令,可以实现信号捕捉;
trap \'COMMAND\' 信号列表
7、一行执行多个语句,语句间用分号分隔(使用tarp实现捕捉信号,多个信号列表使用分号隔开)
[root@Smoke ~]# read -p "Your file:" FILE Your file:
提示:写一个脚本,使用read期望用户提供一个值,如果用户没有给,没有输入任何信息,直接敲回车了,这时变量从键盘读取用户输入的数据就为空;
[root@Smoke ~]# echo $FILE(显示FILE变量中的值) [root@Smoke ~]# stty -F /dev/console size(查看tty终端窗口大小) 25 80 [root@Smoke ~]# A=3(声明变量A,并赋值为3) [root@Smoke ~]# echo ${A:-30}(如果A变量不空,那就使用A自身的值,否则就使用30) 3 [root@Smoke ~]# unset A(撤销变量A中的赋值) [root@Smoke ~]# echo ${A:-30}(如果A变量不空,那就使用A自身的值,否则就使用30) 30 [root@Smoke ~]# echo $A(显示变量A的值) 提示:变量A的值为空,所以它不会改变变量A自身的值,但是却把整个表达式展开为后面给的字符串; [root@Smoke ~]# A=${A:-30}(如果A不空,把A的值赋予A变量,A等于自身,如果A的值为空,就把30赋值给A变量) [root@Smoke ~]# echo $A(显示变量A的值) 30 [root@Smoke ~]# unset A(撤销变量A的值) [root@Smoke ~]# echo ${A:-30}(如果A变量不空,就使用A自身的值,否则使用30) 30 [root@Smoke ~]# echo ${A:+30}(如果A变量为空,不做任何操作,如果不空就使用30) [root@Smoke ~]# echo ${A:=30}(如果A变量不空,那就使用A自身的值,否则就使用30,并且把30赋值给A) 30 [root@Smoke ~]# echo $A(显示A变量的值) 30 [root@Smoke ~]# ${B:=30}(如果B变量不空,那就使用B自身的值,否则就使用30,并且把30赋值给B) -bash: 30: command not found 提示:不能直接执行; [root@Smoke ~]# B=${B:-30}(如果B变量不空,就使用B自身的值,否则使用30) [root@Smoke ~]# A=\'hello world\'(定义变量A,并赋值为hello world) 如果期望取出来hello world,从第三个开始往后取三个字符; [root@Smoke ~]# echo ${A:2:3}(取出A变量的值hello world,从第3个字符开始往后取3个字符) llo [root@Smoke ~]# echo ${A:2}(取出A变量的值hello world,从第3各字符开始往后取剩余所有字符) llo world 让脚本使用配置文件: [root@Smoke ~]# vim a.sh(编辑a.sh脚本) #!/bin/bash # [ -n "$TEST" ] && echo $TEST(如果变量TEST的值不空,就显示出来) [root@Smoke ~]# chmod +x a.sh(给a.sh脚本执行权限) [root@Smoke ~]# ./a.sh(当前目录执行a.sh脚本) [root@Smoke ~]# vim a.conf(编辑a.conf配置文件) TEST=\'hello world\' [root@Smoke ~]# ./a.sh(当前目录执行a.sh脚本) 让脚本获取配置文件: [root@Smoke ~]# vim a.sh(编辑a.sh脚本) #!/bin/bash # . /root/a.conf(读取a.conf文件内容到当前脚本) [ -n "$TEST" ] && echo $TEST(如果变量TEST的值不空,就显示出来) [root@Smoke ~]# ./a.sh(当前目录执行a.sh脚本) hello world [root@Smoke ~]# vim a.sh(编辑a.sh脚本) #!/bin/bash # . /root/a.conf(读取a.conf文件内容到当前脚本) TEST={$TEST:-info}(如果变量TEST没有值,就使用info字符串) [ -n "$TEST" ] && echo $TEST [root@Smoke ~]# ./a.sh(当前目录执行a.sh脚本) hello world [root@Smoke ~]# vim a.conf(编辑a.conf文件) TEST= 提示:TEST变量没有赋值; [root@Smoke ~]# ./a.sh(当前目录执行a.sh脚本) info [root@Smoke ~]# vim a.conf(编辑a.conf文件) TEST=\'haha\' [root@Smoke ~]# ./a.sh(当前目录执行a.sh脚本) haha [root@Smoke ~]# vim b.sh(编辑b.sh脚本) #!/bin/bash # a=1 test() { a=$[3+4] } test for I in `seq $a 10`; do echo $I done [root@Smoke ~]# chmod +x b.sh(给b.sh脚本执行权限) [root@Smoke ~]# ./b.sh(当前目录执行b.sh脚本) 7 8 9 10 提示:test中a变量只和test函数有关系,但是它影响到整个程序,这就是变量的作用域,我们在函数中的变量,它也影响到了全局使用,变量类型有本地变量、环境变量、位 置变量和特殊变量,还有一个叫做局部变量,它只在局部范围内有效,只要变量加上local关键字,它就只在局部范围内有效; [root@Smoke ~]# vim b.sh(编辑b.sh脚本) #!/bin/bash # a=1 test() { local a=$[3+4] (关键字local代表局部变量,只在函数内有效) } test for I in `seq $a 10`; do echo $I done [root@Smoke ~]# ./b.sh(当前目录执行b.sh脚本) 1 2 3 4 5 6 7 8 9 10 [root@Smoke ~]# mktemp /tmp/file.XX(创建临时文件file.XX,X代表随机字符) /tmp/file.83 [root@Smoke ~]# mktemp /tmp/file.XX(创建临时文件file.XX,X代表随机字符) /tmp/file.84 [root@Smoke ~]# mktemp /tmp/file.XXXXXX(创建临时文件file.XXXXXX,X代表随机字符) /tmp/file.f13103 [root@Smoke ~]# FILE=`mktemp /tmp/file.XXXXXX`(命令引用将mktep /tmp/file.XXXXXX命令执行结果保存到FILE变量) [root@Smoke ~]# echo $FILE(显示FILE变量的内容) /tmp/file.j13107 [root@Smoke ~]# echo $FILE(显示FILE变量的内容) /tmp/file.j13107 [root@Smoke ~]# mktemp -d /tmp/file.XXXXXX(创建临时目录file.XXXXXX,X代表随机字符) /tmp/file.z13141 [root@Smoke ~]# ll /tmp/(查看/tmp目录文件及子目录详细信息) total 60 drwxr-xr-x 12 root root 4096 Dec 4 14:34 busybox -rw------- 1 root root 0 Dec 5 21:35 file.83 -rw------- 1 root root 0 Dec 5 21:35 file.84 -rw------- 1 root root 0 Dec 5 21:35 file.87 -rw------- 1 root root 0 Dec 5 21:37 file.f13103 -rw------- 1 root root 0 Dec 5 21:39 file.j13107 drwx------ 2 root root 4096 Dec 5 21:41 file.z13141 drwx------ 2 root root 4096 Dec 3 08:19 gconfd-root srwxr-xr-x 1 root root 0 Dec 3 08:14 mapping-root srwxrwxr-x 1 Smoke Smoke 0 Nov 22 01:40 mapping-Smoke srw------- 1 root root 0 Dec 3 08:14 scim-panel-socket:0-root srw------- 1 Smoke Smoke 0 Nov 22 01:40 scim-panel-socket:0-Smoke 写一个脚本,每隔两秒钟显示一次当前时间: [root@Smoke ~]# vim showdate.sh(编辑showdate.sh脚本) #!/bin/bash # while :;do(死循环,任何条件都循环) date sleep 2 done [root@Smoke ~]# chmod +x showdate.sh(给showdate.sh执行权限) [root@Smoke ~]# ./showdate.sh(当前目录执行showdate.sh脚本) Fri Dec 5 22:04:56 CST 2014 Fri Dec 5 22:04:58 CST 2014 Fri Dec 5 22:05:00 CST 2014 Fri Dec 5 22:05:02 CST 2014 Fri Dec 5 22:05:04 CST 2014 提示:脚本会一直执行,到天荒地老,可以使用CTRL+C中止; [root@Smoke ~]# vim showdate.sh(编辑showdate.sh脚本) #!/bin/bash # trap \'echo "You go..."\' INT (捕捉信号,CTRL+C,INT中止一个进程,如果有人发出INT信号,就显示You go...) while :;do date sleep 2 done [root@Smoke ~]# ./showdate.sh(当前目录执行showdate.sh脚本) Fri Dec 5 22:14:16 CST 2014 You go... Fri Dec 5 22:14:17 CST 2014 You go... Fri Dec 5 22:14:18 CST 2014 You go... Fri Dec 5 22:14:19 CST 2014 You go... [1]+ Stopped ./showdate.sh 提示:当执行CTRL+C,INT信号中止进程,信号被捕捉,无法中止,可以使用CTRL+Z把正在前台的作业送往后台,默认送Stop信号; [root@Smoke ~]# kill -l(查看信号列表) 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT(bg信号,后台执行) 19) SIGSTOP(CTRL+Z把正在前台的作业送往后台,默认送Stop信号) 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX [root@Smoke ~]# kill %1(终止某作业,需要带百分号,用于区分作业号还是进程号) [root@Smoke ~]# vim ping.sh(编辑ping.sh脚本) #!/bin/bash # NET=192.168.0 for I in {200..254};do if ping -c 1 -W 1 $NET.$I &> /dev/null;then echo "$NET.$I is up." else echo "$NET.$I is down." fi done [root@Smoke ~]# chmod +x ping.sh(给ping.sh脚本执行权限) [root@Smoke ~]# chmod +x ping.sh [root@Smoke ~]# ./ping.sh(当前目录执行ping.sh脚本) 192.168.0.200 is down. 192.168.0.201 is down. 192.168.0.202 is down. 192.168.0.203 is down. 192.168.0.204 is down. 192.168.0.205 is down. 192.168.0.206 is down. 192.168.0.207 is down. 提示:通过CTRL+C INT信号无法中止脚本,因为CTRL+C信号被ping命令捕捉到了,默认被ping命令接收,而没有被脚本bash接收,所以CTRL+C只不过当前ping命令不进 行而已,只是当前的ping命令就是处理CTRL+C信号的; 让脚本捕捉CTRL+C INT信号: [root@Smoke ~]# vim ping.sh(编辑ping.sh脚本) #!/bin/bash # NET=192.168.0 trap \'echo "quit."\' INT(捕捉INT信号,显示quit) for I in {200..254};do if ping -c 1 -W 1 $NET.$I &> /dev/null;then echo "$NET.$I is up." else echo "$NET.$I is down." fi done [root@Smoke ~]# ./ping.sh(当前目录执行ping.sh脚本) quit. 192.168.0.200 is down. quit. 192.168.0.201 is down. quit. 192.168.0.202 is down. 提示:虽然捕捉到了CTRL+C INT信号,但是没有退出,退出脚本exit; #!/bin/bash # NET=192.168.0 trap \'echo "quit.";exit 1\' INT(捕捉INT信号,并显示quit和退出脚本) for I in {200..254};do if ping -c 1 -W 1 $NET.$I &> /dev/null;then echo "$NET.$I is up." else echo "$NET.$I is down." fi done [root@Smoke ~]# ./ping.sh(当前目录执行ping.sh脚本) 192.168.0.200 is down. 192.168.0.201 is down. quit. 提示:捕捉CTRL+C INT信号,退出脚本,并显示quit; 我们捕捉信号中间执行的命令可能会很多,我们不能这么简单的停止,比如如果一个脚本中写了创建临时文件,还声明了很多变量,它在没有执行结束之前,突然CTRL+C INT信号,这时候这些创建的临时文件应该删除,至少要把脚本执行过程中产生的垃圾清理掉,这里执行的操作就多了,可以通过定义函数来使用: [root@Smoke ~]# vim ping.sh(编辑ping.sh脚本) #!/bin/bash # NET=192.168.0 clearup() { (定义函数clearup) echo "quit..." exit 1 } trap \'clearup\' INT (捕捉信号CTRL+C INT,并执行clearup函数) for I in {200..254};do if ping -c 1 -W 1 $NET.$I &> /dev/null;then echo "$NET.$I is up." else echo "$NET.$I is down." fi done [root@Smoke ~]# ./ping.sh(当前目录执行ping.sh脚本) 192.168.0.200 is down. quit... 提示:捕捉CTRL+C INT信号,退出脚本,并显示quit; 如何清理现场: [root@Smoke ~]# vim ping.sh(编辑ping.sh脚本) #!/bin/bash # NET=192.168.0 FILE=`mktemp /tmp/file.XXXXXX`(定义变量FILE,并将mktemp创建临时文件结果赋予FILE变量) clearup() { echo "quit..." exit 1 } trap \'clearup\' INT for I in {200..254};do if ping -c 1 -W 1 $NET.$I &> /dev/null;then echo "$NET.$I is up." | tee >> $FILE(tee从标准输入读取数据,并且发送至标准输出和文件,可以实现将一个数据即保存到文件中又能够输出到显示器) else echo "$NET.$I is down." fi done [root@Smoke ~]# ./ping.sh(当前目录执行ping.sh脚本) 192.168.0.200 is down. 192.168.0.201 is down. 192.168.0.202 is down. 192.168.0.203 is down. 192.168.0.204 is down. 192.168.0.205 is down. quit... 提示:捕获CTRL+C INT信号,退出脚本,并显示quit,但是临时文件不会删除; #!/bin/bash # NET=192.168.0 FILE=`mktemp /tmp/file.XXXXXX` clearup() { echo "quit..." rm -f $FILE(删除临时文件) exit 1 } trap \'clearup\' INT for I in {200..254};do if ping -c 1 -W 1 $NET.$I &> /dev/null;then echo "$NET.$I is up." | tee >> $FILE else echo "$NET.$I is down." fi done [root@Smoke ~]# rm -rf /tmp/file.*(删除/tmp目录下所有file开头任何长度任意字符结尾的临时文件) [root@Smoke ~]# ./ping.sh(当前目录执行ping.sh脚本) 192.168.0.200 is down. 192.168.0.201 is down. 192.168.0.202 is down. 192.168.0.203 is down. 提示:让脚本运行,同时通过新的tty终端查看/tmp目录创建的临时文件; [root@Smoke ~]# ls /tmp/ busybox file.H14378 gconfd-root mapping-root mapping-Smoke scim-panel-socket:0-root scim-panel-socket:0-Smoke [root@Smoke ~]# tail -f /tmp/file.H14378(查看file.H14378文件后10行内容,-f查看文件尾部,不退出,等待显示后续追加至此文件的新内容) 192.168.0.202 is up 192.168.0.203 is up 192.168.0.204 is up 192.168.0.206 is up 192.168.0.208 is up [root@Smoke ~]# ./ping.sh(当前目录执行ping.sh脚本) 192.168.0.200 is down. 192.168.0.201 is down. 192.168.0.202 is down. 192.168.0.203 is down. quit... 提示:这是使用CTRL+C INT捕捉信号,退出脚本,并显示quit,再查看临时文件是否存在; [root@Smoke ~]# ls /tmp/(查看/tmp目录文件及子目录) busybox gconfd-root mapping-root mapping-Smoke scim-panel-socket:0-root scim-panel-socket:0-Smoke 提示:通过CTRL+C信号,临时文件被清理掉;
任务计划:
很多时候我们将系统执行的任务写成了脚本,但是并不期望这个脚本立即就执行,而是安排到未来的某个时间运行的话,这种机制就叫任务计划(一定是未来的时间);
1、在未来的某个时间点执行一次某任务;
at
-l:查看作业;
batch:不需要指定时间,但是也只是执行一次,特性:在系统比较空闲的时候执行任务,其他格式和at相同;
at 时间(时间点)
at> COMMAND(at>提示符,COMMAND输入期望要执行的命令,可以写多个,使用回车继续;)
at> Ctrl+d(提交任务任务)
指定时间:
绝对时间:HH:MM, DD.MM.YY MM/DD/YY
相对时间:now+#(从现在开始往后3分钟)
单位:minutes, hours, days, weeks
模糊时间:noon(上午12点), midnight(晚上12点), teatime(下午4点,喝茶时间)
命令的执行结果:将以邮件的形式发送给安排任务的用户
at -l = atq:查看作业队列列表;
at -d AT_JOB_ID = atrm AT_JOB_ID:删除作业,AT_JOB_ID作业号;
可以定义让谁使用at或batch创建任务计划:如果at.deny和at.allow文件都存在,只允许at.allow中用户使用at或batch创建任务计划,如果两个都不存在只允许root用户使用at或batch创建任务计划;
/etc/at.deny:黑名单,拒绝那些用户使用任务计划
/etc/at.allow:白名单,允许那些用户使用任务计划;
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:每周日的每个小时的第3分钟;
13 12 6 7 *:每年的7月6号13点13分;
,: 离散时间点:
10,40 02 * * 2,5:每周2和周5的2点10分和2点40分;
-:连续时间点:
10 02 * * 1-5:每周1到周5的2点10分;
/#: 对应取值范围内每多久一次,#频率;
*/3 * * * *:每3分钟执行一次;
每两小时执行一次:
* */2 * * *:每两小时的每分钟执行一次;
08 */2 * * *:每两小时执行一次;
每两天执行一次:
* * */2 * *:每两天的每分钟都执行一次;
10 04 */2 * *:每两天执行一次;
当指定某个每时间点的时候比它小的时间点一定要加上具体值;
cron执行结果将以邮件形式发送给管理员:
*/3 * * * * /bin/cat /etc/fstab &> /dev/null:每3分钟显示/etc/fstab,所有结果送到/dev/null,如果正确结果使用>送到/dev/null,保留错误结果;
cron的环境变量:cron执行所有命令都去PATH环境变量指定的路径下去找,(注意:既然是任务计划,执行的时候很可能是没有登录的,所以没有PATH环境变量,所以无法找到命令,一般在cron当中使用的命令都应该写绝对路径)
PATH(cron PATH只包含的PATH环境变量路径) /bin:/sbin:/usr/bin:/usr/sbin
如果在cron中使用脚本(每个命令都要写绝对路径比较麻烦):可以在脚本中定义PATH环境变量,这样脚本就使用自身的环境变量,就不再使用其他的环境变量;
#!/bin/bash
PATH=
用户任务的管理:
crontab
-l: 列出当前用户的所有cron任务
-e: 编辑
-r: 移除所有任务,移除cron文件;
-u USERNAME: 管理其用户的cron任务
anacron:anacron如果cron任务不幸略过,可以代替cron在系统启动以后执行这个任务,所以它是cron的补充,替代不了cron;
rond和anacron服务:
service crond status:使用cron任务一定要确保cron服务是启动的;
service anacron status:使用anacron任务一定要确保anacron服务是启动的,默认是关闭的;
[root@Smoke tmp]# man at(查看at命令man帮助文档) [root@Smoke tmp]# at now+3(在3后执行任务) syntax error. Last token seen: 3 Garbled time 提示:syntax error,语法错误 [root@Smoke tmp]# at now+3minutes(在3分钟后执行任务,以提交任务开始) at> ls /var at> cat /etc/fstab at> <EOT>(CTRL+D提交任务) job 1 at 2014-12-06 00:10(第1个作业在2014-12-06 00:10) [root@Smoke tmp]# at now+10minutes(在10分钟后执行任务,以提交任务开始) at> cat /etc/issue at> <EOT>(CTRL+D提交任务) job 2 at 2014-12-06 00:19(第2各作业在2014-12-06 00:19) [root@Smoke tmp]# at -l(显示作业列表) 2(第2个作业) 2014-12-06 00:19(执行时间) a(队列) root(用户) 1 2014-12-06 00:10 a root [root@Smoke ~]# at -d 2(删除2号作业) [root@Smoke ~]# at -l(查看作业列表) [root@Smoke ~]# at now+1minutes(在1分钟后执行任务,以提交任务开始) at> cat /etcfstab at> <EOT>(CTRL+D提交任务) job 3 at 2014-12-06 01:01 [root@Smoke ~]# service sendmail restart(重启sendmail服务) Shutting down sm-client: [ OK ] Shutting down sendmail: [ OK ] Starting sendmail: [ OK ] Starting sm-client: [ OK ] [root@Smoke ~]# mail(查看用户邮件) Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/root": 3 messages 1 new 3 unread U 1 root@Smoke.com Sat Dec 6 00:10 44/1206 "Output from your job 1" U 2 root@Smoke.com Sat Dec 6 00:19 18/639 "Output from your job 2" & 1(选择数字读取那个邮件) & q(退出邮件) [root@Smoke ~]# ls /etc/at.deny(查看at或batch黑名单文件) [root@Smoke ~]# vim /etc/crontab(查看系统cron配置文件) SHELL=/bin/bash(以那一个作为解析命令的解释器) PATH=/sbin:/bin:/usr/sbin:/usr/bin(环境变量) MAILTO=root(邮件发给谁) HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly(每小时执行一次,以root用户身份,执行run-parts参数/etc/cron.hourly,run-parts是红帽提供的脚本, 能够实现运行/etc/cron.hourly下的每一个脚本或命令) 02 4 * * * root run-parts /etc/cron.daily(每天任务) 22 4 * * 0 root run-parts /etc/cron.weekly(每周日任务) 42 4 1 * * root run-parts /etc/cron.monthly(每月任务) [root@Smoke ~]# ls /etc/cron.daily/(查看没天任务的文件夹) 0anacron 0logwatch cups logrotate(日志滚动) makewhatis.cron mlocate.cron prelink rhsmd rpm tmpwatch(监控tmp目录) 提示:这些脚本都是用于实现系统自身维护的,这些脚本不会同一时刻执行,不然系统在同一时候会非常繁忙,它们执行是由次序的,名称前面带数字从小到大执行,然后执 行按名称排序执行,run-parts可以实现一个个执行,想让第一个运行尽可能把它的名字命名越靠前; [root@Smoke ~]# cd /var/spool/cron/(切换到用户cron目录) [root@Smoke cron]# vim root(编辑root用户cron) 提示:用户cron需要在/var/spool/cron/目录下定义和用户同名的文件,不会检查语法; [root@Smoke ~]# crontab -l(列出当前用户cron任务) no crontab for root [root@Smoke ~]# crontab -e(定义当前用户cron任务) */3 * * * * /bin/echo "how are ya?"(每3分钟执行一次) crontab: installing new crontab(安排新的cron任务) [root@Smoke ~]# crontab -e */3 * * * * /bin/echo "how are ya?" */5 * * * /bin/echo "how are ya?"(少些一段时间表示) crontab: installing new crontab "/tmp/crontab.XXXXzS1tQE":2: bad day-of-week errors in crontab file, can\'t install.(错误的cron文件,不能安排) Do you want to retry the same edit? y(需要重新编辑吗,y编辑) */3 * * * * /bin/echo "how are ya?" */5 * * * * /bin/echo "how are ya?" 提示:crontab -e可以检查语法错误,如果收到在/var/spool/cron目录编辑用户cron不会检查语法; [root@Smoke ~]# ls /var/spool/cron/(查看用户cron文件) root [root@Smoke ~]# crontab -r(移除所以cron任务,会删除cron文件) [root@Smoke ~]# ls /var/spool/cron/(查看用户cron文件) [root@Smoke ~]# id hadoop(查看hadoop用户信息) uid=501(hadoop) gid=501(hadoop) groups=501(hadoop) context=root:system_r:unconfined_t:SystemLow-SystemHigh [root@Smoke ~]# crontab -u hadoop -e(给hadoop用户编辑cron任务) */3 * * * * /bin/echo "How are ya!"(每3分钟执行一次) [root@Smoke ~]# ls /var/spool/cron/(查看用户cron任务文件) hadoop [root@Smoke ~]# su - hadoop(切换到hadoop用户) [hadoop@Smoke ~]$ crontab -l(列出当前用户cron任务) */3 * * * * /bin/echo "How are ya!" [root@Smoke ~]# cat /etc/anacrontab(查看anacrontab文件) # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 1(过去已经有1天没执行,每天任务,每分钟任务,小于1天的任务,在过去应该执行一次的,但它一天没有执行了) 65(如果有小于1天的任务,在一天没有执行, 在开机以后的第65分钟执行) cron.daily run-parts /etc/cron.daily 7(已经有7天没执行) 70(开机以后第70分钟) cron.weekly run-parts /etc/cron.weekly 30(已经有1个月没执行) 75(开机以后第75分钟) cron.monthly run-parts /etc/cron.monthly 提示:anacrontab文件语法格式,这个文件一共有4个段,前两个段是指时间的,第三个段是注释信息,第四个段是要执行的任务,anacrontab最小操作单位是天,cron是分 钟,但是anacrontab最多只能监控到天,过去一天已经没有执行了,如果是过去5分钟是管不了的,只能监控到每天、每周、每月; [root@Smoke ~]# service crond status(查看crond服务状态) crond (pid 3603) is running... 提示:cron一定要确保crond服务启动,只有crond服务运行,cron任务才能运行; [root@Smoke ~]# service anacron status(查看anacron服务状态) anacron is stopped 提示:anacron一定要确保anacron服务是启动的,默认是关闭的; [root@Smoke ~]# chkconfig --list crond(查看crond服务在不同级别下运行情况) crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off 提示:crond服务也是chkconfig控制的;
问题:
配置本机每隔两台在凌成3点20备份一次/etc目录,备份文件存放至/backup/etc目录,文件形如:etc-2012-06-20.tar.bz2;
Linux内核及编译
Linux系统安装和kickstart
故障排除
Kernel + initrd(busybox制作,提供ext3文件系统模块) + ROOTFS (busybox制作)
make arch/:只编译对应目录下的所有内容;
arch/x86/boot/bzImage:编译后x86内核目录,bzImage是使用bz方式压缩之后的内核映像文件;
硬件驱动:initrd
initrd: 仅需要提供内核访问真正的根文件系统所在设备需要的驱动
存储设备和文件系统相关的模块
系统初始化rc.sysinit: 初始其它硬件的驱动程序;
ROOTFS: busybox, init不支持运行级别(如果要使用运行级别可以移植,还需要更改/etc/inittab文件格式)
/etc/inittab: 格式也不尽相同
ash, hush:busybox提供的shell,没有提供bash
bash:将bash移植进busybox
内核编译:
make SUBDIR=arch/
make arch/x86/
/boot/vmlinuz (ext3, IDE):系统自己的内核不带ext3模块,但是默认支持IDE的硬盘驱动,因此不再需要提供硬件设备驱动,只需要提供文件系统;
/mnt/boot: /dev/hda1
/mnt/sysroot: /dev/hda2
制作完整的小Linux系统:
[root@Smoke ~]# ls(查看当前目录文件及子目录) linux-2.6.38.5.tar.bz2 提示:下载linux内核为linux-2.6.38.5.tar.bz2,将内核文件解压到/usr/src目录; [root@Smoke ~]# tar xf linux-2.6.38.5.tar.bz2 -C /usr/src/(解压linux-2.6.38.5.tar.bz2,-C更改解压目录为/usr/src) [root@Smoke ~]# cd /usr/src/(切换到/usr/src) [root@Smoke src]# ls(查看当前目录文件及子目录) debug kernels linux-2.6.38.5 redhat [root@Smoke src]# ln -sv linux-2.6.38.5/ linux(给linux-2.6.38.5创建软连接linux,并显示创建过程) create symbolic link `linux\' to `linux-2.6.38.5/\' [root@Smoke src]# cd linux(切换到linux目录) [root@Smoke linux]# ls(查看当前目录文件及子目录) arch COPYING crypto drivers fs init Kbuild kernel MAINTAINERS mm README samples security tools virt block CREDITS Documentation firmware include ipc Kconfig lib Makefile net REPORTING-BUGS scripts sound usr [root@Smoke linux]# ls -a(查看当前目录所有文件及子目录) . block crypto firmware include Kbuild lib Makefile README scripts tools .. COPYING Documentation fs init Kconfig .mailmap mm REPORTING-BUGS security usr arch CREDITS drivers .gitignore ipc kernel MAINTAINERS net samples sound virt 提示:要配置内核,要提供.config文件,但是要完全从头配置比较困难,以前是直接复制当前系统的.config文件,但是当前系统的.config文件并不适合我们制作微型小Linux使用; [root@Smoke linux]# lftp 172.160.1(连接ftp服务器) lftp 172.160.1:~> cd pub/Sources/kernel(切换到pub/Sources/kernel目录) lftp 172.160.1:/pub/Sources/kernel~> get kernel-2.6.38.1-i686.cfg(下载.configure配置文件) 71568 bytes transferred lftp 172.160.1:/pub/Sources/kernel~> bye(退出0 [root@Smoke linux]# ls(查看当前目录文件及子目录) arch CREDITS drivers include Kbuild kernel-2.6.38.5-i686.cfg Makefile README scripts tools block crypto firmware init Kconfig lib mm REPORTING-BUGS security usr COPYING Documentation fs ipc kernel MAINTAINERS net samples sound virt 提示:下载的kernel-2.6.38.5-i686.cfg文件; [root@Smoke linux]# mv kernel-2.6.38.5-i686.cfg .config(重命名kernel-2.6.38.5-i686.cfg为.config) 提示:以.config文件作为蓝本来进行修改; [root@Smoke linux]# make menuconfig(配置内核) 提示:一定要在内核目录下;打开内核编译字符图形界面,需要将终端窗口放大不然会报错,提示窗口至少要能容纳19行,容纳80列;
提示:选择General setup --->选项,进入子菜单;
提示:选择Local version - append to kernel release(更改内核版本号),点击回车,更改版本为-1.mlinux,点击OK;
提示:选择Cross-compiler tool prefix(交叉编译)
提示:双击ESC返回主菜单,选择Device Drivers --->(设备驱动),点击回车;
提示:选择SCSI device support --->(支持SCSI设备),点击回车,选择SCSI tape support(SCSI磁带支持)通过空格键关闭;
提示:通过双击ESC键返回上级菜单,选择Serial ATA and parallel ATA drivers --->(串行ATA和并行ATA设备),都要能够支持;
提示:通过双击ESC键返回上级菜单,要在VMware使用SCSI需要编译Fusion MPT device support --->(融合MPT设备支持),SCSI Transports --->(SCSI传输)需要支持,SCSI low-level drivers --->(SCSI低级别设备)需要支持;
提示:SCSI Transports --->(SCSI传输)需要支持,SCSI low-level drivers --->(SCSI低级别设备)需要支持,选择SCSI device support --->(SCSI设备支持)点击回车;
提示:我们这里内核提供的样本是不支持SCSI设备的,所以不进行更改,双击ESC返回到主菜单,选择Device Drivers ---(设备驱动),选择Network device support --->(网络设备支持),点击回车;
提示:关闭Eternet (1000 Mbit) --->(千兆网卡)、关闭Eternet (10000 Mbit) --->(万兆网卡)、关闭Wireless LAN --->(无线网卡)、关闭PCMCIA network device support --->;
提示:通过双击ESC返回主菜单,选择File systems --->(文件系统)点击回车;
提示:将ext2文件系统支持通过空格选择做进内核、将ext3文件系统支持通过空格选择做进内核、将ext4通过空格关闭支持,Reiserfs support(reiserfs文件系统支持)在我们文件系统用不着通过空格关闭、JFS filesystem support(JFS文件系统支持)通过空格关闭,XFS filesystem support(XFS文件系统支持)通过空格关闭,这样把ext3文件系统直接做进内核,这样就不需要在initrd中给它提供模块了,否则就必须要手动给它提供模块;
提示:双击ESC返回上级菜单,找到Network device support --->(网络设备支持),点击回车;
提示:选择Eternet (10 or 100Mbit) --->点击回车,关闭3COM cards、将AMD PCnet32 PCI support(AMD PCnet32 PCI支持)做进模块,关闭Micrel KSZ8841/2 PCI、关闭Broadcom 440x/47xx ethernet support(蓝牙支持)、关闭nForce Ethernet support、关闭CS89x0 support、关闭Inter(R) PRO/100+ support、关闭Mylex EISA LNE390A/B support (EXPERIMENTAL)、关闭Myson MTD-8xx PCI Ethernet supoort、关闭National Semiconductor DP8381x series PCI Ethernet supoort、关闭PCI NE2000 and clones support (see help)、关闭RealTek RTL-8139 C+ PCI Fast Ethernet Adapter support (EXPERMENTAL)、关闭RealTek RTL-8129/8130/8139 PCI fast Ethernet Adapter support、关闭RDC R6040 Fast Ethernet Adapter support、关闭Sis 900/7016 PCI Fast Ethernet Adapter support、关闭SMC Etherpower II、关闭SMSC LAN9420 PCI ethernet adapter support、关闭Sundance Alta supoort、关闭TI ThunderLAN support、关闭Micrel KS8851 MLL、关闭VIA Rhine support;
提示:双击ESC返回到主菜单,保存退出,选择Yes;
[root@Smoke linux]# cp .config /root/config-2.6.38.5-i686.cfg(赋值.config文件到/root目录叫config-2.6.38.5-i686.cfg) [root@Smoke linux]# make drivers/net/pcnet32.ko(编译网卡模块pcnet32.ko) 提示:将pcnet32.c写成pcnet32.ko进行编译; [root@Smoke linux]# modinfo drivers/net/pcnet32.ko(查看pcnet32.ko模块信息) filename: drivers/net/pcnet32.ko license: GPL description: Driver for PCnet32 and PCnetPCI based ethercards author: Thomas Bogendoerfer alias: pci:v00001023d00002000sv*sd*bc02sc00i* alias: pci:v00001022d00002000sv*sd*bc*sc*i* alias: pci:v00001022d00002001sv*sd*bc*sc*i* depends: vermagic: 2.6.38.5-1.mlinux SMP preempt mod_unload 686 parm: debug:pcnet32 debug level (int) parm: max_interrupt_work:pcnet32 maximum events handled per interrupt (int) parm: rx_copybreak:pcnet32 copy breakpoint for copy-only-tiny-frames (int) parm: tx_start_pt:pcnet32 transmit start point (0-3) (int) parm: pcnet32vlb:pcnet32 Vesa local bus (VLB) support (0/1) (int) parm: options:pcnet32 initial option setting(s) (0-15) (array of int) parm: full_duplex:pcnet32 full duplex setting(s) (1) (array of int) parm: homepna:pcnet32 mode for 79C978 cards (1 for HomePNA, 0 for Ethernet, default Ethernet (array of int) 提示:查看依赖那些模块,自己编译的pcnet32.ko模块不再依赖mii.ko模块; [root@Smoke linux]# make drivers/net/(编译drivers/net/目录下所有模块) 提示:编译drivers/net/目录下所有已经选择的网卡都会被编译; [root@Smoke linux]# make arch/(编译对应子目录下的内容) 提示:只编译核心make arch/,或者make arch/x86/编译x86平台核心,不指定它会根据当前系统操作系统平台版本进行选择,所以我们执行make arch/就可以了,为 了让这个过程不会端口可以打开screen; [root@Smoke linux]# screen(打开screen) 提示:在编译内核时候最好不要使用远程连接,万一远程连接断开了,内核编译过程也就中断了,你要再重新执行又要重头开始,可以使用screen工具,能够在当前远程窗口 中模拟好几个窗口; [root@Smoke linux]# make arch/x86/(编译x86平台核心) 先使用操作系统提供的内核,等新内核编译好了再切换到新内核:(/boot/vmlinuz (ext3, IDE):系统自己的内核不带ext3模块,但是默认支持IDE的硬盘驱动,因此不 再需要提供硬件设备驱动,只需要提供文件系统;) 提供boot目录和sysroot目录: 在现有linux虚拟机增加一块20G的IDE硬盘,为系统上的新硬盘建立分区,这里根据需要先建立一个大小为100M的主分区作为新建系统的boot分区和一个512M的分区作为目 标系统(即正在构建的新系统,后面将沿用此名称)的根分区;100M的分区格式化后将其挂载至/mnt/boot目录下;512M的分区格式化后将挂载至/mnt/sysroot目录; [root@localhost ~]# fdisk -l(查看系统上磁盘及分区情况) Disk /dev/hda: 21.4 GB, 21474836480 bytes 15 heads, 63 sectors/track, 44384 cylinders Units = cylinders of 945 * 512 = 483840 bytes Disk /dev/hda doesn\'t contain a valid partition table Disk /dev/sda: 53.6 GB, 53687091200 bytes 255 heads, 63 sectors/track, 6527 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 2624 20972857+ 83 Linux /dev/sda3 2625 2755 1052257+ 82 Linux swap / Solaris [root@localhost ~]# fdisk /dev/hda(管理磁盘分区,进入交互式模式) The number of cylinders for this disk is set to 44384. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): n(创建分区) Command action e extended p primary partition (1-4) p(主分区) Partition number (1-4): 1(分区号) First cylinder (1-44384, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-44384, default 44384): +100M(创建100M分区) Command (m for help): n(创建分区) Command action e extended p primary partition (1-4) p(驻俄分区) Partition number (1-4): 2(分区号) First cylinder (209-44384, default 209): Using default value 209 Last cylinder or +size or +sizeM or +sizeK (209-44384, default 44384): +512M(创建512M分区) Command (m for help): w(保存退出) The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@localhost ~]# partprobe /dev/hda(让内核重新扫描分区表) [root@localhost ~]# fdisk -l /dev/hda(查看/dev/hda分区情况) Disk /dev/hda: 21.4 GB, 21474836480 bytes 15 heads, 63 sectors/track, 44384 cylinders Units = cylinders of 945 * 512 = 483840 bytes Device Boot Start End Blocks Id System /dev/hda1 1 208 98248+ 83 Linux /dev/hda2 209 1267 500377+ 83 Linux [root@localhost ~]# mke2fs -j /dev/hda1(将/dev/hda1创建为带日志的文件系统,即ext3文件系统) mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 24576 inodes, 98248 blocks 4912 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67371008 12 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@localhost ~]# mke2fs -j /dev/hda2(将/dev/hda2创建为带日志的文件系统,即ext3文件系统) mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 125488 inodes, 500376 blocks 25018 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67633152 62 block groups 8192 blocks per group, 8192 fragments per group 2024 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409 Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 35 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@localhost ~]# mkdir /mnt/{boot,sysroot}(创建/mnt/boot目录和/mnt/sysroot目录,花括号{}展开) [root@localhost ~]# mount /dev/hda1 /mnt/boot/(将/dev/hda1挂载到/mnt/boot/目录) [root@localhost ~]# mount /dev/hda2 /mnt/sysroot/(将/dev/hda2挂载到/mnt/boot/目录) [root@localhost ~]# mount(查看系统所有挂载的文件系统) /dev/sda2 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) /dev/hda1 on /mnt/boot type ext3 (rw) /dev/hda2 on /mnt/sysroot type ext3 (rw) 安装GRUB: [root@Smoke ~]# grub-install --root-directory=/mnt /dev/hda(安装GRUB,根目录/mnt,设备/dev/hda) Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install\'. (fd0) /dev/fd0 (hd0) /dev/hda (hd1) /dev/sda [root@Smoke ~]# ls /mnt/boot/(查看安装的grub) grub lost+found 复制内核: [root@Smoke ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz(复制vmlinuz-2.6.18-308.el5到/mnt/boot目录叫vmlinuz) 下载busybox: [root@Smoke ~]# lftp 172.16.0.1(连接ftp服务器172.16.0.1) lftp 172.16.0.1:~> cd /pub/Sources/Busybox lftp 172.16.0.1:/pub/Sources/Busybox> get busybox-1.20.2.tar.bz2(下载busybox) 216738 bytes transferred lftp 172.16.0.1:/pub/Sources/Busybox> bye(退出) [root@Smoke ~]# tar xvf busybox-1.20.2.tar.bz2(展开解压busybox-1.2.0.tar.bz2,并显示详细过程) 提示:busybox-1.20.2.tar.bz2它所依赖的内核头文件比我们当前系统要新; [root@Smoke ~]# uname -r(查看当前系统内核版本) 2.6.18-308.el5 [root@Smoke ~]# mkdir busybox-1.20.2/include/mtd(创建mtd目录) [root@Smoke ~]# cp /usr/src/linux-2.6.38.5/include/mtd/ubi-user.h busybox-1.20.2/include/mtd/(赋值ubi-user.h到/busybox-1.20.2 /include/mtd目录) [root@Smoke ~]# cd busybox-1.20.2(切换到busybox-1.20.2目录0 [root@Smoke busybox-1.20.2]# make menuconfig(配置busybox)
提示:选择Busybox Settings --->(设置),点击回车;
提示:选择Build options --->,点击回车;
提示:选择Build BusyBox as a static binary (no shared libs),编译选项通过空格更改为静态,移植起来方便;
提示:双击ESC返回上级菜单,选择Installation Options ("make install" behavior) --->安装路径,点击回车;
提示:可以将安装路径直接改为/mnt/sysroot,我们这里不进行更改;
提示:通过ESC返回主菜单保存退出,选择Yes;
[root@Smoke busybox-1.20.2]# make install(安装) 查看新内核是否编译好: [root@Smoke ~]# screen -ls(显示已经建立的屏幕) 22367.pts-4.101ab (Detached) 1 Socket in /var/run/screen/S-root. [root@Smoke ~]# screen -r 22367(还原回22367平面) 提示:新内核已经编译好了,可以直接用了; [root@Smoke linux]# ls arch/x86/boot/(查看arch/x86/boot目录) a20.c code16gcc.h early_serial_console.c mca.c printf.c version.c video-vesa.c apm.c compressed edd.c memory.c regs.c vesa.h video-vga.c bioscall.S copy.S header.S mkcpustr.c setup.ld video-bios.c bitops.h cpu.c install.sh mtools.conf.in string.c video.c boot.h cpucheck.c main.c pm.c tools video.h cmdline.c ctype.h Makefile pmjump.S tty.c video-mode.c 提示:没有bzimage [root@Smoke linux]# cd arch/(切换到arch目录) [root@Smoke arch]# ls(查看当前目录文件及子目录) alpha avr32 cris h8300 Kconfig m68k microblaze mn10300 powerpc score sparc um xtensa arm blackfin frv ia64 m32r m68knommu mips parisc s390 sh tile x86 [root@Smoke arch]# cd x86/(切换到x86目录) [root@Smoke x86]# ls(查看当前目录文件及子目录) boot ia32 Kconfig.cpu lguest math-emu pci vdso built-in.o include Kconfig.debug lib mm platform video configs Kbuild kernel Makefile modules.order power xen crypto Kconfig kvm Makefile_32.cpu oprofile tools [root@Smoke x86]# cd boot/(切换到boot目录) [root@Smoke boot]# ls(查看当前目录文件及子目录) a20.c code16gcc.h early_serial_console.c mca.c printf.c version.c video-vesa.c apm.c compressed edd.c memory.c regs.c vesa.h video-vga.c bioscall.S copy.S header.S mkcpustr.c setup.ld video-bios.c bitops.h cpu.c install.sh mtools.conf.in string.c video.c boot.h cpucheck.c main.c pm.c tools video.h cmdline.c ctype.h Makefile pmjump.S tty.c video-mode.c 提示:直接指定目录没法编译成目标模块; [root@Smoke linux]# make clean(清空) 提示:会将配置文件删除; [root@Smoke linux]# make mrproper(清理) [root@Smoke linux]# cp /root/config-2.6.38.5-i686.cfg .config(复制config-2.6.38.5-i686.cfg到当前目录叫.config) [root@Smoke linux]# make SUBDIR=arch/(编译arch目录) 基于busybox提供initrd文件: [root@Smoke busybox-1.20.2]# mkdir /tmp/initrd(创建initrd目录) [root@Smoke busybox-1.20.2]# cp -a _install/* /tmp/initrd/(复制_initall目录所有文件到/tmp/initrd目录,-a归档赋值,保存文件原有所有的属性) 提示:busy编译安装好以后的文件在_install目录下; [root@Smoke busybox-1.20.2]# cd /tmp/initrd/(切换到/tmp/initrd目录) [root@Smoke initrd]# ls(查看当前目录文件及子目录) bin linuxrc sbin usr [root@Smoke initrd]# ls bin/(查看bin目录文件及子目录) addgroup conspy dumpkmap gzip iptunnel mknod ping rpm sync adduser cp echo hostname kill mktemp ping6 run-parts tar ash cpio ed hush linux32 more pipe_progress scriptreplay touch base64 cttyhack egrep ionice linux64 mount powertop sed true busybox date false iostat ln mountpoint printenv setarch umount cat dd fdflush ip login mpstat ps setserial uname catv delgroup fgrep ipaddr ls mt pwd sh usleep chattr deluser fsync ipcalc lsattr mv reformime sleep vi chgrp df getopt iplink lzop netstat rev stat watch chmod dmesg grep iproute makemime nice rm stty zcat chown dnsdomainname gunzip iprule mkdir pidof rmdir su 提示:busybox模拟的命令; [root@Smoke initrd]# ls usr/bin/(查看usr/bin目录文件及子目录) [ comm fdformat ipcs microcom readahead sha256sum time uudecode [[ crontab fgconsole kbd_mode mkfifo readlink sha512sum timeout uuencode add-shell cryptpw find killall mkpasswd realpath showkey top vlock arping cut flock killall5 nc remove-shell smemcap tr volname awk dc fold last nmeter renice softlimit traceroute wall basename deallocvt free less nohup reset sort traceroute6 wc beep diff ftpget logger nslookup resize split tty wget bunzip2 dirname ftpput logname od rpm2cpio strings ttysize which bzcat dos2unix fuser lpq openvt rtcwake sum udpsvd who bzip2 du groups lpr passwd runsv sv unexpand whoami cal dumpleases hd lsof patch runsvdir tac uniq whois chat eject head lspci pgrep rx tail unix2dos xargs chpst env hexdump lsusb pkill script tcpsvd unlzma xz chrt envdir hostid lzcat pmap seq tee unlzop xzcat chvt envuidgid id lzma printf setkeycodes telnet unxz yes cksum ether-wake ifplugd lzopcat pscan setsid test unzip clear expand install md5sum pstree setuidgid tftp uptime cmp expr ipcrm mesg pwdx sha1sum tftpd users 提示:busybox模拟的命令; [root@Smoke initrd]# ls usr/sbin/(查看usr/sbin目录文件及子目录) brctl dhcprelay ftpd lpd ntpd readprofile svlogd ubimkvol udhcpd chpasswd dnsd httpd nanddump popmaildir sendmail telnetd ubirmvol chroot fakeidentd inetd nandwrite rdate setfont ubiattach ubirsvol crond fbset loadfont nbd-client rdev setlogcons ubidetach ubiupdatevol 提示:busybox模拟命令,甚至还可以模拟服务器的,如httpd、udhcpd(dhcp服务器)、ntpd(时间服务器)、ftpd(ftp服务器)、dnsd(dns服务器)、dhcprelay (dhcp中继)、telnetd(telnet服务器); 提供基本目录: [root@Smoke initrd]# mkdir -pv proc sys mnt/sysroot dev tmp lib/modules etc(创建目录,递归创建,并显示创建过程) mkdir: created directory `proc\' mkdir: created directory `sys\' mkdir: created directory `mnt\' mkdir: created directory `mnt/sysroot\' mkdir: created directory `dev\' mkdir: created directory `tmp\' mkdir: created directory `lib\' mkdir: created directory `lib/modules\' mkdir: created directory `etc\' 提示:mnt/sysroot,直接建sysroot也可以,或者不叫这个名字叫mnt/root也可以,这个目录是自己命名的,等会会将/dev/hda2挂载到/mnt/sysroot目录下, 并把它当作真正的根来切换的,这个目录是可以自己命名的; [root@Smoke initrd]# rm linuxrc(删除linuxrc文件) rm: remove symbolic link `linuxrc\'? y 创建两个设备文件: [root@Smoke initrd]# mknod dev/console c 5 1(创建字符设备文件dev/console,c字符设备,主设备号为5,次设备号为1) [root@Smoke initrd]# mknod dev/null c 1 3(创建字符设备文件/dev/null,c字符设备,主设备号为1,次设备号为3) 提示:在创init脚本之前先创建这两个设备文件; [root@Smoke initrd]# ls -l dev/(查看dev目录文件及子目录详细信息) total 8 crw-r--r-- 1 root root 5, 1 Dec 7 05:57 console crw-r--r-- 1 root root 1, 3 Dec 7 05:58 null 创建init脚本: [root@Smoke initrd]# vim init(编辑init文件) #!/bin/sh(此时还没有bash,可以用默认提供的sh或ash或hsh) mount -t proc proc /proc (挂载proc文件系统,输出内核映像) mount -t sysfs /sysfs /sys (输出硬件信息) insmod /lib/modules/jbd.ko(导入ext3内核模块) insmod /lib/modules/ext3.ko(导入ext3内核模块) mdev -s(探测其他硬件设备) mount -t ext3 /dev/hda2/ /mnt/sysroot exec switch_root /mnt/sysroot /sbin/init(切换根文件系统,切换到/mnt/sysroot目录,执行/sbin/init命令) 提示:这里使用sh,还不能使用bash,需要挂载/proc(用来输出内核映像)文件系统,sysfs(输出硬件信息)两个伪文件系统,这两个文件系统必须要在这里手动挂 载,不然内核无法正常工作,或者说内核无法探测其他硬件,内核也无法将自己的信息输出给用户空间的,导入ext3文件系统模块,不然无法访问真正的根文件系统,如果 格式化为ext2文件系统就不需要导入,内核中能够直接支持ext2,就不再需要装载模块,dev -s(busybox模拟的)通过/sys目录输出所有的硬件信息给用户空间,通 过/sys目录访问所有的硬件,主要目录在/dev目录创建设备文件,这是动态创建设备文件的方式,跟udev相同,动态创建设备文件的机制,不然其他设备都无法访问,只 是有两个设备文件得提前使用dev/console和dev/null,因此要提前创建,其他的都不需要提前创建了,挂载真正的根文件系统/dev/hda2到/mnt/sysroot,切换根, switch_root命令是busybox提供给我们的,是sh提供的内建命令,它能够完成切换根文件系统,把根切换到/mnt/sysroot位置根上去,而且会执行这个目录下的/sbin /init命令,第一个根切换完以后,就要执行第一个用户空间的进程; [root@Smoke ~]# cd busybox-1.20.2/_install/(切换到busybox-1.20.2/_install目录) [root@Smoke _install]# sbin/switch_root --help(查看switch_root命令帮助信息) BusyBox v1.20.2 (2014-12-06 06:35:37 CST) multi-call binary. Usage: switch_root [-c /dev/console] NEW_ROOT NEW_INIT [ARGS](-c /dev/console指定基于那个控制台来完成,NEW_ROOT新根位置,NEW_INIT新 的init程序,ARGS还可以像init程序传递参数) Free initramfs and switch to another root fs: chroot to NEW_ROOT, delete all in /, move NEW_ROOT to /, execute NEW_INIT. PID must be 1. NEW_ROOT must be a mountpoint. -c DEV Reopen stdio to DEV after switch #!/bin/sh # echo "mounting proc and sys..." mount -t proc proc /proc mount -t sysfs sysfs /sys echo "Load ext3 module..." insmod /lib/modules/jbd.ko insmod /lib/modules/ext3.ko echo "Detect and export hardware infomation..." mdev -s echo "Mount real rootfs to /mnt/sysroot..." mount -t ext3 /dev/hda2 /mnt/sysroot(需要指定文件系统类型,在红帽系统上不指定,因为它可以使用bukid命令自动探测的,这里可能探测不到) echo "Switch to read_rootfs..." exec switch_root /mnt/sysroot /sbin/init [root@Smoke initrd]# chmod +x init(给init脚本执行权限) 复制ext3文件系统依赖的模块: [root@Smoke initrd]# modinfo jbd(查看jbd模块信息) filename: /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko license: GPL srcversion: 11842879E04FE2392B988CC depends: vermagic: 2.6.18-308.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1 module_sig: 883f3504f2326dcdc995cc0b59af121112a9509d1d376cb3f07503612b0236e17947cc804b2e6909e3d31e223c8ae8dc3083a2d932d532 9bef38115a [root@Smoke initrd]# modinfo ext3(查看ext3模块信息) filename: /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko license: GPL description: Second Extended Filesystem with journaling extensions author: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts\'o and others srcversion: 26DC008FC415305C5F65313 depends: jbd vermagic: 2.6.18-308.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1 module_sig: 883f3504f2326dddc995cc0b59af121112b66609f56f4d643dcbbde3384fc7aee2342f5b331f631b09d15ace08361a0e2dfa6ec1ec46718 b122bde923 [root@Smoke initrd]# cp /lib/modules/2.6.18-308.el5/kernel/fs/jbd/jbd.ko lib/modules/(复制jbd.ko模块到lib/modules目录) [root@Smoke initrd]# cp /lib/modules/2.6.18-308.el5/kernel/fs/ext3/ext3.ko lib/modules/(复制ext3.ko模块到/lib/modules目录) 提示:模块一定要根内核版本匹配,一旦我们换内核,到新内核,这里所提供的ext3就不能使用了,这个模块是我们系统2.6.18-308.el5的模块,如果要使用新内核,一定要 使用新内核编译生成的模块; [root@Smoke initrd]# uname -r(查看内核版本) 2.6.18-308.el5 制作initrd文件: [root@Smoke initrd]# find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz(查找当前目录所有文件通过管道送给cpio打包,-H指定备 份时使用的文件格式,newc指定cpio归档文件目录结构,把当前目录下每一个文件包括它的子目录整个映射路径统统给它按照原有路径格式进行保存,并且能够支持多于512200 个文件,默认情况下cpio归档支持的文件个数非常少,newc表示新规范的方式来进行归档,支持更多的文件数量,--quiet表示静默模式,不输出信息,-o表示创建归档文件, 将结果通过管道送给gzip,-9指定压缩级别,保存至/mnt/boot/目录叫initrd.gz) [root@Smoke initrd]# ll -h /mnt/boot/(查看/mnt/boot目录文件及子目录详细信息) total 2.8M drwxr-xr-x 2 root root 1.0K Dec 6 06:05 grub -rw-r--r-- 1 root root 951K Dec 7 20:05 initrd.gz drwx------ 2 root root 12K Dec 6 06:03 lost+found -rw-r--r-- 1 root root 1.9M Dec 6 06:17 vmlinuz 给GRUB提供配置文件: [root@Smoke initrd]# vim /mnt/boot/grub/grub.conf(编辑grub.conf配置文件) deufalt=0 timeout=3 title Smoke Tiny Linux (2.6.18) root (hd0,0) kernel /vmlinuz ro root=/dev/hda2 initrd /initrd.gz 使用busybox制作真正的根文件系统: [root@Smoke initrd]# cd(切换到root家目录) [root@Smoke ~]# cp -a busybox-1.20.2/_install/* /mnt/sysroot/(复制_install下所有文件到/mnt/sysroot目录,-a归档赋值,保存文件原有所有的属性) [root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录) [root@Smoke sysroot]# pwd(查看当前目录路径) /mnt/sysroot [root@Smoke sysroot]# mount(查看系统上所有挂载的文件系统) /dev/sda2 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) /dev/hda1 on /mnt/boot type ext3 (rw) /dev/hda2 on /mnt/sysroot type ext3 (rw) [root@Smoke sysroot]# rm linuxrc(删除linuxrc文件) rm: remove symbolic link `linuxrc\'? y [root@Smoke sysroot]# mkdir -pv boot root etc/rc.d/init.d var/{log,lock,run} proc sys dev lib/modules tmp home(创建 boot root etc/rc.d/init.d var/{log,lock,run} proc sys dev lib/modules tmp home目录,递归创建,并显示创建过程) mkdir: created directory `boot\' mkdir: created directory `root\' mkdir: created directory `etc\' mkdir: created directory `etc/rc.d\' mkdir: created directory `etc/rc.d/init.d\' mkdir: created directory `var\' mkdir: created directory `var/log\' mkdir: created directory `var/lock\' mkdir: created directory `var/run\' mkdir: created directory `proc\' mkdir: created directory `sys\' mkdir: created directory `dev\' mkdir: created directory `lib\' mkdir: created directory `lib/modules\' mkdir: created directory `tmp\' mkdir: created directory `home\' [root@Smoke sysroot]# ll(查看当前目录文件及子目录详细信息) total 30 drwxr-xr-x 2 root root 3072 Dec 6 06:37 bin drwxr-xr-x 2 root root 1024 Dec 7 20:14 boot drwxr-xr-x 2 root root 1024 Dec 7 20:14 dev drwxr-xr-x 3 root root 1024 Dec 7 20:14 etc drwxr-xr-x 2 root root 1024 Dec 7 20:14 home drwxr-xr-x 3 root root 1024 Dec 7 20:14 lib drwxr-xr-x 2 root root 1024 Dec 7 20:14 proc drwxr-xr-x 2 root root 1024 Dec 7 20:14 root drwxr-xr-x 2 root root 3072 Dec 6 06:37 sbin drwxr-xr-x 2 root root 1024 Dec 7 20:14 sys drwxr-xr-x 2 root root 1024 Dec 7 20:14 tmp drwxr-xr-x 4 root root 1024 Dec 6 06:37 usr drwxr-xr-x 5 root root 1024 Dec 7 20:14 var [root@Smoke sysroot]# mknod dev/console c 5 1(创建字符设备文件dev/console,c字符设备,主设备号为5,次设备号为1) [root@Smoke sysroot]# mknod dev/null c 1 3(创建字符设备文件dev/null,c字符设备,主设备号为1,次设备号为3) 提示:这个过程未必是必须的,因为切换真正的根的时候,会把原来的dev目录所有文件都挪过来; 提供inittab系统启动文件: [root@Smoke sysroot]# vim etc/inittab(编辑inittab文件) ::sysinit:/etc/rc.d/rc.sysinit(系统初始化脚本,前面没有id级别) console::respawn:-/bin/sh(控制台,只有1个控制台,而且在控制台直接打印/bin/sh,说明没有虚拟终端) ::ctrlaltdel:/sbin/reboot(定义ctrl+alt+del重启) ::shutdown:/bin/umount -a -r(关机,卸载所有的文件系统,-a卸载所有/etc/fstab文件中定义的文件系统,-r如果无法成功协议,尝试以只读方式重新挂载文件系统) 提示:这个inittab文件跟系统上的格式不一样; 提示rc.sysinit系统初始化脚本: [root@Smoke sysroot]# vim etc/rc.d/rc.sysinit(编辑rc.sysinit脚本) #!/bin/sh # echo -e "\tWelcome to \033[34mSmoke Tiny\033[0m Linux"(打印欢迎字符,-e激活转义字符,\t插入tab) echo "Remount eht rootfs.." mount -t ext3 -o remount,rw /dev/hda2 /(重新挂载真正的根文件系统,-o指定额外挂载选项,remount重新挂载当前文件系统,把卸载和挂载一块来使用,先卸 载再挂载,重新挂载可以不指定挂载点,rw读写挂载) echo "Mount the other filesystem..." mount -a(挂载其他文件系统,/etc/fstab文件中定义的文件系统) [root@Smoke sysroot]# chmod +x !$(给rc.sysinit文件执行权限) chmod +x etc/rc.d/rc.sysinit 提供fstab文件: [root@Smoke sysroot]# vim etc/fstab(编辑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 [root@Smoke sysroot]# sync(同步磁盘写入) [root@Smoke sysroot]# sync(同步磁盘写入) [root@Smoke sysroot]# sync(同步磁盘写入)
测试:挂起宿主机,开启小Linux系统;
提示:Mount:mounting /dev/hda1 on /boot failed: No such file or directory,真正的根没有切换回来,/dev目录没有从小系统切换过来,所以mdev -s不能少;
关机切换到宿主机:
[root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录) [root@Smoke sysroot]# vim etc/rc.d/rc.sysinit(编辑rc.sysinit文件) #!/bin/sh # echo -e "\tWelcome to \033[34mSmoke Tiny\033[0m Linux" echo "Remount eht rootfs.." mount -t ext3 -o remount,rw /dev/hda2 / echo "Detect and export harward infomation..." mdev -s(扫描/sys和/dev/目录获取所有额外的硬件设备) echo "Mount the other filesystem..." mount -a [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入)
测试:挂起宿主机,开启小Linux系统;
提示:Mount:mounting /dev/hda1 on /boot failed: No such file or directory,设备文件还是没有;
关机切换到宿主机:switch_root跟红帽所提供的根切换的命令不太一样,这个命令没办法实现将小系统的proc、sys、dev目录通通搬过来,但红帽可以;
[root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录) [root@Smoke sysroot]# vim etc/rc.d/rc.sysinit(编辑rc.sysinit脚本) #!/bin/sh # echo -e "\tWelcome to \033[34mSmoke Tiny\033[0m Linux" echo "mount proc and sys..." mount -t proc proc /porc(挂载proc文件系统) mount -t sysfs sysfs /sys(挂载sysfs文件系统) echo "Remount eht rootfs.." mount -t ext3 -o remount,rw /dev/hda2 / echo "Detect and export harward infomation..." mdev -s echo "Mount the other filesystem..." mount -a [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入)
测试:挂起宿主机,开启小Linux系统;
关机切换到宿主机:
移植bash:
[root@Smoke ~]# ./bincopy.sh(执行命令移植和命令依赖的库文件移植脚本) Your command:bash /bin/bash copy lib /lib/libtermcap.so.2 finished. copy lib /lib/libdl.so.2 finished. copy lib /lib/libc.so.6 finished. copy lib /lib/ld-linux.so.2 finished. copy /bin/bash finishd. Continue:q [root@Smoke ~]# chroot /mnt/sysroot/(切换根文件系统到/mnt/sysroot) bash-3.2# ls(查看当前目录文件及子目录) bin boot dev etc home lib proc root sbin sys tmp usr var bash-3.2# exit(退出) exit 提示:默认是bash,自动找bash,chroot是找bash的,但是系统默认启动使用的是sh; [root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录) [root@Smoke sysroot]# pwd(显示当前所处目录绝对路径) /mnt/sysroot [root@Smoke sysroot]# ls(查看当前目录文件及子目录) bin boot dev etc home lib proc root sbin sys tmp usr var [root@Smoke sysroot]# cd bin/(切换到bin目录) [root@Smoke bin]# ll sh(查看sh文件详细信息) lrwxrwxrwx 1 root root 7 Dec 7 20:11 sh -> busybox 提示:sh链接到busybox,可以将这个链接删了,给它链接到bash,或者直接更改inittab配置文件; [root@Smoke bin]# cd ..(切换到上级目录) [root@Smoke sysroot]# vim etc/inittab(编辑inittab文件) ::sysinit:/etc/rc.d/rc.sysinit console::respawn:-/bin/bash ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入)
测试:挂起宿主机切换到小Linux;
关机切换到宿主机:
让系统验证用户登录:这里不再需要libnss,这里的login程序没有依赖于libnss库,所以这里不再需要libnss库,直接要求它登录就可以;
[root@Smoke ~]# grep -E "^root:" /etc/passwd(通过grep选项-E扩展正则表达式匹配/etc/passwd文件中行首为root:字符串的段) root:x:0:0:root:/root:/bin/bash [root@Smoke ~]# grep -E "^root:" /etc/passwd > /mnt/sysroot/etc/passwd(通过grep选项-E扩展正则表达式匹配/etc/passwd文件中行首为root: 字符串的段,并输出重定向passwd文件中) [root@Smoke ~]# grep -E "^root:" /etc/shadow > /mnt/sysroot/etc/shadow(通过grep选项-E扩展正则表达式匹配/etc/shadow文件中行首为root: 的字符串,并输出重定向到shadow文件中) [root@Smoke ~]# grep -E "^root:" /etc/group > /mnt/sysroot/etc/group(通过grep选项-E扩展正则表达式匹配/etc/group文件中行首为root:的 字符串的段,并输出重定向到group文件中) [root@Smoke ~]# ls /mnt/sysroot/etc/(查看/mnt/sysroot/etc目录文件及子目录) fstab group inittab passwd rc.d shadow 提示:确保passwd、shadow、group三个文件都存在; [root@Smoke ~]# vim /mnt/sysroot/etc/passwd(编辑/mnt/sysroot/etc/passwd文这里件) root:x:0:0:root:/root:/bin/bash 提示:默认用户使用的bash,如果没有移植bash,这里就要更改了,不然系统用户都登录不了; [root@Smoke ~]# vim /mnt/sysroot/etc/inittab(编辑/mnt/sysroot/etc/inittab文件) ::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty 9600 tty1(设置tty终端,9600速率) ::respawn:/sbin/getty 9600 tty2 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r 提供主机名: [root@Smoke ~]# vim /mnt/sysroot/etc/hostname(编辑hostname文件) HOSTNAME=tiny.smoke.com [root@Smoke ~]# vim /mnt/sysroot/etc/rc.d/rc.sysinit(编辑rc.sysinit脚本) #!/bin/sh # echo -e "\tWelcome to \033[34mSmoke Tiny\033[0m Linux" echo "Set the hostname" [ -f /etc/hostname ] && . /etc/hostname(判断/etc/hostname文件是否存在,如果存在就读取进来) [ -z "$HOSTNAME" -o "$HOSTNAME" == \'(none)\' ] && HOSTNAME=localhost(判断$HOSTNAME变量是否为空或者等于none,如果为空或者等于none,就执行 HOSTNAME等于localhost) hostname $HOSTNAME(设置主机名) echo "mount proc and sys..." mount -t proc proc /porc mount -t sysfs sysfs /sys echo "Remount eht rootfs.." mount -t ext3 -o remount,rw /dev/hda2 / echo "Detect and export harward infomation..." mdev -s echo "Mount the other filesystem..." mount -a 提供用户登录前显示的打印信息: [root@Smoke ~]# cp /etc/issue /mnt/sysroot/etc/(复制issue文件到/mnt/sysroot/etc目录) 备份根文件系统: [root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录0 [root@Smoke sysroot]# find . | cpio -H newc --quiet -o | gzip > /root/tiny.1.gz(查找当前目录所有文件通过管道送给cpio打包,-H指定备份时使用 的文件格式,newc指定cpio归档文件目录结构,把当前目录下每一个文件包括它的子目录整个映射路径统统给它按照原有路径格式进行保存,并且能够支持多余512200个文件, 默认情况下cpio归档支持的文件个数非常少,newc表示新规范的方式来进行归档,支持更多的文件数量,--quiet表示静默模式,不输出信息,-o表示创建归档文件,将结果通 过管道送给gzip,-9指定压缩级别,保存/root目录叫tiny.1.gz) [root@Smoke sysroot]# du -sh /mnt/sysroot/(查看整个目录及目录下所有文件总共大小,-h以K、M、G单位显示) 4.5M /mnt/sysroot/
测试:挂起宿主机,开启小Liunxu;
提示:登录信息,登录提示符都显示正常,但是文件系统坏掉;
修复文件系统:
[root@Smoke ~]# umount /mnt/sysroot/(卸载/mnt/sysroot目录挂载的文件系统) [root@Smoke ~]# mke2fs -j /dev/hda2(将/dev/hda2格式化为ext3文件系统) mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 125488 inodes, 500376 blocks 25018 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67633152 62 block groups 8192 blocks per group, 8192 fragments per group 2024 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409 Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@Smoke ~]# mount /dev/hda2 /mnt/sysroot/(挂载/dev/hda2到/mnt/sysroot目录) [root@Smoke ~]# cd /mnt/sysroot/ [root@Smoke sysroot]# zcat /root/tiny.1.gz | cpio -id(通过zcat不展开查看tiny.1.gz文件内容并通过管道送给cpio展开到当前目录) 8353 blocks 装载网卡驱动提供IP地址: [root@Smoke sysroot]# modinfo mii(查看mii模块信息) filename: /lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko license: GPL description: MII hardware support library author: Jeff Garzik <jgarzik@pobox.com> srcversion: 16DCEDEE4B5629C222C352D depends: vermagic: 2.6.18-308.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1 module_sig: 883f3504f23273dc995cc0b59af12111211c809f6f79961e4a84bc133b97d3d32bb217be64af3d1c09d11dbf04e53225fd698ce3de f9448666b2a5a31 [root@Smoke sysroot]# modinfo pcnet32(查看pcnet32模块的信息) filename: /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko license: GPL description: Driver for PCnet32 and PCnetPCI based ethercards author: Thomas Bogendoerfer srcversion: F81443556AAE169CBF80F55 alias: pci:v00001023d00002000sv*sd*bc02sc00i* alias: pci:v00001022d00002000sv*sd*bc*sc*i* alias: pci:v00001022d00002001sv*sd*bc*sc*i* depends: mii vermagic: 2.6.18-308.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1 parm: debug:pcnet32 debug level (int) parm: max_interrupt_work:pcnet32 maximum events handled per interrupt (int) parm: rx_copybreak:pcnet32 copy breakpoint for copy-only-tiny-frames (int) parm: tx_start_pt:pcnet32 transmit start point (0-3) (int) parm: pcnet32vlb:pcnet32 Vesa local bus (VLB) support (0/1) (int) parm: options:pcnet32 initial option setting(s) (0-15) (array of int) parm: full_duplex:pcnet32 full duplex setting(s) (1) (array of int) parm: homepna:pcnet32 mode for 79C978 cards (1 for HomePNA, 0 for Ethernet, default Ethernet (array of int) module_sig: 883f3504f2326fedc995cc0b59af121112c9240a0888050bfd72bf9d5ba34fa2b2d35ad9c599dc2b509f6fc0ce174c811a747cc92 92d8a4d837983e5b14 [root@Smoke sysroot]# cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko /mnt/sysroot/lib/modules/(复制mii.ko模块到/mnt/ sysroot/lib/modules目录) [root@Smoke sysroot]# cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/(复制pcnet32.ko模块 到/mnt/sysroot/lib/modules目录)[root@Smoke sysroot]# vim etc/rc.d/rc.sysinit(编辑rc.sysinit脚本) #!/bin/sh # echo -e "\tWelcome to \033[34mSmoke Tiny\033[0m Linux" echo "Set the hostname" [ -f /etc/hostname ] && . /etc/hostname [ -z "$HOSTNAME" -o "$HOSTNAME" == \'(none)\' ] && HOSTNAME=localhost hostname $HOSTNAME echo "mount proc and sys..." mount -t proc proc /porc mount -t sysfs sysfs /sys echo "Remount eht rootfs.." mount -t ext3 -o remount,rw /dev/hda2 / echo "Detect and export harward infomation..." mdev -s echo "Mount the other filesystem..." mount -a echo "Load ethernet card module..." insmod /lib/modules/mii.ko insmod /lib/modules/pcnet32.ko echo -e "Configuring loopback interface..." ifconfig lo0 127.0.0.1/24 ifconfig eth0 172.16.100.9/16
测试:挂起宿主机,启动小Linux系统;
提示:主机已经获取到设置到的IP地址;
更换内核版本:
[root@Smoke ~]# cd /usr/src/linux(切换到/usr/src/linux目录) [root@Smoke linux]# cp arch/x86/boot/bzImage /mnt/boot(复制bzImage到/mnt/boot目录) 提示:复制新内核到/mnt/boot目录; [root@Smoke linux]# cd /mnt/boot/(切换到/mnt/boot目录) [root@Smoke boot]# ls(查看当前目录文件及子目录) bzImage grub initrd.gz lost+found vmlinuz [root@Smoke boot]# rm vmlinuz(删除vmlinuz文件) rm: remove regular file `vmlinuz\'? y [root@Smoke boot]# vim grub/grub.conf(编辑grub.conf配置文件) deufalt=0 timeout=3 title Smoke Tiny Linux (2.6.38) root (hd0,0) kernel /bzImage ro root=/dev/hda2(更改内核文件为bzImage) initrd /initrd.gz [root@Smoke linux]# cd /usr/src/linux(切换到/usr/src/linux目录) [root@Smoke linux]# cp drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/pcnet32.ko(复制pcnet32.ko到/lib/modules目录) 提示:pcnet32.ko为编译的新内核网卡模块,不需要依赖mii.ko模块 [root@Smoke sysroot]# vim etc/rc.d/rc.sysinit(编译rc.sysinit文件) #!/bin/sh # echo -e "\tWelcome to \033[34mSmoke Tiny\033[0m Linux" echo "Set the hostname" [ -f /etc/hostname ] && . /etc/hostname [ -z "$HOSTNAME" -o "$HOSTNAME" == \'(none)\' ] && HOSTNAME=localhost hostname $HOSTNAME echo "mount proc and sys..." mount -t proc proc /porc mount -t sysfs sysfs /sys echo "Remount eht rootfs.." mount -t ext3 -o remount,rw /dev/hda2 / echo "Detect and export harward infomation..." mdev -s echo "Mount the other filesystem..." mount -a echo "Start syslog..." syslogd klogd echo "Load ethernet card module..." insmod /lib/modules/pcnet32.ko(删除mii.ko模块装载) echo -e "Configuring loopback interface..." ifconfig lo0 127.0.0.1/24 ifconfig eth0 172.16.100.9/16 [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入)
测试:挂起宿主机,切换到小Linux系统;
测试成功,内核版本为2.6.38.5-1;
Linux上的日志系统:
syslog
syslog-ng:ng(next generation)下一代,开源
日志系统:syslog(),统一各程序记录日志功能;
A:
B:
C:
syslog服务:
syslogd:系统,非内核产生的信息
klogd:内核,专门负载记录内核产生的日志信息
kernel --> 物理终端(/dev/console) --> /var/log/dmesg(系统启动时kernel显示的信息文件目录)
# dmesg(查看/var/log/dmesg信息)
# cat /var/log/dmesg
信息详细程序:日志级别
子系统:facility,设施
动作:
日志需要滚动(日志切割):以免日志文件过大导致日志信息分析不便;
messages messages.1 messages.2 messages.3
按时间切割
按大小切割
logrotate:日志切割,滚动、压缩、发送系统日志;
/sbin/init:系统控制权由内核转交给init之后,所产生日志信息由syslogd记录,因为它们都是非内核产生的,之前的由klogd记录,并把它放在/var/log/dmesg文件当中;
/var/log/messages: 系统标准错误日志信息;非内核产生引导信息;各子系统产生的信息;
/var/log/maillog: 邮件系统产生的日志信息;
/var/log/secure: 安全相关的日志信息,权限比较独特,不允许随便查看;
syslog:
syslogd:syslog日志服务
klogd:syslog日志服务
配置文件:/etc/syslog.conf(格式是每一行指定那个子系统所产生那些级别的日志记录到什么位置上)
配置文件定义格式为: facility(日志来源子系统).priority(日志级别) action(动作)
facility,可以理解为日志的来源或设备目前常用的facility有以下几种:
auth # 认证相关的
authpriv # 权限,授权相关的
cron # 任务计划相关的
daemon # 守护进程相关的
kern # 内核相关的
lpr # 打印相关的
mail # 邮件相关的
mark # 标记相关的
news # 新闻相关的
security # 安全相关的,与auth 类似
syslog # syslog自己的
user # 用户相关的
uucp # unix to unix 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及(mail子系统所产生的info级别,包括info级别以上所有级别,所有日志信息都记录到mail.log文件)
# info以上级别的信息记录到/var/log/mail.log文件中
auth.=info @10.0.0.1 # 表示将auth相关的,基本为info的信息记录到10.0.0.1主机上去(精确表示只记录info级别,比info级别高的、低的都不记录)
# 前提是10.0.0.1要能接收其他主机发来的日志信息
user.!=error # 表示记录user相关的,不包括error级别的信息(除了error以外的其他级别都记录,)
user.!error # 与user.error相反(只记录比error级别低的级别信息)
*.info # 表示记录所有的日志信息的info级别(所有子系统产生的info级别及info级别以上信息)
mail.* # 表示记录mail相关的所有级别的信息(mail子系统产生的所有级别信息)
*.* # 你懂的.
cron.info;mail.info # 多个日志来源可以用";" 隔开(cron和mail子系统,info级别及info级别以上的信息)
cron,mail.info # 与cron.info;mail.info 是一个意思(cron和mail子系统,info级别及info级别以上的信息)
mail.*;mail.!=info # 表示记录mail相关的所有级别的信息,但是不包括info级别的(mail子系统所有级别,但是不包含info级别所有信息)
[root@Smoke ~]# dmesg | more(查看系统启动时内核输出的信息,并分页显示) Linux version 2.6.18-308.el5 (mockbuild@x86-010.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50 )) #1 SMP Fri Jan 27 17:21:15 EST 2012 BIOS-provided physical RAM map: BIOS-e820: 0000000000010000 - 000000000009f400 (usable) BIOS-e820: 000000000009f400 - 00000000000a0000 (reserved) BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 000000003fef0000 (usable) BIOS-e820: 000000003fef0000 - 000000003feff000 (ACPI data) BIOS-e820: 000000003feff000 - 000000003ff00000 (ACPI NVS) BIOS-e820: 000000003ff00000 - 0000000040000000 (usable) BIOS-e820: 00000000f0000000 - 00000000f8000000 (reserved) BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved) BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved) 提示:这些过程都是在启动init程序之前所产生的信息; [root@Smoke ~]# cat /var/log/dmesg | tail(查看系统启动时内核输出的信息文件,只显示后10行) md: ... autorun DONE. device-mapper: multipath: version 1.0.6 loaded EXT3 FS on sda2, internal journal kjournald starting. Commit interval 5 seconds EXT3 FS on sda1, internal journal EXT3-fs: mounted filesystem with ordered data mode. SELinux: initialized (dev sda1, type ext3), uses xattr SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs Adding 1052248k swap on /dev/sda3. Priority:-1 extents:1 across:1052248k SELinux: initialized (dev binfmt_misc, type binfmt_misc), uses genfs_contexts [root@Smoke ~]# logrotate(日志切割) logrotate 3.7.4 - Copyright (C) 1995-2001 Red Hat, Inc. This may be freely redistributed under the terms of the GNU Public License Usage: logrotate [-dfv?] [-d|--debug] [-f|--force] [-m|--mail command] [-s|--state statefile] [-v|--verbose] [-?|--help] [--usage] [OPTION...] <configfile> [root@Smoke ~]# man logrotate(查看logrotate日志滚动命令man帮助文档) [root@Smoke ~]# ls /etc/cron.daily/(查看/etc/cron.daily任务计划目录) 0anacron 0logwatch cups logrotate makewhatis.cron mlocate.cron prelink rhsmd rpm tmpwatch 提示:logrotate日志切割文件脚本, [root@Smoke ~]# vim /etc/cron.daily/logrotate(编辑logrotate日志切割文件) #!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0 提示:这个脚本每隔一天都会完成一次日志滚动; [root@Smoke ~]# vim /etc/logrotate.conf(查看logrotate.conf日志滚动配置文件) # see "man logrotate" for details # rotate log files weekly weekly(每周滚动一次) # keep 4 weeks worth of backlogs rotate 4(保存4个版本,超出的版本都会被删除) # create new (empty) log files after rotating old ones create(创建新的日志文件) # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d(包含/etc/logrotate.d文件) # no packages own wtmp -- we\'ll rotate them here /var/log/wtmp { (指定日志文件目录) monthly (自定义按月滚动,如果不定义按全局weekly每周滚动) minsize 1M (最小1M) create 0664 root utmp(创建新的文件,0664权限,root属主,utmp日志文件名字) rotate 1(保留1个历史版本) } /var/log/btmp { missingok monthly minsize 1M create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here. 提示:如果自己要手动管理某个日志滚动方式,可以在这个脚不能中定义添加,或者在/etc/logrotate.d目录创建一个文件; [root@Smoke ~]# cd /etc/logrotate.d/(切换到/etc/logrotate.d目录) [root@Smoke logrotate.d]# ls(查看当前目录文件及子目录) acpid cups mgetty psacct setroubleshoot syslog wpa_supplicant conman iscsiuiolog ppp rpm subscription-manager up2date yum 提示:这里面的文件专门定义每一个子系统日志滚动机制的, [root@Smoke logrotate.d]# cat cups(查看cups文件内容) /var/log/cups/*_log { missingok notifempty(如果空要通知) sharedscripts(共享脚本) } [root@Smoke logrotate.d]# ll /var/log/secure(查看/var/log/secure文件详细信息) -rw------- 1 root root 2770 Dec 7 23:02 /var/log/secure 提示:/var/log/secure跟安全相关的日志信息,权限比较独特600,其他用户不允许查看,任何用户在登录的时候产生的登录信息,登录名,试图输入的密码是否输错, 尝试登录过几次都会有记录; [root@Smoke logrotate.d]# tail /var/log/secure(查看/var/log/secure文件后10行) Dec 7 21:43:13 Smoke sshd[12006]: Accepted password for root from 172.16.100.254 port 7064 ssh2 Dec 7 21:43:13 Smoke sshd[12006]: pam_unix(sshd:session): session opened for user root by (uid=0) Dec 7 22:08:08 Smoke sshd[12365]: Accepted password for root from 172.16.100.254 port 7891 ssh2 Dec 7 22:08:08 Smoke sshd[12365]: pam_unix(sshd:session): session opened for user root by (uid=0) Dec 7 22:30:07 Smoke sshd[12671]: Accepted password for root from 172.16.100.254 port 4336 ssh2 Dec 7 22:30:07 Smoke sshd[12671]: pam_unix(sshd:session): session opened for user root by (uid=0) Dec 7 22:54:59 Smoke sshd[12912]: Accepted password for root from 172.16.100.254 port 5034 ssh2 Dec 7 22:54:59 Smoke sshd[12912]: pam_unix(sshd:session): session opened for user root by (uid=0) Dec 7 22:57:33 Smoke sshd[10882]: pam_unix(sshd:session): session closed for user root Dec 7 23:02:09 Smoke sshd[11007]: pam_unix(sshd:session): session closed for user root [root@Smoke ~]# chkconfig --list syslog(查看syslog服务在不同系统级别下启动情况) syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@Smoke ~]# service syslog status(查看syslog服务状态) syslogd (pid 3100) is running... klogd (pid 3103) is running... [root@Smoke ~]# cat /etc/syslog.conf(查看syslog.conf配置文件) # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don\'t log private authentication messages! *.info;mail.none;authpriv.none;cron.none(所有子系统info级别及以上级别,但是不包括mail.none、authpriv.none、cron.none) /var/log/messages # The authpriv file has restricted access. authpriv.*(跟authpriv子系统用户授权相关的所有级别) /var/log/secure # Log all the mail messages in one place. mail.*(mail子系统所有级别) -/var/log/maillog(-横线表示异步写入,不会立即写到磁 盘上去,而是先保存到内存,过会在到磁盘同步) # Log cron stuff cron.*(cron子系统所有级别) /var/log/cron # Everybody gets emergency messages *.emerg(所有子系统emerg系统不可用级别及以上级别) *(所有登录用户) # Save news errors of level crit and higher in a special file. uucp,news.crit(uucp和news子系统crit级别及以上级别) /var/log/spooler # Save boot messages also to boot.log local7.*(用户自定义,跟引导相关所有级别) /var/log/boot.log [root@Smoke ~]# cat /var/log/boot.log(查看boot.log文件内容) [root@Smoke ~]# vim /etc/syslog.conf(编辑syslog.conf文件) # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don\'t log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.info /var/log/cron(将cron子系统所有级别更改为info级别及以上级别) # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log 提示:更改syslog.conf文件不会立即生效; [root@Smoke ~]# service syslog restart(重启日志服务) Shutting down kernel logger: [ OK ] Shutting down system logger: [ OK ] Starting system logger: [ OK ] Starting kernel logger: [ OK ] 提示:重启日志服务,如果有其他日志系统正在syslog发日志信息,这时候syslog会收不到,所以一般不建议重启; [root@Smoke ~]# service syslog reload(重新加载syslog服务配置文件) Reloading syslogd... [ OK ] Reloading klogd... [ OK ] 提示:重新读取syslog服务配置文件,向syslog进程发送1:HUP信号,大多数服务都有reload; [root@Smoke ~]# vim /etc/rc.d/init.d/syslog(编辑syslog脚本) #!/bin/bash # # syslog Starts syslogd/klogd. # # # chkconfig: 2345 12 88 # description: Syslog is the facility by which many daemons use to log \ # messages to various system log files. It is a good idea to always \ # run syslog. ### BEGIN INIT INFO # Provides: $syslog ### END INIT INFO # Source function library. . /etc/init.d/functions(读取functions脚本) RETVAL=0 start() { [ -x /sbin/syslogd ] || exit 5 [ -x /sbin/klogd ] || exit 5 # Source config if [ -f /etc/sysconfig/syslog ] ; then . /etc/sysconfig/syslog(读取/etc//sysconfig/syslog配置文件) else SYSLOGD_OPTIONS="-m 0" KLOGD_OPTIONS="-2" fi if [ -z "$SYSLOG_UMASK" ] ; then SYSLOG_UMASK=077; fi umask $SYSLOG_UMASK echo -n $"Starting system logger: " daemon syslogd $SYSLOGD_OPTIONS RETVAL=$? echo echo -n $"Starting kernel logger: " daemon klogd $KLOGD_OPTIONS echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog return $RETVAL } stop() { echo -n $"Shutting down kernel logger: " killproc klogd echo echo -n $"Shutting down system logger: " killproc syslogd RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/syslog return $RETVAL } rhstatus() { status syslogd status klogd } restart() { stop start } reload() { RETVAL=1 syslog=`cat /var/run/syslogd.pid 2>/dev/null` echo -n "Reloading syslogd..." if [ -n "${syslog}" ] && [ -e /proc/"${syslog}" ]; then kill -HUP "$syslog"; RETVAL=$? fi if [ $RETVAL -ne 0 ]; then failure else success fi echo RETVAL=1 echo -n "Reloading klogd..." klog=`cat /var/run/klogd.pid 2>/dev/null` if [ -n "${klog}" ] && [ -e /proc/"${klog}" ]; then kill -USR2 "$klog"; RETVAL=$? fi if [ $RETVAL -ne 0 ]; then failure else success fi echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; status) rhstatus ;; restart) restart ;; reload) reload ;; condrestart) [ -f /var/lock/subsys/syslog ] && restart || : ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart}" exit 2 esac exit $? 提示:syslog脚本用于service调用; [root@Smoke ~]# vim /etc/sysconfig/syslog(编辑syslog文件) # Options to syslogd # -m 0 disables \'MARK\' messages.(关闭mark子系统信息) # -r enables logging from remote machines(开启接收来自其他主机日志) # -x disables DNS lookups on messages recieved with -r # See syslogd(8) for more details SYSLOGD_OPTIONS="-r -m 0"(-r开启接收来自其他主机日志,-m 0关闭MARK标记信息) # Options to klogd # -2 prints all kernel oops messages twice; once for klogd to decode, and # once for processing with \'ksymoops\' # -x disables all klogd processing of oops messages entirely # See klogd(8) for more details KLOGD_OPTIONS="-x" # SYSLOG_UMASK=077 # set this to a umask value to use for all log files as in umask(1). # By default, all permissions are removed for "group" and "other". 提示:更改/etc/sysconfig/syslog文件,需要重启syslog服务; [root@Smoke ~]# service syslog restart(重启日志服务) Shutting down kernel logger: [ OK ] Shutting down system logger: [ OK ] Starting system logger: [ OK ] Starting kernel logger: [ OK ] 将日志信息发送给网络上其他主机: [root@Smoke ~]# vim /etc/syslog.conf(编辑syslog.conf配置文件) # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don\'t log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* @172.16.100.1(将mail子系统所有日志信息发送到网络上172.16.100.1主机) # Log cron stuff cron.info /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log [root@Smoke ~]# cd busybox-1.20.2(切换到busybox-1.20.2目录) [root@Smoke busybox-1.20.2]# cd _install/(切换到_install目录) [root@Smoke _install]# ls(查看当前目录文件及子目录) bin linuxrc sbin usr [root@Smoke _install]# ls bin/(查看bin目录文件及子目录) addgroup chmod deluser fdflush ionice kill mkdir netstat pwd setarch touch adduser chown df fgrep iostat linux32 mknod nice reformime setserial true ash conspy dmesg fsync ip linux64 mktemp pidof rev sh umount base64 cp dnsdomainname getopt ipaddr ln more ping rm sleep uname busybox cpio dumpkmap grep ipcalc login mount ping6 rmdir stat usleep cat cttyhack echo gunzip iplink ls mountpoint pipe_progress rpm stty vi catv date ed gzip iproute lsattr mpstat powertop run-parts su watch chattr dd egrep hostname iprule lzop mt printenv scriptreplay sync zcat chgrp delgroup false hush iptunnel makemime mv ps sed tar [root@Smoke _install]# ls sbin/(查看sbin目录文件及子目录) acpid devmem getty ifup lsmod mkfs.minix poweroff slattach syslogd adjtimex fbsplash halt init makedevs mkfs.vfat raidautorun start-stop-daemon tunctl arp fdisk hdparm insmod man mkswap reboot sulogin udhcpc blkid findfs hwclock klogd mdev modinfo rmmod swapoff vconfig blockdev freeramdisk ifconfig loadkmap mkdosfs modprobe route swapon watchdog bootchartd fsck ifdown logread mke2fs nameif runlevel switch_root zcip depmod fsck.minix ifenslave losetup mkfs.ext2 pivot_root setconsole sysctl 提示:busy的sbin目录也有klogd和syslogd服务,因此busybox制作的小Linux系统也可以记录日志,只需要给它提供配置文件/etc/syslog.conf,定义有那些facility (子系统)产生那些级别的日志信息,用于记录什么日志即可; 小Linux系统提供日志记录功能: [root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录) 启动syslogd和klogd服务: [root@Smoke sysroot]# vim etc/rc.d/rc.sysinit(编辑系统初始化脚本) #!/bin/sh # echo -e "\tWelcome to \033[34mSmoke Tiny\033[0m Linux" echo "Set the hostname" [ -f /etc/hostname ] && . /etc/hostname [ -z "$HOSTNAME" -o "$HOSTNAME" == \'(none)\' ] && HOSTNAME=localhost hostname $HOSTNAME echo "mount proc and sys..." mount -t proc proc /porc mount -t sysfs sysfs /sys echo "Remount eht rootfs.." mount -t ext3 -o remount,rw /dev/hda2 / echo "Detect and export harward infomation..." mdev -s echo "Mount the other filesystem..." mount -a echo "Start syslog..." syslogd(启动日志服务功能) klogd(启动日志服务功能) echo "Load ethernet card module..." insmod /lib/modules/mii.ko insmod /lib/modules/pcnet32.ko echo -e "Configuring loopback interface..." ifconfig lo0 127.0.0.1/24 ifconfig eth0 172.16.100.9/16 提供配置文件: [root@Smoke sysroot]# vim etc/syslog.conf(编辑syslog.conf配置文件) *.info /var/log/messages(所有子系统的info级别及以上级别信息记录到/var/log/messages文件) [root@Smoke sysroot]# ls var/(查看var目录文件及子目录) lock log run 提示:提供/var/log目录; [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入)
测试:挂起宿主机,启动小Linux系统,日志服务已经启动
提示:应该把登录写入到/var/log/secure文件,这样比较安全;
更改日志格式:
[root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录) [root@Smoke sysroot]# vim etc/syslog.conf(编辑etc/syslog.conf文件) *.info;auth.none /var/log/messages(除过auth子系统以外其他子系统info级别或以上级别信息记录到/var/log/messages文件) auth.* /var/log/secure(auth子系统所有信息记录到/var/log/secure文件) [root@Smoke sysroot]# touch var/log/secure(创建secure文件) [root@Smoke sysroot]# chmod 600 var/log/secure(给secure文件权限改为600) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入)
telnet: 远程登录协议, 23/tcp
C/S
S:telnet服务器
C:telnet客户端
ssh: Secure SHell, 应用层协议,22/tcp
通信过程及认证过程是加密的,主机认证
用户认证过程加密
数据传输过程加密
ssh v1, v2
man-in-middle:中间人攻击
sshv2
认证过程:
基于口令认证:
基于密钥认证:
协议:规范
实现:服务器端、客户端
Linux: openSSH
C/S
服务器端:sshd, 配置文件/etc/ssh/sshd_config
客户端:ssh, 配置文件/etc/ssh/ssh_config
ssh-keygen: 密钥生成器
ssh-copy-id: 将公钥传输至远程服务器
scp:跨主机安全复制工具
ssh: 远程连接
ssh USERNAME@HOST:USERNAME代表用户名,HOST服务器ip地址;
ssh -l USERNAME HOST:-l指定用户和服务器ip地址;
ssh USERNAME@HOST \'COMMAND\':不登陆远程主机执行远程主机命令,可不带单引号;
scp: 远程复制,和cp命令使用方法一样;
scp SRC DEST:SRC指定源,复制那些文件,源可以有多个,如果有多个源,DEST目标必须是目录;
-r:复制目录,递归复制;
-a,-dR,--preserve=all:归档复制,常用于备份,保留文件原来所有的属性,比-p选项保留的
scp USERNAME@HOST:/path/to/somefile /path/to/local:复制远程主机文件到本地主机;
scp /path/to/local USERNAME@HOST:/path/to/somewhere:复制本地主机文件到远程主机;
ssh-keygen:生成密钥
-t rsa:指定加密方法,有rsa、dsa两种,最常用rsa;
~/.ssh/id_rsa:私钥保存当前用户家目录.ssh目录下叫id_rsa;
~/.ssh/id_rsa.pub:公钥保存在当前用户家目录.shh目录下叫rsa.pub;
-f /path/to/KEY_FILE:指定文件的文件名;
-P \'\': 大写P,指定加密私钥的密码,\'\'表示空密码,如果要使用密码可以在\'\'中加入使用的密码字符串;
公钥"追加保存"到远程主机某用户的家目录下的.ssh/authorized_keys文件或.ssh/authorized_keys2文件中,一定要追加保存,不能覆盖,因为可能这个文件还保存其他主机的公钥;
ssh-copy-id:专门用于复制密钥到远程主机,而且会自动保存到当前用户的家目录下.ssh目录,.ssh不存在,还会自动创建,而且还会自动追加到authorized_keys文件里面;
-i ~/.ssh/id_rsa.pub:-i指定复制的文件;
ssh-copy-id -i ~/.ssh/id_rsa.pub USERNAME@HOST
要移植ssh到小linux系统太麻烦,因为ssh太重量级,它实现的功能非常多,要想实现在小Linux支持远程登录,可以直接编译dropbear,因为它很小,不会占用多大空间,编译完成之后,先安装到宿主机,再把它移植到目标主机(小Linux系统);
dropbear: 嵌入式系统专用的ssh服务器端和客户端工具
服务器端:dropbear
dropbearkey:密钥生成工具,不是生成客户端登录远程其他主机的密钥,是服务器端用的,主要为服务器端实现主机认证生成密钥;
客户端:dbclient
dropbear默认使用nsswitch实现名称解析
/etc/nsswitch.conf:nsswitch配置文件;
/lib/libnss_files*:库文件
/usr/lib/libnss3.so:库文件
/usr/lib/libnss_files*:库文件
dropbear会在用户登录检查其默认shell是否当前系统的安全shell
/etc/shells:写在/etc/shells文件中的shell为当前系统的安全shell;
dropbearkey主机密钥默认位置:
/etc/dropbear/
RSA: dropbear_rsa_host_key(文件名,需要使用默认名字,不然需要手动指定)
长度可变, 只要是8的整数倍,默认为1024
DSS: dropbear_dss_host_key(文件名,需要使用默认名字,不然需要手动指定)
长度固定,默认为1024
dropbearkey
-t rsa|dss:密钥类型;
-f /path/to/KEY_FILE:指定文件存放位置;
-s SIZE:指定RSA类型密钥长度;
准备两台linux主机,一台作为服务器端,一台作为客户端:
[root@server ~]# ifconfig eth0(查看eth0网卡信息) eth0 Link encap:Ethernet HWaddr 00:0C:29:8C:BF:0A inet addr:172.16.100.2 Bcast:172.16.100.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe8c:bf0a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:157 errors:0 dropped:0 overruns:0 frame:0 TX packets:247 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:13961 (13.6 KiB) TX bytes:32846 (32.0 KiB) Interrupt:67 Base address:0x2000 提示:查看服务器端ip地址; [root@client ~]# ssh 172.16.100.2 The authenticity of host \'172.16.100.2 (172.16.100.2)\' can\'t be established. RSA key fingerprint is 42:e9:a1:a0:c1:7f:bd:02:4b:4a:eb:54:17:4b:80:1b.(服务器端给客户端传输的主机认证公钥) Are you sure you want to continue connecting (yes/no)? yes(接收对方的密钥) Warning: Permanently added \'172.16.100.2\' (RSA) to the list of known hosts. root@172.16.100.2\'s password: (输入root用户密码) 提示:通过客户端登录使用ssh登录服务端,在客户端远程登录如果没有指定用户,它使用登录当前主机用户作为登录远程服务器时候所要用到的用户名; [root@server ~]# ifconfig eth0(查看eth0接口ip地址) eth0 Link encap:Ethernet HWaddr 00:0C:29:8C:BF:0A inet addr:172.16.100.2 Bcast:172.16.100.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe8c:bf0a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:379 errors:0 dropped:0 overruns:0 frame:0 TX packets:439 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:36760 (35.8 KiB) TX bytes:57778 (56.4 KiB) Interrupt:67 Base address:0x2000 [root@server ~]# useradd hadoop(添加hadoop用户) [root@server ~]# passwd hadoop(给hadoop用户添加密码) Changing password for user hadoop. New UNIX password: BAD PASSWORD: it is based on a dictionary word Retype new UNIX password: passwd: all authentication tokens updated successfully. [root@server ~]# ssh hadoop@172.16.100.2(使用hadoop用户登录172.16.100.2主机) hadoop@172.16.100.2\'s password:(输入hadoop用户密码) Last login: Tue Nov 11 00:34:15 2014 from 172.16.100.2 提示:使用hadoop用户登录没有提示接收密钥,因为这是主机密钥,主机密钥会放到一个公共位置,无论是不是同一个用户登录,都不再需要主机密钥; [root@server ~]# ls -a(查看root家目录所有文件) . anaconda-ks.cfg .bash_logout .bashrc .gconf install.log .ssh .viminfo .. .bash_history .bash_profile .cshrc .gconfd install.log.syslog .tcshrc .Xauthority 提示:这个主机密钥在第一次登录用户的家目录下叫.ssh隐藏目录下; [root@server ~]# cd .ssh/(切换到.shh目录) [root@server .ssh]# ls(查看当前目录文件及子目录) known_hosts 提示:每次接收到的密钥会保存到known_hosts文件里面; [root@server .ssh]# cat known_hosts(查看known_hosts文件内容) 172.16.100.2 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4kVx/Ik+SEEFo2ByNj4SiEmZjUtNN1W5Hbx6wmCiH1tiYX48TZAE8haQCnLDFIQrJ75S/JPhr6ZaB xd+S/u0M1deAHH9vsA4D86ucLHdZDD++RgU5p6AHOXR5WX8Qj6RYG33XF/T+FkRb5agQNohdx+5R0/LCEMhZijazKOBUogy7dF47ZsrmotoLb7wxQ2+WAZHHuWJ72l UJXIRJ4+B8fXF7Xz11f8idafiGP7E0t6W3hzf+Sg0mZtMDlDuc7bXgYCIn45j6Rqe3ldGOZs4K3YyPuGAyE1/4iejUtVukL6atsX+2nPF9V8dBMMGN3MDh9v8KuSSJ v2GYFtYDM58WQ== [root@server ~]# ssh -l hadoop 172.16.100.2(使用hadoop用户登录172.16.100.2主机) hadoop@172.16.100.2\'s password: Last login: Tue Nov 11 00:34:57 2014 from 172.16.100.2 [root@server ~]# ssh hadoop@172.16.100.2 \'ls -a ~\'(不登录172.16.100.2主机,在主机上使用hadoop用户执行ls -a ~命令) hadoop@172.16.100.2\'s password: . .. .bash_history .bash_logout .bash_profile .bashrc .emacs .mozilla [root@server ~]# ssh -l root 172.16.100.2 \'ifconfig eth0\'(不登陆172.16.100.2主机,在主机上使用root用户执行ifconfig eth0命令) root@172.16.100.2\'s password: eth0 Link encap:Ethernet HWaddr 00:0C:29:8C:BF:0A inet addr:172.16.100.2 Bcast:172.16.100.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe8c:bf0a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2091 errors:0 dropped:0 overruns:0 frame:0 TX packets:1441 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:189652 (185.2 KiB) TX bytes:179406 (175.2 KiB) Interrupt:67 Base address:0x2000 [root@client ~]# scp busybox-1.20.2.tar.bz2 hadoop@172.16.100.2:~(复制本地文件busybox到远程主机,以hadoop用户登录的家目录) hadoop@172.16.100.2\'s password: busybox-1.20.2.tar.bz2 100% 2135KB 2.1MB/s 00:00 [root@server ~]# su - hadoop(切换到hadoop用户) [hadoop@server ~]$ ls(查看当前目录文件及子目录) busybox-1.20.2.tar.bz2 提示:复制过来的busybox文件; [root@client ~]# scp root@172.16.100.2:/etc/fstab ./(以root用户远程复制172.16.100.2主机上/etc/fstab文件到本地当前目录) root@172.16.100.2\'s password: fstab 100% 532 0.5KB/s 00:00 [root@client ~]# cat fstab(查看fatab文件内容) LABEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL=SWAP-sda3 swap swap defaults 0 0 假设期望client端root用户登录server端root时不再基于口令登录(基于密钥认证): [root@client ~]# ssh-keygen -t rsa(生成一堆密钥) Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): (默认保存到当前用户家目录下的.ssh目录较id_rsa文件) Enter passphrase (empty for no passphrase): (输入密码,私钥不能被其他人随意访问,输入密码会把私钥加密存放,加密存放每次登录都要输入密码,输 入密码不再是登录远程主机密码,而是方式私钥密码,这里我们不对私钥加密) Enter same passphrase again: (确认再次输入密码) Your identification has been saved in /root/.ssh/id_rsa.(私钥文件) Your public key has been saved in /root/.ssh/id_rsa.pub.(公钥文件) The key fingerprint is: f2:8a:70:67:aa:03:2b:f8:d4:e2:42:24:4f:85:4f:b8 root@client [root@client ~]# ls .ssh/(查看.ssh目录下的文件及子目录) id_rsa id_rsa.pub known_hosts 提示:id_rsa生成的私钥文件,id_rsa.pub生成的公钥文件; [root@client ~]# scp .ssh/id_rsa.pub root@172.16.100.2:/root(复制.ssh目录下的id_rsa.pub文件到远程主机root用户的家目录) root@172.16.100.2\'s password: id_rsa.pub 100% 393 0.4KB/s 00:00 [root@client ~]# ssh root@172.16.100.2(登录到远程主机) root@172.16.100.2\'s password: Last login: Tue Nov 11 01:30:19 2014 from 172.16.100.254 [root@server ~]# [root@server ~]# ls(查看当前目录文件及子目录) anaconda-ks.cfg id_rsa.pub install.log install.log.syslog 提示:复制过来的公钥id_rsa.pub文件; [root@server ~]# mkdir .ssh(创建.ssh目录) 提示:这个目录权限是700的; [root@server ~]# chmod 700 .ssh/(更改.ssh目录权限为700) [root@server ~]# cat id_rsa.pub >> .ssh/authorized_keys(查看id_rsa.pub文件内容,并通过管道追加到.ssh目录下叫authorized_keys文件) 提示:公钥追加保存到远程主机某用户的家目录下的.ssh/authorized_keys文件或.ssh/authorized_keys2文件中; [root@server ~]# cat .ssh/authorized_keys(查看.ssh/authorized_keys文件内容) ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwFk7Tg4qw5s6xKX6A51VESRdHvJ04TEGyUgN4BiFic50nB+YqaxOY7ICYW9fCv0pZQxn6sJZxMrBxM5zqH00unl8o 8AjaJADAmSwTTahG442hE2d5ytb+WVO/VgGHZiDWCKeHnIpBUhzKW4qqNynJMuquqaf4yDSXLynbPrMW6QZxMTleFqWy043qI1Yusnz7W73eKl9w9m9C2hr/pHlRA fInTY0JoHlPhxPkumuh19So3KxWEpGmrTFFb/EOzn+CNtAzZRPMTadoTuQX6IlX6LUzm6MaPFM3fuFYMVaL321HkOEgTvqJcBF4wJc6Pg23CTf1a9s3atqx+MgxI E6EQ== root@client [root@server ~]# exit(退出登录) [root@client ~]# ssh root@172.16.100.2(使用root用户登录172.16.100.2主机) Last login: Tue Nov 11 01:54:21 2014 from 172.16.100.1 [root@server ~]# 提示:不用输入密码就登录远程主机; [root@client ~]# exit(退出登录) [root@client ~]# ssh root@172.16.100.2(使用root用户登录172.16.100.2主机) Last login: Tue Nov 11 01:56:05 2014 from 172.16.100.1 [root@server ~]# 其他复制公钥方式: [root@server ~]# cd .ssh/(切换到.ssh目录) [root@server .ssh]# ls(查看当前目录文件及子目录) authorized_keys known_hosts [root@server ~]# rm -rf .ssh/(删除.ssh目录,强制删除,递归删除) 提示:删除authorized_keys或.ssh目录; [root@server ~]# exit(退出登录) [root@client ~]# ssh root@172.16.100.2(通过root用户登录远程主机) root@172.16.100.2\'s password: Last login: Tue Nov 11 01:57:26 2014 from 172.16.100.1 [root@server ~]# 提示:删除远程主机的公钥文件后,又重新主要输入密码认证; [root@server ~]# exit(退出登录) [root@client ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.100.2(复制公钥文件到远程主机root用户家目录下.ssh目录叫authorized_keys) 15 root@172.16.100.2\'s password: Now try logging into the machine, with "ssh \'root@172.16.100.2\'", and check in: .ssh/authorized_keys(公钥文件存放目录) to make sure we haven\'t added extra keys that you weren\'t expecting. 提示:ssh-copy-id:专门用于复制密钥到远程主机,而且会自动保存到当前用户的家目录下.ssh目录,.ssh不存在,还会自动创建,而且还会自动追加到authorized_keys 文件里面; [root@client ~]# ssh root@172.16.100.2(使用root用户登录远程主机) Last login: Tue Nov 11 02:00:40 2014 from 172.16.100.1 [root@server ~]# 提示:不需要输入密码; [root@server ~]# exit(退出登录) [root@server ~]# ssh root@172.16.100.1(使用root用户登录远程主机) The authenticity of host \'172.16.100.1 (172.16.100.1)\' can\'t be established. RSA key fingerprint is ea:32:fd:b5:e6:d2:75:e2:c2:c2:8c:63:d4:82:4c:48. Are you sure you want to continue connecting (yes/no)? yes(主机认证) Warning: Permanently added \'172.16.100.1\' (RSA) to the list of known hosts. root@172.16.100.1\'s password: Last login: Mon Dec 8 04:10:21 2014 from 172.16.100.254 提示:反过来通过公钥远程连接私钥的ssh服务器,不能直接登录,因为一定是本地用户使用私钥,远程使用公钥,由此这个过程是单向的,如果要双向都不需要使用密码, 需要来两遍; [root@server ~]# ssh-keygen -t rsa -f .ssh/id_rsa -P \'\'(生成密钥,-t加密方式rsa,-f指定密钥文件名称,-P指定密码为空) Generating public/private rsa key pair. Your identification has been saved in .ssh/id_rsa. Your public key has been saved in .ssh/id_rsa.pub. The key fingerprint is: eb:7b:71:43:24:9e:15:ef:aa:5b:69:5c:eb:93:43:ba root@server 提示:-f指定密钥文件名称,私钥名称为id_rsa,公钥为在id_rsa后面加.pub(id_rsa.pub) [root@server ~]# ls -a .ssh/(查看.ssh目录文件及子目录) . .. authorized_keys id_rsa id_rsa.pub known_hosts 提示:生成的私钥id_rsa文件,公钥id_rsa.pub文件; [root@server ~]# ssh-copy-id root@172.16.100.1(复制公钥文件到远程主机root用户家目录下.ssh目录) root@172.16.100.1\'s password: Now try logging into the machine, with "ssh \'root@172.16.100.1\'", and check in: .ssh/authorized_keys(公钥文件存放目录) to make sure we haven\'t added extra keys that you weren\'t expecting. [root@server ~]# ssh root@172.16.100.1(使用root用户登录远程主机) Last login: Mon Dec 8 04:26:59 2014 from 172.16.100.2 [root@client ~]# 提示:不需要输入密码,直接登录; [root@client ~]# netstat -tnl(查看网路服务状态,-t代表tcp,-n以数字方式显示,-l监听状态) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:859 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6014 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 ::1:6010 :::* LISTEN tcp 0 0 ::1:6014 :::* LISTEN 提示:ssh工作在tcp的22号端口,0.0.0.0:22代表每 一个地址都监听; 让小Linux系统支持SSH服务远程登录: [root@Smoke ~]# cd /etc/ssh/(切换到/etc/ssh目录) [root@Smoke ssh]# ls(查看当前目录文件及子目录) moduli sshd_config(服务器端配置文件) ssh_host_dsa_key.pub ssh_host_key.pub ssh_host_rsa_key.pub ssh_config(客户端配置文件) ssh_host_dsa_key ssh_host_key ssh_host_rsa_key 提示:ssh_host_dsa_key、ssh_host_dsa_key.pub、ssh_host_key、ssh_host_key.pub、ssh_host_rsa_key、ssh_host_rsa_key.pub三对密钥,这 些都是主机密钥,这些也可以使用ssh-keygen生成的; [root@Smoke ~]# tty(显示用户登录终端伪终端) /dev/pts/0 [root@Smoke ~]# cat /etc/fstab(查看/etc/fstab文件) LABEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts(伪文件系统) /dev/pts devpts(文件类型) gid=5,mode=620(创建文件的时候默认权限为620) 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL=SWAP-sda3 swap swap defaults 0 0 下载dropbear源码包: [root@Smoke ~]# lftp 172.16.0.1(连接ftp服务器172.16.0.1) lftp 172.16.0.1:~> cd pub/Sources/Busybox/ lftp 172.16.0.1:/pub/Sources/Busybox> get dropbear-2013.56.tar.bz2(下载dropbear源码包) 1578454 bytes transferred lftp 172.16.0.1:/pub/Sources/Busybox> bye(退出) [root@Smoke ~]# ls dropbear-2013.56.tar.bz2(查看下载的dropbear) dropbear-2013.56.tar.bz2 编译安装dropbear: 确保系统安装开发编译环境Development Libraries(开发库)、Development Tools(开发工具)包组; [root@Smoke ~]# tar xf dropbear-2013.56.tar.bz2(解压展开dropbear文件) [root@Smoke ~]# cd dropbear-2013.56(切换到dropbear目录) [root@Smoke dropbear-2013.56]# ls(查看当前目录文件及子目录) agentfwd.h cli-chansession.c dbmulti.c kex.h queue.h svr-authpam.c algo.h cli-kex.c dbutil.c keyimport.c random.c svr-authpasswd.c atomicio.c cli-main.c dbutil.h keyimport.h random.h svr-authpubkey.c atomicio.h cli-runopts.c debian libtomcrypt README svr-authpubkeyoptions.c auth.h cli-service.c debug.h libtommath rsa.c svr-chansession.c bignum.c cli-session.c dropbear.8 LICENSE rsa.h svr-kex.c bignum.h cli-tcpfwd.c dropbearconvert.c list.c runopts.h svr-main.c buffer.c common-algo.c dropbearkey.8 listener.c scp.c svr-runopts.c buffer.h common-channel.c dropbearkey.c listener.h scpmisc.c svr-service.c CHANGES common-chansession.c dss.c list.h scpmisc.h svr-session.c channel.h common-kex.c dss.h loginrec.c service.h svr-tcpfwd.c chansession.h common-runopts.c fake-rfc2553.c loginrec.h session.h svr-x11fwd.c circbuffer.c common-session.c fake-rfc2553.h Makefile.in signkey.c sysoptions.h circbuffer.h compat.c filelist.txt MULTI signkey.h tcp-accept.c cli-agentfwd.c compat.h gendss.c options.h SMALL tcpfwd.h cli-algo.c config.guess gendss.h packet.c ssh.h termcodes.c cli-auth.c config.h.in genrsa.c packet.h sshpty.c termcodes.h cli-authinteract.c config.sub genrsa.h process-packet.c sshpty.h TODO cli-authpasswd.c configure includes.h progressmeter.c svr-agentfwd.c x11fwd.h cli-authpubkey.c configure.in INSTALL progressmeter.h svr-algo.c cli-channel.c dbclient.1 install-sh queue.c svr-auth.c [root@Smoke dropbear-2013.56]# ./configure(配置dropbear) 提示:使用默认的选项进行configure,他不会编译scp(远程复制命令)客户端; [root@Smoke dropbear-2013.56]# make(编译) [root@Smoke dropbear-2013.56]# ./configure --help | less(查看configure的man帮助文档,并分页显示) [root@Smoke dropbear-2013.56]# ls(查看当前目录文件及子目录) agentfwd.h cli-chansession.c config.log genrsa.c progressmeter.h svr-authpam.o algo.h cli-chansession.o config.status genrsa.h queue.c svr-authpasswd.c atomicio.c cli-kex.c config.sub genrsa.o queue.h svr-authpasswd.o atomicio.h cli-kex.o configure includes.h queue.o svr-authpubkey.c atomicio.o cli-main.c configure.in INSTALL random.c svr-authpubkey.o auth.h cli-main.o dbclient install-sh random.h svr-authpubkeyoptions.c bignum.c cli-runopts.c dbclient.1 kex.h random.o svr-authpubkeyoptions.o bignum.h cli-runopts.o dbmulti.c keyimport.c README svr-chansession.c bignum.o cli-service.c dbutil.c keyimport.h rsa.c svr-chansession.o buffer.c cli-service.o dbutil.h keyimport.o rsa.h svr-kex.c buffer.h cli-session.c dbutil.o libtomcrypt rsa.o svr-kex.o buffer.o cli-session.o debian libtommath runopts.h svr-main.c CHANGES cli-tcpfwd.c debug.h LICENSE scp.c svr-main.o channel.h cli-tcpfwd.o dropbear list.c scpmisc.c svr-runopts.c chansession.h common-algo.c dropbear.8 listener.c scpmisc.h svr-runopts.o circbuffer.c common-algo.o dropbearconvert listener.h service.h svr-service.c circbuffer.h common-channel.c dropbearconvert.c listener.o session.h svr-service.o circbuffer.o common-channel.o dropbearconvert.o list.h signkey.c svr-session.c cli-agentfwd.c common-chansession.c dropbearkey list.o signkey.h svr-session.o cli-agentfwd.o common-chansession.o dropbearkey.8 loginrec.c signkey.o svr-tcpfwd.c cli-algo.c common-kex.c dropbearkey.c loginrec.h SMALL svr-tcpfwd.o cli-algo.o common-kex.o dropbearkey.o loginrec.o ssh.h svr-x11fwd.c cli-auth.c common-runopts.c dss.c Makefile sshpty.c svr-x11fwd.o cli-authinteract.c common-runopts.o dss.h Makefile.in sshpty.h sysoptions.h cli-authinteract.o common-session.c dss.o MULTI sshpty.o tcp-accept.c cli-auth.o common-session.o fake-rfc2553.c options.h svr-agentfwd.c tcp-accept.o cli-authpasswd.c compat.c fake-rfc2553.h packet.c svr-agentfwd.o tcpfwd.h cli-authpasswd.o compat.h fake-rfc2553.o packet.h svr-algo.c termcodes.c cli-authpubkey.c compat.o filelist.txt packet.o svr-algo.o termcodes.h cli-authpubkey.o config.guess gendss.c process-packet.c svr-auth.c termcodes.o cli-channel.c config.h gendss.h process-packet.o svr-auth.o TODO cli-channel.o config.h.in gendss.o progressmeter.c svr-authpam.c x11fwd.h 提示:编译好以后,它能生成dropbear、dropbearkey、dbclient、dropbearconvert四个文件; [root@Smoke dropbear-2013.56]# make install(安装) install -d -m 755 /usr/local/sbin install -m 755 dropbear /usr/local/sbin(/usr/local/sbin目录安装dropbear) chown root /usr/local/sbin/dropbear chgrp 0 /usr/local/sbin/dropbear install -d -m 755 /usr/local/bin install -m 755 dbclient /usr/local/bin(/usr/local/bin目录安装dbclient) chown root /usr/local/bin/dbclient chgrp 0 /usr/local/bin/dbclient install -d -m 755 /usr/local/bin install -m 755 dropbearkey /usr/local/bin(/usr/local/bin目录安装dropbearkey) chown root /usr/local/bin/dropbearkey chgrp 0 /usr/local/bin/dropbearkey install -d -m 755 /usr/local/bin install -m 755 dropbearconvert /usr/local/bin(/usr/local/bin目录安装dropbearconvert) chown root /usr/local/bin/dropbearconvert chgrp 0 /usr/local/bin/dropbearconvert 提示:dropbear安装在/usr/local/sbin目录下,因此移植到小linux也需要放到/usr/local/sbin目录; [root@Smoke dropbear-2013.56]# cd(切换到用户家目录) [root@Smoke ~]# ./bincopy.sh(当前目录执行命令及依赖的库文件移植脚本) Your command:dropbear /usr/local/sbin/dropbear copy lib /lib/libcrypt.so.1 finished. copy lib /lib/libutil.so.1 finished. copy lib /lib/libz.so.1 finished. copy /usr/local/sbin/dropbear finishd. Continue:dropbearkey /usr/local/bin/dropbearkey copy /usr/local/bin/dropbearkey finishd. Continue:dbclient /usr/local/bin/dbclient copy /usr/local/bin/dbclient finishd. Continue:q 提示:移植dropbear相关二进制成语及所依赖的库文件; [root@Smoke ~]# cd /mnt/sysroot/(切换到/mnt/sysroot目录) [root@Smoke sysroot]# vim etc/shells(编辑shells文件) /bin/sh /bin/bash /bin/ash /bin/hush 提示:通过etc/shells文件写入系统所允许的安全shell; [root@Smoke sysroot]# vim etc/fstab(编辑etc/fstab文件) sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 devpts(伪文件系统 /dev/pts devpts(文件系统类型) mode=620(创建文件时默认权限620) 0 0 /dev/hda1 /boot ext3 defaults 0 0 /dev/hda2 / ext3 defaults 1 1 提示:添加devpts伪文件系统; [root@Smoke sysroot]# mkdir dev/pts(创建pts目录) [root@Smoke sysroot]# mkdir etc/dropbear(创建dropbear目录) [root@Smoke sysroot]# dropbearkey -t rsa -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key -s 2048(生成密钥,-t密钥类型rsa, -f存放密钥目录/mnt/sysroot/etc/dropbear较dropbear_rsa_host_key,密钥长度2048) Will output 2048 bit rsa secret key to \'/mnt/sysroot/etc/dropbear/dropbear_rsa_host_key\' Generating key, this may take a while... Public key portion is: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAlnCMW5ROO4+Qx8qbd1SVvPCdfdw7ELk+9b2GepP3fFsJhcPOqYugPoQbeQEg9Ng9RjziyD05cQqaYocsEBCfpHDg xvVofZt6SNDu19rUx26nzuHwGzUNjJsZ53ZxLUHH0TIM/g+uMbZVscl9ul/K9vuwTwMwru/ywc+2f5Iue6NY5Zgy5bvbopdGE/YZeuC9GyEvlq8+GF4aHPfn/1Xcv E6n3JSbCdZQevr63S3GqfqzZ3G/RXCwG1dE0jJzaGo2AGi1WjPwwUY2QrS1Jrae0IUtlN8gti51/QV1xBR9V3aNqUJ5AUOttjtjIn5eROJPHmYI91srQ4bUkyflo7 BWyRy4Q== root@Smoke.com Fingerprint: md5 98:9d:79:2f:e6:1e:1e:eb:87:55:8a:2c:91:97:ff:03 [root@Smoke sysroot]# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key(生成密钥,-t密钥类型dss,-f存放密钥目录 /mnt/sysroot/etc/dropbear/叫dropbear_dss_host_key) Will output 1024 bit dss secret key to \'/mnt/sysroot/etc/dropbear/dropbear_dss_host_key\' Generating key, this may take a while... Public key portion is: ssh-dss AAAAB3NzaC1kc3MAAACBALOiMd+K9dBY0mpZe0ocJ45h+IoL93WfYBNT2HRQh5bw4WkX69QZEtqIZDTHGuk+GCYdSZD95JfFfBjgCRax/7/uuLs8z+Ypcrm I5zjeuwy/ZOWB1rKyzXSgxpPzQf+1HLslEbxNkDH/Z27T47TGf1VKU+Q2MNae+5lvQ4CP6MCXAAAAFQDwD/5ZjRlXSXCNcZelD79fD8MdYQAAAIEAk6C8kwd9PiLaMe Ib/lAQUoZb+4zE+QOoXvaj85G8Wg2tVsj82I0MyMkL2TSISm/9CY16m7IX9ibBunLq5VhzrsHoHojBIMnORoRXLiUVgYeuDmG0Lz3/jqmfsITxoUHjNFVHQaGAKft0C CunOD2cgA6nO4Zag4CoF3GfuhpEXNsAAACAUt9PPagiJQvvRlrPiTp3Z1lPa5UVKmFpVF2NS/UvrrTL+LrvTGNmyPt1NnO3st3A0MzvFKXb79S7jFFm+OoG3EI14Ax2 UlFMfpvNdSE3SgRSqdWakqe2Yal0o/mTKfS8PT5uunFqpvoCbDexhGkcOOkqV3rq7CPKBf7u+3Mkb1g= root@Smoke.com Fingerprint: md5 a7:30:2a:99:08:6f:8c:7a:51:37:a8:bf:d2:21:ce:75 [root@Smoke sysroot]# ls etc/dropbear/(查看etc/dropbear目录) dropbear_dss_host_key dropbear_rsa_host_key 提示:查看生成的密钥文件; [root@Smoke sysroot]# ls usr/(查看usr/目录) bin local sbin 提示:确保usr/目录有lib目录; [root@Smoke sysroot]# mkdir usr/lib(创建lib目录) [root@Smoke sysroot]# cp -d /lib/libnss_files* /mnt/sysroot/lib/(复制/lib目录下所有libnss_files开头所有文件到/mnt/sysroot/lib目录, -d或--no-dereference 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录) [root@Smoke sysroot]# cp -d /usr/lib/libnss3.so /usr/lib/libnss_files.so /mnt/sysroot/usr/lib/(复制libnss3.so和libnss_files.so 文件到/mnt/sysroot/user/lib命令,-d或--no-dereference 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录) [root@Smoke sysroot]# ls -l /mnt/sysroot/lib/(查看/mnt/sysrroot/lib目录文件及子目录详细信息) total 2027 -rwxr-xr-x 1 root root 130860 Dec 8 02:34 ld-linux.so.2 -rwxr-xr-x 1 root root 45432 Dec 8 05:55 libcrypt.so.1 -rwxr-xr-x 1 root root 1693820 Dec 8 02:34 libc.so.6 -rwxr-xr-x 1 root root 20668 Dec 8 02:34 libdl.so.2 -rwxr-xr-x 1 root root 50848 Dec 8 06:20 libnss_files-2.5.so lrwxrwxrwx 1 root root 19 Dec 8 06:20 libnss_files.so.2 -> libnss_files-2.5.so -rwxr-xr-x 1 root root 13276 Dec 8 02:34 libtermcap.so.2 -rwxr-xr-x 1 root root 15308 Dec 8 05:55 libutil.so.1 -rwxr-xr-x 1 root root 75120 Dec 8 05:55 libz.so.1 drwxr-xr-x 2 root root 1024 Dec 8 02:34 modules 提示:libnss_files.so.2、libnss_files-2.5.so两个文件都复制过来了; [root@Smoke sysroot]# ls -l /mnt/sysroot/usr/lib/(查看/mnt/sysroot/usr/lib目录文件及子目录详细信息) total 1186 -rwxr-xr-x 1 root root 1205444 Dec 8 06:25 libnss3.so lrwxrwxrwx 1 root root 27 Dec 8 06:25 libnss_files.so -> ../../lib/libnss_files.so.2 提示:复制过来的libnss3.so、libnss_files.so.2文件; [[root@Smoke sysroot]#cp /etc/nsswitch.conf /mnt/sysroot/etc/(复制nsswitch.conf到/mnt/sysroot/etc目录) [root@Smoke sysroot]# vim /mnt/sysroot/etc/nsswitch.conf(编辑nsswitch.conf文件) passwd: files shadow: files group: files hosts: files dns :.,$d(删除从当前行到最后一行) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入) [root@Smoke ~]# sync(同步磁盘写入)
测试:挂起宿主机,切换到小linux系统;
-bash-3.2# ifconfig eth0 172.16.100.3/16(配置eth0网卡ip地址) -bash-3.2# ifconfig(查看配置的网卡地址) -bash-3.2# ping 172.16.100.254(ping测试网卡连通性) 启动dropbear: -bash-3.2# dropbear(执行dropbear命令) -bash: dropbear: command not found 提示:直接使用dropbear命令,找不到命令; -bash-3.2# echo $PATH(查看PATH环境变量) /sbin:/usr/sbin:/bin:/usr/bin 提示:环境变量没有usr/local/bin和/usr/local/sbin; -bash-3.2# vi .bash_profile(编辑用户个人环境变量配置文件) -bash-3.2# /usr/local/sbin/dropbear -E -F(前天运行dropbear程序) 提示:第一次启动dropbear可以使用-E和-F两个选项,表示在前端运行,看客户端登录时候它会报错, 测试:通过xshell测试登录小Linux系统; [c:\~]$ ssh 172.16.100.3 Connecting to 172.16.100.3:22... Connection established. To escape to local shell, press \'Ctrl+Alt+]\'. WARNING! The remote SSH server rejected X11 forwarding request. [898] Jan 22 00:29:13 lastlog_perform_login: Couldn\'t stat /var/log/lastlog: No such file or directory [898] Jan 22 00:29:13 lastlog_openseek: /var/log/lastlog is not a file or directory! -bash-3.2# 提示:登录成功; -bash-3.2# ifconfig(查看网卡信息) -bash: ifconfig: command not found 提示:无法使用ifconfig命令; -bash-3.2# echo $PATH(查看环境变量) /usr/bin:/bin 提示:只有/usr/bin和/bin路径; -bash-3.2# export PATH=$PATH:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin(更改环境变量PATH,在原来变量基础上增加/usr/sbin、/sbin、 /usr/local/bin、/usr/local/sbin目录) -bash-3.2# ifconfig(查看网卡信息) eth0 Link encap:Ethernet HWaddr 00:0C:29:7F:BE:F6 inet addr:172.16.100.3 Bcast:172.16.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:419 errors:0 dropped:0 overruns:0 frame:0 TX packets:274 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:39131 (38.2 KiB) TX bytes:29442 (28.7 KiB) Interrupt:19 Base address:0x2000 -bash-3.2# tty(查看tty伪终端) /dev/pts/0 -bash-3.2# logout(退出) 让dropbear服务运行到后台: -bash-3.2# /usr/local/sbin/dropbear(后台运行dropbear程序) -bash-3.2# netstat -tnl(查看后台服务、t代表tcp、n数字显示、l监听端口) 提示:监听在0.0.0.0.0:22代表所有地址22端口; 测试:使用xhell登录测试: [c:\~]$ ssh 172.16.100.3 Connecting to 172.16.100.3:22... Connection established. To escape to local shell, press \'Ctrl+Alt+]\'. WARNING! The remote SSH server rejected X11 forwarding request. 提示:登录成功; -bash-3.2# cd /var/log/(切换到/var/log目录) -bash-3.2# ls(查看当前目录文件及子目录) messages secure -bash-3.2# tail secure(查看secure文件后10行内容) Jan 22 00:24:25 tiny auth.info login[833]: root login on \'tty1\' 通过小linux系统SSH登录别的主机: -bash-3.2# /usr/local/bin/dbclient -h(查看dbclient帮助) Dropbear SSH client v2013.56 https://matt.ucc.asn.au/dropbear/dropbear.html Usage: /usr/local/bin/dbclient [options] [user@]host[/port][,[user@]host/port],...] [command] -p <remoteport> -l <username>(指定用户名) -t Allocate a pty -T Don\'t allocate a pty -N Don\'t run a remote command -f Run in background after auth -y Always accept remote host key if unknown -s Request a subsystem (use by external sftp) -i <identityfile> (multiple allowed) -A Enable agent auth forwarding -L <[listenaddress:]listenport:remotehost:remoteport> Local port forwarding -g Allow remote hosts to connect to forwarded ports -R <[listenaddress:]listenport:remotehost:remoteport> Remote port forwarding -W <receive_window_buffer> (default 24576, larger may be faster, max 1MB) -K <keepalive> (0 is never, default 0) -I <idle_timeout> (0 is never, default 0) -B <endhost:endport> Netcat-alike forwarding -J <proxy_program> Use program pipe rather than TCP connection -c <cipher list> Specify preferred ciphers (\'-c help\' to list options) -m <MAC list> Specify preferred MACs for packet verification (or \'-m help\') 启动一台测试机作为SSH服务器: -bash-3.2# /usr/local/bin/dbclient -l root 172.16.100.2 Host \'172.16.100.2\' is not in the trusted hosts file. (fingerprint md5 42:e9:a1:a0:c1:7f:bd:02:4b:4a:eb:54:17:4b:80:1b) Do you want to continue connecting? (y/n) y root@172.16.100.2\'s password: Last login: Tue Nov 11 02:33:14 2014 from 172.16.100.254 [root@Server ~]# [root@Server ~]# ifconfig(查看网卡信息) eth0 Link encap:Ethernet HWaddr 00:0C:29:8C:BF:0A inet addr:172.16.100.2 Bcast:172.16.100.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe8c:bf0a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6592 errors:0 dropped:0 overruns:0 frame:0 TX packets:4005 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2802689 (2.6 MiB) TX bytes:466130 (455.2 KiB) Interrupt:67 Base address:0x2000