linux学习笔记016

脚本编程知识点:

1、变量中字符的长度:${#VARNAME}

 

2、变量赋值等:

${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;A=3 echo ${A:-30} unset A echo ${A:-30}(30) echo $A(空)

${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;

${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;

${parameter:offset}echo A=’hello world’${A:2}

${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;

 

3、脚本配置文件

/etc/rc.d/init.d/服务脚本

服务脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件

 

4、局部变量

local VAR_NAME=

 

a=1

 

test() {

 a=$[3+4]

}

 

test

for I in `seq $a 10`; do

 echo $I

done 

 

5、命令mktemp

创建临时文件或目录

 

mktemp /tmp/file.XX

         -d:创建为目录

        

6、信号

kill -SIGNAL PID

         1:HUP

         2:INT

         9:KILL

         15:TERM

        

脚本中,能实现信号捕捉,但9和15无法捕捉

 

Ctrl+c: SIGINT 2

 

trap命令:

         trap'COMMAND' 信号列表

        

7、一行执行多个语句,语句间用分号分隔

 

 

任务计划:

 

1、在未来的某个时间点执行一次某任务;

         at

         batch

        

         at时间(at now+3minutes

ls /var

cat /etc/fstab

Ctrl+d

)

         at>COMMAND

         at>Ctrl+d

        

         指定时间:

                   绝对时间:HH:MM,DD.MM.YY  MM/DD/YY

                   相对时间:now+#

                            单位:minutes,hours, days, weeks

                   模糊时间:noon,midnight, teatime(喝茶时间下午4点)

        

         命令的执行结果:将以邮件的形式发送给安排任务的用户

        

        

         at-l = atq(查看作业)

         at-d AT_JOB_ID = atrm  AT_JOB_ID(at –d 2 )

         (at–l )

        

2、周期性地执行某任务;

         cron:自身是一个不间断运行的服务

         anacron:cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务在恢复正常执行一次;

        

         cron:

                   系统cron任务:

                            /etc/crontab

                                     分钟  小时  天  月  周  用户  任务

                   用户cron任务:

                            /var/spool/cron/USERNAME

                                     分钟  小时  天  月  周  任务

                           

                   时间的有效取值:

                            分钟:0-59

                            小时:0-23

                            天:1-31

                            月:1-12

                            周:0-7,0和7都表示周日

                           

                   时间通配表示:

                            *:对应时间的所有有效取值

                                     3* * * * 每个小时的第3分钟

                                     3* * * 7 每周日的每小时的第三分钟

                                     1312 * * * 每天的12点13分钟

                                     1312 6 7 *每年的7月6号12点13分

                            ,:离散时间点:

                                     10,4002 * * 2,5 每周二或是周五的02点10或者是40分

                            -:连续时间点:

                                     1002 * * 1-5 周一到周五的02点10或者是40分

                            /#:对应取值范围内每多久一次

                                     */3* * * * 每3分钟一次任务

                                    

                   每两小时执行一次:

                            08*/2 * * *

                   每两天执行一次:

                            1004 */2 * *

        

         执行结果将以邮件形式发送给管理员:

                   */3* * * * /bin/cat /etc/fstab &> /dev/null

                  

         cron的环境变量:cron执行所有命令都去PATH环境变量指定的路径下去找

                   PATH  /bin:/sbin:/usr/bin:/usr/sbin

 

         用户任务的管理:

                   crontab

                            -l:列出当前用户的所有cron任务

                            -e:编辑

                            -r:移除所有任务

                            -uUSERNAME: 管理其用户的cron任务

                           

         anacron:(/etc/anacrontab)

1天没执行了 开机以后65分钟执行

service cron status

chkconfig –list crond

cross compile:交叉编译

 

x86, 32bit,

 

ARM

 

 

 

        

shutdown

halt

reboot

poweroff 

 

init 0

init 6

 

 

RHEL6:

upstart --> init

         /etc/inittab

         /etc/init/*.conf

 

        

/etc/rc.d/init.d/functions脚本,可用于控制服务脚本的信息显示:

SCREEN=`stty -F /dev/console size2>/dev/null`

COLUMNS=${SCREEN#* }

[ -z $COLUMNS ] && COLUMNS=80

 

SPA_COL=$[$COLUMNS-14]

 

RED='\033[31m'

GREEN='\033[32m'

YELLOW='\033[33m'

BLUE='\033\34m'

NORMAL='\033[0m'

 

 

success() {

 string=$1

 RT_SPA=$[$SPA_COL-${#string}]

 echo -n "$string"

  forI in `seq 1 $RT_SPA`;do

   echo -n " "

 done

 echo -e "[  ${GREEN}OK${NORMAL}   ]"

}

 

failure() {

 string=$1

 RT_SPA=$[$SPA_COL-${#string}]

 echo -n "$string"

  forI in `seq 1 $RT_SPA`;do

   echo -n " "

 done

 echo -e "[ ${RED}FAILED${NORMAL} ]"

}       

        

        

/etc/rc.d/init.d/tserver脚本,测试SysV服务的定义格式:

#!/bin/bash

#

# chkconfig: 35 66 33

# description: test service script

#

. /etc/rc.d/init.d/functions

 

prog=tserver

lockfile=/var/lock/subsys/$prog

 

start() {

 touch $lockfile

  [$? -eq 0 ] && success "Starting $prog" || failure"Staring $prog"

}

 

stop() {

  rm-f $lockfile

  [$? -eq 0 ] && success "Stopping $prog" || failure"Stopping $prog"

}

 

status() {

  if[ -f $lockfile ]; then

   echo "Running..."

 else

   echo "Stopped..."

  fi

}

 

usage() {

 echo "Usage: $prog {start|stop|status|restart}"

}

 

case $1 in

start)

 start ;;

stop)

 stop ;;

restart)

 stop

 start

  ;;

status)

 status

  ;;

*)

 usage

 exit 1

  ;;

esac

        

/etc/inittab文件示例:

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

 

l0:0:wait:/etc/rc.d/rc 0

l3:3:wait:/etc/rc.d/rc 3

l6:6:wait:/etc/rc.d/rc 6

 

1:2345:respawn:/sbin/agetty -n -l /bin/bash38400 tty1

2:2345:respawn:/sbin/agetty -n -l /bin/bash38400 tty2        

        

 

/etc/fstab文件示例:

/dev/hda2         /        ext3 defaults    0 0

/dev/hda1         /boot        ext3 defaults    0 0

proc          /proc         proc defaults    0 0

sysfs          /sys  sysfs defaults    0 0

 

 

/etc/rc.d/rc.sysinit脚本示例:

#!/bin/bash

#

echo -e "\tWelcome to\033[34mMageEdu\033[0m Linux"

 

echo "Remount rootfs..."

mount -n -o remount,rw /

 

echo "Set the hostname..."

[ -f /etc/sysconfig/network ] && ./etc/sysconfig/network

[ -z $HOSTNAME -o "$HOSTNAME" =='(none)' ] && HOSTNAME=localhost

/bin/hostname $HOSTNAME

 

echo "Initializing networkdevice..."

/sbin/insmod /lib/modules/mii.ko

/sbin/insmod /lib/modules/pcnet32.ko

 

 

/etc/rc.d/rc脚本示例:

#!/bin/bash

#

RUNLEVEL=$1

 

for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do

  $Istop

done

 

for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do

  $Istart

done        

 

 

1、关机和重启;

2、终端

3、主机名

4、IP地址(模块的装载和服务的实现)

5、functions

 

6、终端提示信息

/etc/issue文件的内容

 

7、rc.sysinit:挂载/etc/fstab中定义的其它文件系统;

 

8、设定内核参数

/etc/sysctl.conf

 

sysctl -p

 

 

9、用户

 

PAM: Pluggable Authentication Module

/etc/pam.d/*

 

绕过PAM,

/bin/login:

 

 

 

 

用户:UID

组: GID

 

login: 验正

 

nsswitch: Network Service Switch

框架:/etc/passwd, /etc/shadow, /etc/group

         库:libnss_file.so,libnss_nis.so, libnsss_ldap.so

         配置文件:/etc/nsswitch.conf

        

 

         /etc/passwd,/etc/shadow

        

         NIS,LDAP, MySQL

 

/etc/mypasswd

 

 

/etc/passwd

/etc/group

 

名称解析是如何工作的?

 

10、单用户模式

 

 

 

 

 

内核编译:

busybox:

 

Kernel+ROOTFS()

 

kernel+initrd(ramdisk)

 

kernel+

 

busybox-->initrd

 

kernel+initrd(busybox)-->rootfs(busybox)

 

kenrel

 

RHEL5.8 + busybox(initrd) + rootfs(busybox)

 

 

 

 

查看本机硬件设备信息:

1、cat /proc/cpuinfo

 

2、lsusb

 

3、lspci

 

4、hal-device

         HardwareAbstract Layer

 

        

        

编译内核:

1、配置

make menuconfig

make gconfig

make kconfig

make oldconfig

make config

 

保存为.config

 

2、

make

make modules_install

make install

        

模块安装位置:/lib/modules/KERNEL_VERSION/        

        

 

如何实现部分编译:

1、只编译某子目录下的相关代码:

make dir/

 

make arch/

make drivers/net/

 

2、只编译部分模块

make M=drivers/net/

 

3、只编译某一模块

make drivers/net/pcnet32.ko

 

4、将编译完成的结果放置于别的目录中

make O=/tmp/kernel

 

5、交叉编译

make ARCH=

 

 

如何编译busybox:

 

IDE:

/dev/hda1: ext3  /boot

/dev/hda2: ext3 /

 

 

 

        

        

内核初始化:

         硬件探测

         装载驱动

         挂载根文件系统(rootfs)

         启动用户空间中的第一个进程init

        

        

http://youbest.cublog.cn

 

 

 

文件系统

进程管理

内存管理

网络管理

安全功能

驱动程序

 

 

 

Linux内核及编译

 

Linux系统安装和kickstart

 

故障排除

 

 

 

Kernel + initrd(busybox制作,提供ext3文件系统模块) + ROOTFS(busybox制作)

 

make arch/

         arch/x86/boot/bzImage

        

         硬件驱动:initrd                 

                   initrd:仅需要提供内核访问真正的根文件系统所在设备需要的驱动

                            存储设备和文件系统相关的模块

                   系统初始化rc.sysinit:初始其它硬件的驱动程序;

                  

         ROOTFS:busybox, init不支持运行级别

                            /etc/inittab:格式也不尽相同

                   ash,hush

                   bash

 

内核编译:

         makeSUBDIR=arch/

         makearch/x86/

 

 

/boot/vmlinuz (ext3, IDE)

 

 

/mnt/boot: /dev/hda1

/mnt/sysroot: /dev/hda2

 

 

1、安装grub

2、提供内核

3、提供initrd

4、创建根文件系统

 

 

 

 

Linux上的日志系统

syslog

syslog-ng: 开源

 

日志系统:syslog()

 

A:

B:

D:

 

syslog服务:

         syslogd:系统,非内核产生的信息

         klogd:内核,专门负责记录内核产生的日志信息

 

kernel --> 物理终端(/dev/console)--> /var/log/dmesg

# dmesg命令查看上面的文件

# cat /var/log/dmesg

 

 

日志需要滚动(日志切割):(滚动logrotate /etc/ logrotate.conf配置文件/etc/ logrotate.d)

messages messages.1 messages.2 messages.3

 

/sbin/init

         /var/log/messages:系统标准错误日志信息;非内核产生引导信息;各子系统产生的信息;

         /var/log/maillog:邮件系统产生的日志信息;

         /var/log/secure:登录系统日志

        

syslog: 服务(service syslogstatus)

         syslogd进程

         klogd进程

         配置文件:/etc/syslog.conf

         /etc/logrotate.d/

        

 

 

信息详细程序:日志级别

 

子系统:facility, 设施

 

动作:

 

 

 

syslog: syslogd和klogd

 

 

配置文件定义格式为: facility.priority       action

 facility,可以理解为日志的来源或设备目前常用的facility有以下几种:

   auth                              # 认证相关的

   authpriv                            # 权限,授权相关的

   cron                              # 任务计划相关的

   daemon                          # 守护进程相关的

   kern                              # 内核相关的

   lpr                                   # 打印相关的

   mail                                 # 邮件相关的

   mark                               # 标记相关的

   news                               # 新闻相关的

   security                     # 安全相关的,与auth 类似 

   syslog                         # syslog自己的

   user                         # 用户相关的

   uucp                        # unix tounix cp 相关的

   local0 到 local7     # 用户自定义使用

   *                                  # *表示所有的facility

 

 

 priority(log level)日志的级别,一般有以下几种级别(从低到高)

   debug           # 程序或系统的调试信息

   info            # 一般信息

   notice          # 不影响正常功能,需要注意的消息

   warning/warn    # 可能影响系统功能,需要提醒用户的重要事件

   err/error       # 错误信息

   crit            # 比较严重的

   alert           # 必须马上处理的

   emerg/panic     # 会导致系统不可用的

   *               # 表示所有的日志级别

   none            # 跟* 相反,表示啥也没有

    

 action(动作)日志记录的位置

    系统上的绝对路径    # 普通文件 如: /var/log/xxx

   |                   # 管道  通过管道送给其他的命令处理

    终端              # 终端   如:/dev/console

   @HOST               # 远程主机 如: @10.0.0.1     

    用户              # 系统用户 如: root

   *                   # 登录到系统上的所有用户,一般emerg级别的日志是这样定义的

 

定义格式例子:

mail.info  /var/log/mail.log # 表示将mail相关的,级别为info及

                             # info以上级别的信息记录到/var/log/mail.log文件中

auth.=info @10.0.0.1         # 表示将auth相关的,基本为info的信息记录到10.0.0.1主机上去

                           # 前提是10.0.0.1要能接收其他主机发来的日志信息

user.!=error                  # 表示记录user相关的,不包括error级别的信息

user.!error                   # 与user.error相反

*.info                        # 表示记录所有的日志信息的info级别

mail.*                        # 表示记录mail相关的所有级别的信息

*.*                           # 你懂的.

cron.info;mail.info           # 多个日志来源可以用";"隔开

cron,mail.info                # 与cron.info;mail.info 是一个意思

mail.*;mail.!=info            # 表示记录mail相关的所有级别的信息,但是不包括info级别的

加横线表示异步写入

service syslog reload

 

telnet: 远程登录协议, 23/tcp

         C/S

         S:telnet服务器

         C:telnet客户端

        

ssh: Secure SHell, 应用层协议,22/tcp     

         通信过程及认证过程是加密的,主机认证

         用户认证过程加密

         数据传输过程加密

        

ssh v1, v2

 man-in-middle       

 

sshv2

 

认证过程:

         基于口令认证

         基于密钥认证:

        

shh是协议:规范

实现:服务器端、客户端

 

Linux: openSSH

         C/S

                   服务器端:sshd, 配置文件/etc/ssh/sshd_config

                   客户端:ssh, 配置文件/etc/ssh/ssh_config

                            ssh-keygen:密钥生成器

                            ssh-copy-id:将公钥传输至远程服务器

                            scp:跨主机安全复制工具

                            ssh 172.16.200.1 yes        密钥存放在家目录下的known_   hosts                 

                   ssh:32:04

                            sshUSERNAME@HOST

                            ssh-l USERNAME HOST

                            sshUSERNAME@HOST 'COMMAND'不登陆执行命令

                           

                   scp:

                            scpSRC DEST

                                     -r

                                     -a

                            scpUSERNAME@HOST:/path/to/somefile /path/to/local

                            scp/path/to/local USERNAME@HOST:/path/to/somewhere

                           

                   ssh-keygen

                            -trsa        

                                     ~/.ssh/id_rsa

                                     ~/.ssh/id_rsa.pub

                            -f/path/to/KEY_FILE

                            -P'': 指定加密私钥的密码

                  

                                    

                   公钥追加保存到远程主机某用户的家目录下的.ssh/authorized_keys文件或.ssh/authorized_keys2文件中

 

                   ssh-copy-id

                            -i ~/.ssh/id_rsa.pub

                            ssh-copy-id-i ~/.ssh/id_rsa.pub USERNAME@HOST

                           

dropbear: 嵌入式系统专用的ssh服务器端和客户端工具

         服务器端:dropbear

                              dropbearkey

         客户端:dbclient

                     

         dropbear默认使用nsswitch实现名称解析

                   /etc/nsswitch.conf

                   /lib/libnss_files*

                   /usr/lib/libnss3.so

                   /usr/lib/libnss_files*

                  

         dropbear会在用户登录检查其默认shell是否当前系统的安全shell

                   /etc/shells

                  

         主机密钥默认位置:

                   /etc/dropbear/

                            RSA:dropbear_rsa_host_key

                                     长度可变, 只要是8的整数倍,默认为1024

                            DSS:dropbear_dss_host_key

                                     长度固定,默认为1024

                   dropbearkey

                            -trsa|dsa

                            -f/path/to/KEY_FILE

                            -sSIZE

 

博客作业:

日志系统

cron任务计划

shell知识点总结及例子

RHEL5.8系统裁减:具有用户登录等功能

微型系统制作:具有IP地址、有虚拟终端、有主机名、能ssh远程登录;

 

 

挂载好hda1 hda2 /mnt/root sysroot

cp /boot/vmlinuz-2.6.18-308.e15/mnt/boot/vmlinuz 复制内核

mkdir test

cd test

zcat /boot/initrd -2.6.18-308.e15.img |cpio –id

vim init

mkrootdev –t ext3 –o defaults,ro/dev/hda2  

注释dm模块

.,+20s@^@#g

注释echo Scanning logical volumes

一直到交换分区

Resume LABEL=SWAP-sda3

wq

cd lib/

rm –f df-*

cd ..

find .| cpio –H newc –quiet –o | gzip -9> /mnt/boot/initrd.gz (-o表示创建文件–H 表示保持当前目录结构newc表示新规范)

ls –lh /mnt/boot/

initrd.gz 只有3.3M

grub-install –root-directory=/mnt /dev/had

ls /mnt/boot/

看到gurb

vim /mnt/boot/grub/grub.conf

default=0

timeout=3

title pengpeng(2.6.18)

         root(hd0,0)

         kernel/vmlinuz

         initrd/initrd.gz

wq

cd /mnt/sysroot

mkdir etc{rc.d/init.d} bin sbin proc sysdev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmphome opt boot –pv

vim /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit/

wq

vim /etc/rc.d/rc.sysinit

#!/bin/bash

#

Echo –e “\t Welcome to\033[34mpengpeng\033[0m linux”

/bin/bash

Wq

chmod +x /etc/rc.d/rc.sysinit

复制命令的脚本

#!/bin/bash

#

DEST=/mnt/sysroot

Libcp() {

LIBPATH=${1%/*}

[ ! –d $DEST$LIBPATH ] && mkdir –p$DEST$LIBPATH

[ ! –e $DEST {1} ] && cp &1$DEST$LIBPATH && echo “copy lib $1 finished.”

}

bincp()

{

CMDPATH=${1%/*}

[ ! –d $DEST$CMDPATH ]&& mkdir –p$DEST$CMDPATH

[! –e $DEST${1}] && cp $1$DEST$CMDPATH

for LIB in `ldd $1 | grep–o”/.*lib\(64\)\{0,1}/[^[ :space: ]]\{1,\}”`; do

         libcp$LIB

         done

}

read –p “Your command : ” CMD

until [ $CMD == `q` ]; do

! which $CMD && echo “wrongcommand” && read –p “INPUT againe” CMD && continue

bincp $COMMAND                                 

echo “copy $COMMAND finished”

read –p “continue:” CMD

done

./bincp.sh

Init

bash

ls

sync

chroot /mnt/sysroot

尝试启动系统

./bincp.sh

mkdir

cat

touch

rm

mv

cp

mount

umount

vi

vim

chmod

chown

ping

ifconfig

insmod

modprobe

rmmod

route

halt

reboot

shutdown

hostname

q

touch /tmp/a.txt

mount –o remount,rw /重新挂载跟

Mtab追踪当前文件系统mount挂载保存在这个文件 会发生错误

mount –n 不更新mtab文件

cat /proc/mounts

mount –n –o,rw /

touch /tmp/a.txt

1777 1表示stick

Halt 关机 只切换到0 关闭当前子进程 不能切断电源

exec halt –p (-p切断电源 exec用当前进程结束父进程)

cd /mnt/sysroot

vim /etc/rc.d/rc.sysdone

#!/bin/bash

#

sync

sleep 2

sysc

 

exec /sbin/halt –p

wq

chmod +x etc/rc.d/rc.sysdone

./bincp.sh

sync

sleep

sync

cd /mnt/sysroot/ect/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

 

l0:0:wait:/etc/rc.d/rc.sysdone

sync

sync

再次启动小系统

Init 0

然后就关机了

cd /mnt/sysroot/etc/inittab

l6:wait:/etc/rc.d/rc.reboot

vim /mnt/sysroot /etc/ rc.d/rc.reboot

#!/bin/bash

sync

sleep 1

sync

 

exec /sbin/reboot

sync

sync

chmod +x /mnt/sysroot /etc/ rc.d/rc.reboot

再次启动小系统

(忘记改权限在小系统中改)

mount –n –o remount,rw /

chmod +x /etc/rc.d/rc.reboot

sync

sync

Init 6

vim /etc/rc,d/init.d/halt

#!/bin/bash

#

case $0 in

*reboot)

COMMAD=’/sbin/halt -p’;;

*halt)

COMMAD=’/sbin/reboot’;;

*)

echo “Only call this script by *reboot OR *halt”

;;

esac

case $1 in

start)

;;

stop)

;;

*)

echo “usage:” ` basename &0`  {start|stop}”

;;

Esac

exec $COMMAND

chmod +x /etc/rc.d/init.d/halt

cd etc/rc.d

mkdir rc0.d rc6.d

cd rc0.d

ln –sv ../init.d/halt S99halt

ll

cd ..

cd rc6.d

ln –sv ../init.d/halt S99reboot

./S99reboot

rm –f rc.reboot rc.sysdone

ls

sync

sync

vim rc

#!/bin/bash

#

RUNLEVEL=$1

For I in /etc/rc.d/rc$RUNLEVEL.d/k*;do

$I stop

Done

For I in /etc/rc.d/rc$RUNLEVEL.d/S;do

$I start

done

 

chmod +x rc 

vim etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/rc/sysinit

l0:0:wait:/etc/rc.d/rc 0

l6:6:wait:/etc/rc.d/rc 6

sync

sync

cd /mnt/sysroot

vim etc/inittab

l3:3:wait:/etc/rc.d/rc 3

cd etc/rc.d

mkdir rc3.d

vim init.d/tserver

#!/bin/bash

#

#chkconfig:35 66 33

#description:test service script

prog=`basename $0`

lockfile=/var/locksubsys/&prog
start()  {

echo “starting  $prog..”

touch &lockfile

}

stop () {

echo “Stop &prog”

rm –f $lockfile

}

Status()

{

If [ -f $lockfile ]; then

echo “RUNNING”

else

echo “Stop..”

fi

}

usage() {

echo “usage:$prog{start|stop|status|restart}”

}

Case $1 in

start)

start;;

stop)

stop;;

restart)

stop

start

;;

status)

status

*)

Usage

exit 1

;;

Esac

wq

chmod +x init.d/tserver

init.d/tserver start

ls /var/lock/subsys/

init.d/tserver status

init.d/tserver statuss

 

cd rc3.d

ln –sv ../init.d/server S66tserver

ll

cd ..

cd rc0.d/

ln –sv ../init.d/tserver K33tservet

sync

vim inittab

1:2345:respawn:/sbin/mingetty –loginiprog=/bin/bashtty1

2:2345:respawn:/sbin/mingetty –loginiprog=/bin/bashtty2

wq

vim rc.d/rc.sysinit

删去/bin/bash

./bincp.sh

migetty basename

cd /mnt/sysroot/bin/

ln –sv bash sh

sync

sync

重启小系统

cd /mnt/sysroot/

vim /etc/fstab

/dev/hda2  /        ext3    defaults 0 0

/dev/hda1  /boot    ext3    defaults  0 0

proc       /proc    proc    defaults  0 0

sysfs      /sys      sysfs    defaults  0 0

vim etc/sysinit

加一行

echo “Remount rootfs..”

mount –n –o remount,rw /

echo “set hostname”

[ -f /etc/sysconfig/network ] && ./ect/sysconfig/network

[ -z $HOSTNAME –o “$HOSTNAME”==’(none)’ ]$$ HOSTNAME=localhost

/bin/hostname $HOSTNAME

wq

hostname

mkdir etc/sysconfig

vim /etc/sysconfig/network

HOSTNAME=pengpeng.com

chroot /mnt/sysroot

/etc/rc.d/rc.sysinit

exit

man mingetty

man agetty

man mgetty

man s

tty

sty –F /dev/console speed

./bincp.sh

agetty

cd /mnt/sysroot

ls

vim etc/inittab

1:2345;respawn:/sbin/agetty -n –l /bin/bash38400(速率) tty1

2:2345;respawn:/sbin/agetty –n –l /bin/bash38400(速率) tty2

又重启

在另一台机器上修复文件系统

cd /mnt/sysroot

ls

find . | cpio –H newc –quiet –o | gzip >/root/sysroot.gz

umount /dev/hda2 发现卸载不掉

fuser –km /dev/hda2

umount /dev/hda2

mke2fs –j /dev/hda2

mount /dev/hda2 /mnt/sysroot/

cd /mnt/sysroot/

zcat /root/sysroot.gz | cpio –id

ls

 

cat etc/inittab

sync

sync

sleep

 

cat /etc/rc.d/init.d/functions 这是红帽的脚本

cd /mnt/sysroot

vim etc/rc.d/init.d/functions

#!/bin/bash

#为了执行加上的binbash本身作为函数不需要执行

echo –e “[ \033[1;32mO K\033[0m  ] ”

试下

chmod +x etc/rc/d/init.d/functions

A=”Starting tserver ”

echo $[#A] 看A有多少字符

屏幕长度stty –F /dev/console size 25 80 25行80列

stty –F /dev/console size 25 80| cut –d ‘ ’–f2

stty –F /dev/console size 25 80 | awk ‘{print $2}’

A=` stty –F /dev/console size 25 80`

echo ${A#* }以空格作为分隔符从左向右去掉第一个空格向左的内容

echo ${A##* }以空格作为分隔符从左向右去掉最后一个空格向左的内容

echo ${A% *}以空格作为分隔符从右向左去掉第一个空格向右的内容

echo ${A%% *}以空格作为分隔符从右向左去掉最后一个空格向右的内容

vim etc/rc.d/init.d/funtions

#!/bin/bash

#

SCREEN=`sty –F /dev/console size`

COLUMNS=${ SCREEN#*  }

SPA_CLO=$[$COLUMNS-&14]

RED =’\033[31m’

GREEN=’\033[32m’

YELLOW=’033[33m

NORMAL=’033[0m’

 

success()

{

string=$1

RT_SPA=$[$SPA_CLO-${#string}]

echo –n “$string”

for I in `seq 1 $ RT_SPA`;do

echo –n “ ”

done

echo –e “[   ${CREEN}OK${NORMAL}    ]”

}

failure ()

{

string=$1

RT_SPA=$[$SPA_CLO-${#string}]

echo –n “$string”

for I in `seq 1 $ RT_SPA`;do

echo –n “ ”

done

echo –e “[ ${RED }FAILED ${NORMAL}  ]”

}

 

#success "starting tserver”

#success "starting tserverpengpeng ”

#failure "starting tserver”

尝试执行脚本

vim init.d/tserver

#!/bin/bash

#

./etc/rc.d/init.d/functions          加

#chkconfig:35 66 33

#description:test service script

prog=`basename $0`       改成tserver

lockfile=/var/locksubsys/&prog
start()  {

#echo “starting  $prog..”

touch &lockfile

[ $? –eq 0 ] &&success “starting$proc” || failure “String $prog ”

}

stop () {

#echo “Stop &prog”

rm –f $lockfile

[ $? –eq 0 ] &&success “stopping$proc” || failure “String $prog

 

}

Status()

{

If [ -f $lockfile ]; then

echo “RUNNING”

else

echo “Stop..”

fi

}

usage() {

echo “usage:$prog{start|stop|status|restart}”

}

Case $1 in

start)

start;;

stop)

stop;;

restart)

stop

start

;;

status)

status

*)

Usage

exit 1

;;

Esac

chroot /mnt/sysroot/

发现要移植seq

/root/bincp.sh

seq stty

q

chroot /mnt/sysroot/

找不到/dev/console 文件

vim etc/rc.d/init.d/funtions

#!/bin/bash

#

SCREEN=`sty –F /dev/console size 2>/dev/null`改

COLUMNS=${ SCREEN#*  }

[ -z $ COLUMNS ]&& COLUMNS=80       加

SPA_CLO=$[$COLUMNS-&14]

RED =’\033[31m’

GREEN=’\033[32m’

YELLOW=’033[33m

NORMAL=’033[0m’

 

success()

{

string=$1

RT_SPA=$[$SPA_CLO-${#string}]

echo –n “$string”

for I in `seq 1 $ RT_SPA`;do

echo –n “ ”

done

echo –e “[    ${CREEN}OK${NORMAL}    ]”

}

failure ()

{

string=$1

RT_SPA=$[$SPA_CLO-${#string}]

echo –n “$string”

for I in `seq 1 $ RT_SPA`;do

echo –n “ ”

done

echo –e “[ ${RED }FAILED ${NORMAL}  ]”

}

 

#success "starting tserver”

#success "starting tserverpengpeng ”

#failure "starting tserver”

chroot /mnt/sysroot/

/etc/rc.d/init.d/tserver start

/etc/rc.d/init.d/tserver stop

cd /mnt/sysroot/

mkdir lib/modules

modinfo pcnet32

cp filename(….) /mnt/sysroot/lib/modules

modinfo mii(因为有依赖关系)

cp filename(….) /mnt/sysroot/lib/modules

vim etc/rc.d/tc.sysinit

加一行

echo “Inittailizing network device”

/sbin/insmod /lib/modules/mii.ko

/sbin/insmod /lib/modules/pcnet32.ko

wq

vim etc/rc.d/init.d/network

mkdir –pv etc/sysconfig/network-scripts

vimetc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=static

IPADDR=172.16.100.5

NETMASK=255.255.0.0

GATEWAY=172.16.0.1

ONBOOT=yes

wq

vim etc/rc.d/init.d/network

#!/bin/bash

#

CONF=/etc/sysconfig/network-scripts/ifcfg-eth0

prog=network

. $ CONF

NETMASK=16

 

usage()

{

echo “$prog: {start|stop|restart|status}”

}

start()

{

Ifconfig eth0 $IPADDR/$NETMASK

[ -z GATEWAY ] && route add defaultgw $GATEWAY

}

stop()

{

Ifconfig eth0 down

}

status()

{

Ifconfig eth0

}

case $1 in

start)

start

success “Config network eth0”

;;

stop)

stop

success “stop network card eth0”

;;

restart)

stop

start

success “Restart network eth0”

;;

status)

status

;;

*)

usage

;;

chmod +x etc/rc.d/init.d/network

cd etc/rc.d/rc0.d/

ln –sv ../init.d/network K90network

cd ../rc3.d

ln –sv ../init.rd/network K90network

cd ../rc6.d/

cd ../rc3.d/

ln –sv ../init.d/network S90network

cd ..

vim init.d/network

加两行

# ckconfig:35 09 90

# description: network service

wq

chroot /mnt/sysroot/

/etc/rc.d/init.d/network start

出错

etc/rc.d/init.d/network

NETMASK=16

下午

/etc/issue

登录显示的信息

man mingetty

\r uname -r

\m uname –m

man agetty

cp /etc/issue /mnt/sysroot/etc/

vim /mnt/sysroot/etc/issue

PENGPENG linux

Kernel \r on an \m

http://www.pengpeng.com

wq

挂载文件系统/etc/fstab

/proc/mounts 表示挂载的设备

awk ‘{print $1}’ /proc/mounts | grep“/dev/hda2”找到就被挂载了

编写脚本挂载文件系统

awk ‘{print $1 }’ /etc/fstab 取可能要挂载的设备(有的已经挂载,有的还需要挂载,交换分区的话,需要用激活的方式)

去掉第二段为swap

grep –v –E “\<swap|proc|sysfs\>”  /etc/fstab | awk ‘{print $1}’|while readLINE;do awk ’{print $1}’ /proc/mounts | grep “^$LINE”;done

cd /mnt/sysroot/

vim etc/rc.d/rc.sysinit

#!/bin/bash

#

echo -e "\tWelcome to\033[34mMageEdu\033[0m Linux"

 

echo "Remount rootfs..."

mount -n -o remount,rw /

[ $? –eq 0 ] &&success “Remountrootfs”|| failure “Remount rootfs”

mount –a

 

 

echo "Set the hostname..."

[ -f /etc/sysconfig/network ] && ./etc/sysconfig/network

[ -z $HOSTNAME -o "$HOSTNAME" =='(none)' ] && HOSTNAME=localhost

/bin/hostname $HOSTNAME

 

echo "Initializing networkdevice..."

/sbin/insmod /lib/modules/mii.ko

/sbin/insmod /lib/modules/pcnet32.ko

 

 

/etc/rc.d/rc脚本示例:

#!/bin/bash

#

RUNLEVEL=$1

 

for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do

  $Istop

done

 

for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do

  $Istart

done

bincp.sh

sysctl

q

vim etc/sysctl.conf

net.ipv4.ip_forward=1

参照/etc/sysctl.conf

 vimetc/rc.d/rc.sysinit

sysctl –p &>/dev/null

[ $? –eq 0 ] && success “Set kernelparameter”|| failure “Set kernel parameter”

sync

sync

重启系统

vim /mnt/sysroot/grub/grub.conf

default=0

timeout=3

title pengpeng(2.6.18)

         root(hd0,0)

         kernel/vmlinuz ro root=/dev/hda2 quiet

         initrd/initrd.gz

cd test

cd test

vim init

只留了这几行

echo “Loading jbd.ko.module”

insmod /lib/jbd.ko

echo “Loading ext3.ko module”

insmod /lib/ ext3.ko

ls /lib

ext3.ko fireware jbd.ko

ll –h /mnt/boot/

1.8M initrd

重启系统

下一步支持用户帐号

下载一个不需要PAM的login

cat /etc/nsswitch.conf

cp –d /lib/libnss_file* /mnt/sysroot/lib/

ls /mnt/sysroot/lib –l

cp –d /usr/lib/libnss_files.so/mnt/sysroot/usr/lib/

cp –d /usr/lib/libnss3.so/usr/lib/libnssckbi.so /usr/lib/libnssutil3.so /mnt/sysroot/usr/lib/

sync

cp /etc/nsswitch.conf /mnt/sysroot/etc/

vim /mnt/sysroot/etc/

只保留这四行

passwd:files

shadow:files

group:files

hosts:files dns

useradd hadoop

passwd hadoop

grep –E “^(root|hadoop)\>” /etc/passwd> /mnt/syroot/etc/passwd

grep –E “^(root|hadoop)\>” /etc/shadow> /mnt/syroot/etc/shadow

 

grep –E “^(root|hadoop)\>” /etc/group> /mnt/syroot/etc/ group

sync

./bincp.sh

mingetty

passwd

useradd

userdel

usermod

groupadd

cd /mnt/sysroot/

vim /etc/inittab

mingetty tty1

mingetty tty2

wq

cd

login

重启后到小系统后

cd  /root/

vim .bash_profile

PS1=`[\u@\h \w]\$`

export PS1 \u用户名\h主机名 \W工作目录的基名\w 全名

加单用户模式

改小系统root目录权限

Chmod –R og=--- root/

vim etc/inittab

定义一级别

L1:1:wait:/etc/rc.d/rc 1

ls etc/rc.d/init.d/

cd etc/

mkdir rc1.d

cd rc1.d/

ln –sv ../init.d/tserver K33tserver

ln –sv ../init.d/network K90network

ll

cd ..

ls

cd ..

vim rc.d/init.d/single

#!/bin/bash

#

# chkconfig:

# description:

#

case $1 in

start)

;;

*)

echo “usage :single start”

;;

esac

exec  /sbin/init S

chmod +x rc.d/init.d/single

cd rc.d/rc1.d/

ln –sv ../init.d/single S98single

ll

sync

sync

备份后重启

 

 

下载busybox解压

tar xf busybox-1.20.2.tar.bz1

cd busybox-1.20.2

make menuconfig

选择

busybox setting buildoptions

build busybox as a static binary

installation options (“make installbehavior”)

make install

编译可能会出错

需要新版的内核支持

下载新版的内核

解压内核然后复内核文件下include mtd 下的ubi-user.h

cd /root/busybox-1.20.2

cd include

mkdir mtd

cp /usr/src/linux_____ /include/mtd/ubi-user.hmtd/

cd ..

make install

编译到当前目录_install

cp _install /tmp/busybox –a

cd /tmp/busybox

rm linuxrc

mkdir proc sys etc dev sysroot lib/modules–pv

modinfo ext3

modinfo jbd

cp filename--- lib/modules/

cp filename --- lib/modules/

pwd

vim init

#!/bin/sh

#

mount -t proc proc /proc
mount -t sysfs sysfs /sys
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
mdev -s
mount -t ext3 /dev/hda2  /mnt/sysroot
exec  switch_root  /mnt/sysroot  /sbin/ini

 

insmod /lib/modules/jbd.ko

insmod /lib/modules/ext3.ko

wq

chmod +x init

在busybox建立目录

mkdir mnt/sysroot –pv

rm –rf sys

mknod dev/console c 51

mknod dev/null c 1 3

tree dev/

mkdir tmp

find .| cpio –H newc –quiet –o | gzip -9> /mnt/boot/initrd.gz

cp /boot/vmlinuz-2.6.18-308.e15/mnt/boot/vmlinuz

grub-install –root-directory=/mnt /dev/had

ls /mnt/boot

看到grub

vim /mnt/boot/grub/grub.conf

default=0

timeout=3

title PENGPeng

         root(hd0,0)

         kernel/vmlinuz ro root=/dev/hda2

         initrd/initrd.gz

        

cd busybox-1.20.2

cp _install/* /mnt/sysroot –a

cd /mnt/sysroot

rm linuxrc

mkdir proc sys dev tmp var/{log,lock,run}lib/modules etc/rc.d/init.d root boot mnt media –pv

ls sbin/

vim etc/inittab

::sysinit:/etc/rc.d/rc.sysinit

console::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a –r

vim etc/fstab

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/hda1               /boot                   ext3    defaults       0 0

/dev/hda2               /                       ext3    defaults        1 1

mknod dev/console c 5 1

mkmod dev/null c 1 3

vim etc/rc.d/rc.sysinit

#!/bin/sh

echo -e "\tWelcome to  \033[31mMageEdu\033[0m Linux"

 

echo -e "Remounting the rootfilesystem ..."

mount -t proc proc /proc

mount -t sysfs sysfs /sys

mount -o remount,rw  /

 

echo -e "Creating the files of device..."

mdev -s

 

echo -e "Mounting the filesystem..."

mount -a

swapon –a

chmod +x etc/rc.d/rc.sysinit

sync

在busybox添加sys目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值