您的当前位置:首页 --> CentOS入门 |
CentOS中定制精简出属于自己的专属Linux |
浏览次数:1740 关键词 ( 自己的 CentOS Linux ) |
前言:
1. 在虚拟机上添加一块新硬盘到linux,大小20G (可以自定)
2. 打开终端,使用fdisk格式化分区刚才挂载的新硬盘/dev/sdb,划分出一个100M大小的主分区和一个1G大小的主分区 1). 查看新增加硬盘 fdisk –l 1 2 3 4 5 6 7 8 9 10 11 12 13 14 fdisk -l Disk /dev/sda: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 33 265041 83 Linux /dev/sda2 34 1308 10241437+ 83 Linux /dev/sda3 1309 1945 5116702+ 83 Linux /dev/sda4 1946 2610 5341612+ 5 Extended /dev/sda5 1946 2072 1020096 82 Linux swap / Solaris Disk /dev/sdb: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdb doesn't contain a valid partition table2). 分区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [root@localhost ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. The number of cylinders for this disk is set to 2610. 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) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-2610, default 2610): +100M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (14-2610, default 14): Using default value 14 Last cylinder or +size or +sizeM or +sizeK (14-2610, default 2610): +1G Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@localhost ~]#3). 重读下分区表 1 2 [root@localhost ~]# partprobe /dev/sdb [root@localhost ~]#4). 格式化为ext3文件系统 1 2 [root@localhost ~]# mke2fs -j /dev/sdb1 [root@localhost ~]# mke2fs -j /dev/sdb25). 将刚格式化好的分区/dev/sdb1挂载到/mnt/boot /dev/sdb2挂载到/mnt/sysroot 1 2 3 4 [root@localhost ~]# mkdir -p /mnt/boot [root@localhost ~]# mkdir -p /mnt/sysroot [root@localhost ~]# mount /dev/sdb1 /mnt/boot/ [root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/6). 查看挂载分区 1 2 3 4 5 6 7 8 9 10 11 12 13 [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/sda3 on /data type ext3 (rw) /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/sdb1 on /mnt/boot type ext3 (rw) /dev/sdb2 on /mnt/sysroot type ext3 (rw) [root@localhost ~]#3. 安装grub到/dev/sdb,并增加grub.conf配置文件 1). 安装grub 1 2 3 4 5 6 7 8 [root@localhost ~]# grub-install --root-directory=/mnt/ /dev/sdb 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/sda (hd1) /dev/sdb2). 修改/mnt/boot/grub/device/map 1 2 3 4 [root@localhost ~]# vim /mnt/boot/grub/device.map (fd0) /dev/fd0 #去掉这一行 fd指的是软盘 (hd0) /dev/sda (hd1) /dev/sdb #去掉这一行4. 复制kernel和initrd到小linux中 1 2 3 [root@localhost ~]# cp /boot/vmlinuz-2.6.18-194.el5 /mnt/boot/vmlinuz [root@localhost ~]# cp /boot/initrd-2.6.18-194.el5.img /mnt/boot/initrd [root@localhost ~]#5. 解压缩initrd, 编辑里面的init文件,然后重新压缩封装 1) .解压缩initrd 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@localhost boot]# cd /mnt/boot/ [root@localhost boot]# ls grub initrd lost+found vmlinuz [root@localhost boot]# file initrd initrd: gzip compressed data, from Unix, last modified: Wed May 22 21:03:38 2013, max compression #压缩文件 [root@localhost boot]# mv initrd /tmp/initrd.gz [root@localhost boot]# cd /tmp/ [root@localhost tmp]# ls initrd.gz [root@localhost tmp]# gzip -d initrd.gz [root@localhost tmp]# file initrd initrd: ASCII cpio archive (SVR4 with no CRC) #cpio 打包文件 [root@localhost tmp]# cpio -id < initrd 13942 blocks [root@localhost tmp]# ls bin dev etc init initrd lib proc sbin sys sysroot2). 修改init文件 1 2 3 4 5 6 7 [root@localhost tmp]# vim init 87 #resume LABEL=SWAP-sda5 #将swap注释,我们这里没有swap分区 88 echo Creating root device. 89 mkrootdev -t ext3 -o defaults,ro sda2 #修改为mkrootdev -t ext3 -o defaults,ro /dev/sda2 [root@localhost tmp]# find . | cpio -H newc --quiet -o | gzip -9 >/mnt/boot/initrd.gz [root@localhost boot]# ls grub initrd.gz lost+found vmlinuz6. 增加grub.conf文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@localhost grub]# pwd /mnt/boot/grub [root@localhost grub]# ls device.map iso9660_stage1_5 stage1 xfs_stage1_5 e2fs_stage1_5 jfs_stage1_5 stage2 fat_stage1_5 minix_stage1_5 ufs2_stage1_5 ffs_stage1_5 reiserfs_stage1_5 vstafs_stage1_5 [root@localhost grub]# vim grub.conf default=0 timeout=3 title freeloda linux root (hd0,0) kernel /vmlinuz initrd /initrd.gz :wq [root@localhost grub]#7. 建立真正的根目录/mnt/sysroot 1). 创建必须的文件目录 1 2 3 4 [root@localhost var]# mkdir -p sys etc/{rc.d,init.d} root boot bin sbin var/{log,lock,run} dev home tmp lib lib64 usr/{bin,sbin} proc [root@localhost var]# ls bin boot dev etc home lib lock log root run sbin sys tmp usr var [root@localhost var]#2). 配置系统启动文件etc/inittab 1 2 3 4 [root@localhost sysroot]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit :wq3). 配置增加启动脚本/etc/rc.d/rc.sysinit 1 2 3 4 5 6 7 8 [root@localhost rc.d]# vim rc.sysinit #!/bin/bash # echo "Welcome freeloda little linux !" mount -n -o remount.rw / #以读写方式重新挂载根 mount -n –a #挂载所有设备,并不记录 /bin/bash #启动bash :wq4). 对脚本增加执行权限 1 2 3 4 [root@localhost rc.d]# chmod +x rc.sysinit [root@localhost rc.d]# ll total 4 -rwxr-xr-x 1 root root 63 Jun 12 23:58 rc.sysinit8. 复制命令到小型linux里去 1). 如何复制? 1 2 3 4 5 6 7 8 9 10 11 [root@localhost lib64]# which bash #使用which命令查看命令所在路径 /bin/bash [root@localhost lib64]# [root@localhost lib64]# ldd /bin/bash #ldd 加命令路径可以显示出这个命令所依赖的库文件 libtermcap.so.2 => /lib64/libtermcap.so.2 (0x0000003bac600000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003bac200000) libc.so.6 => /lib64/libc.so.6 (0x0000003babe00000) /lib64/ld-linux-x86-64.so.2 (0x0000003baba00000) [root@localhost lib64]# cp -p /lib64/libtermcap.so.2 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/ #将上面的库文件都复制到小linux对应的目录 [root@localhost lib64]# ls ld-linux-x86-64.so.2 libc.so.6 libdl.so.2 libtermcap.so.22). 继续复制 init 和bash,mount , ls 这几个个命令去小linux,注意,init和bash必须复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 init 命令 [root@localhost lib64]# which init /sbin/init [root@localhost lib64]# ldd /sbin/init libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003bace00000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003bad200000) libc.so.6 => /lib64/libc.so.6 (0x0000003babe00000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003bac200000) /lib64/ld-linux-x86-64.so.2 (0x0000003baba00000) [root@localhost lib64]# cp -p /lib64/libsepol.so.1 /lib64/libselinux.so.1 /lib64/libc.so.6 /lib64/libdl.so.2 /lib64/ld-linux-x86-64.so.2 ./ cp: overwrite `./libc.so.6'? y cp: overwrite `./libdl.so.2'? y cp: overwrite `./ld-linux-x86-64.so.2'? y [root@localhost lib64]# ls a.out ld-linux-x86-64.so.2 libc.so.6 libdl.so.2 libselinux.so.1 libsepol.so.1 libtermcap.so.2 [root@localhost lib64]# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 mount 命令 [root@localhost lib64]# which mount /bin/mount [root@localhost lib64]# ldd /bin/mount libblkid.so.1 => /lib64/libblkid.so.1 (0x0000003bada00000) libuuid.so.1 => /lib64/libuuid.so.1 (0x0000003bad600000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003bad200000) libc.so.6 => /lib64/libc.so.6 (0x0000003babe00000) libdevmapper.so.1.02 => /lib64/libdevmapper.so.1.02 (0x0000003baca00000) /lib64/ld-linux-x86-64.so.2 (0x0000003baba00000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003bac200000) libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003bace00000) [root@localhost lib64]# cp -p /lib64/libblkid.so.1 /lib64/libuuid.so.1 /lib64/libselinux.so.1/lib64/libc.so.6 /lib64/libdevmapper.so.1.02 /lib64/ld-linux-x86-64.so.2 /lib64/libdl.so.2/lib64/libsepol.so.1 ./ cp: overwrite `./libselinux.so.1'? y cp: overwrite `./libc.so.6'? y cp: overwrite `./ld-linux-x86-64.so.2'? y cp: overwrite `./libdl.so.2'? y cp: overwrite `./libsepol.so.1'? y [root@localhost lib64]# ls a.out libblkid.so.1 libdevmapper.so.1.02 libselinux.so.1 libtermcap.so.2 ld-linux-x86-64.so.2 libc.so.6 libdl.so.2 libsepol.so.1 libuuid.so.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ls 命令 [root@localhost lib64]# which ls alias ls='ls --color=tty' /bin/ls [root@localhost lib64]# ldd /bin/ls librt.so.1 => /lib64/librt.so.1 (0x0000003bada00000) libacl.so.1 => /lib64/libacl.so.1 (0x0000003bae600000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003bad200000) libc.so.6 => /lib64/libc.so.6 (0x0000003babe00000) libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003bac600000) /lib64/ld-linux-x86-64.so.2 (0x0000003baba00000) libattr.so.1 => /lib64/libattr.so.1 (0x0000003bad600000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003bac200000) libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003bace00000) [root@localhost lib64]# cp -p /lib64/librt.so.1 /lib64/libacl.so.1 /lib64/libselinux.so.1 /lib64/libc.so.6 /lib64/libpthread.so.0 /lib64/ld-linux-x86-64.so.2 /lib64/libattr.so.1 /lib64/libdl.so.2 /lib64/libsepol.so.1 ./ cp: overwrite `./libselinux.so.1'? y cp: overwrite `./libc.so.6'? y cp: overwrite `./ld-linux-x86-64.so.2'? y cp: overwrite `./libdl.so.2'? y cp: overwrite `./libsepol.so.1'? y [root@localhost lib64]# ls a.out libacl.so.1 libblkid.so.1 libdevmapper.so.1.02 libpthread.so.0 libselinux.so.1 libtermcap.so.2 ld-linux-x86-64.so.2 libattr.so.1 libc.so.6 libdl.so.2 librt.so.1 libsepol.so.1 libuuid.so.1 [root@localhost lib64]#3). 复制相应的命令脚本 bash init mount ls 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@localhost lib64]# which bash /bin/bash [root@localhost lib64]# cp -p /bin/bash /mnt/sysroot/bin/ [root@localhost lib64]# which init /sbin/init [root@localhost lib64]# cp -p /sbin/init /mnt/sysroot/sbin/ [root@localhost lib64]# which mount /bin/mount [root@localhost lib64]# cp -p /bin/mount /mnt/sysroot/bin/ [root@localhost lib64]# which ls alias ls='ls --color=tty' /bin/ls [root@localhost lib64]# cp -p /bin/ls /mnt//sysroot/bin/ [root@localhost lib64]#9. 创建 /mnt/sysroot/etc/fstab文件 1 2 3 4 5 [root@localhost bin]#vim /mnt/sysroot/etc/fstab /dev/sda2 / ext3 defaults 0 0 /dev/sda1 /boot ext3 defaults 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0好了,大功告成,新建一个虚拟机,选择CentOS 5 64 ,挂载上这块硬盘看下效果吧! 10. 效果图如下 1). 效果图1
2). 效果图2
3). 效果图3
1. 写一个脚本,实现对二进制命令及相应库文件的复制 (1). 目的:
(2). 具体要求如下:
1)、写一个函数,接受两个参数(参数1,为要复制的命令,参数2,为复制命令对应的目标位置,如/mnt/sysroot),完成以下功能:
b. 复制命令的同时,判定此命令所依赖的库文件,而后对每一个库文件做如下操作,取得其目录路径,及命令对应的文件的名字,而后将此命令复制到“参数2” 对应的路径下,跟此命令原来的目录路径相同的子目录中;但如果此库文件已经复制过,则不需要再次复制。 (3). 具体脚本如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 vim addcom.sh #!/bin/bash # DEST=/mnt/sysroot DIRE() { if [ -d $DEST/$CMD ]; then echo "this direstory is inxted" else mkdir -p $DEST/$CMD &> /dev/null echo "$CMD is a directory,mkdir finished" fi } libcp() { LIBPATH=${1%/*} [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib64 $1 finished." } bincp() { CMDPATH=${1%/*} [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH for LIB in `ldd $1 | grep -o "/.*lib64/[^[:space:]]\{1,\}"`; do libcp $LIB done } read -p "Your command: " CMD until [ $CMD == 'q' ]; do which $CMD &>/dev/null MM=`echo $?` if [ $MM -eq 0 ]; then ! which $CMD && echo "Wrong command" && read -p "Input againe: " CMD && continue COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"` bincp $COMMAND echo "copy $COMMAND finished." read -p "Continue: " CMD else DIRE read -p "Continue: " CMD fi done :wq注意:我这边的操作系统是CentOS 5.5 64位操作系统,所有的lib文件都在/mnt/sysroot/lib64中,若你是32位系统,请修改16与22行,将lib64目录改为lib目录! (4). 效果如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@localhost ~]# sh addcom.sh Your command: ifconfig /sbin/ifconfig copy /sbin/ifconfig finished. Continue: [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# /mnt/sysroot/sbin/ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:16:63:C0 inet addr:192.168.1.116 Bcast:255.255.255.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe16:63c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19633 errors:0 dropped:0 overruns:0 frame:0 TX packets:13649 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4932356 (4.7 MiB) TX bytes:2409236 (2.2 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:32 errors:0 dropped:0 overruns:0 frame:0 TX packets:32 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:6138 (5.9 KiB) TX bytes:6138 (5.9 KiB)2. 实现关机与重启功能 1)、修改inittab文件 1 2 3 4 5 6 7 [root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit #新增两行 l0:0:wait:/etc/rc.d/rc 0 l6:6:wait:/etc/rc.d/rc 6 : wq2)、复制两个命令reboot和halt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@localhost ~]# sh addcom.sh Your command: reboot /sbin/reboot copy /sbin/reboot finished. Continue: halt /sbin/halt copy /sbin/halt finished. Continue: sync /bin/sync copy /bin/sync finished. [root@localhost ~]# cd /mnt/sysroot/sbin/ [root@localhost sbin]# ls halt ifconfig init reboot [root@localhost sbin]# cd /mnt/sysroot/bin [root@localhost bin]# ls bash ls mount sync [root@localhost bin]#3)、新增开关机脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@localhost init.d]# pwd /mnt/sysroot/etc/rc.d/init.d [root@localhost init.d]# vim halt #!/bin/bash # case $0 in *reboot) COMMAND='/sbin/reboot' ;; *halt) COMMAND='/sbin/halt –p' ;; *) echo "only call thsi script *reboot *halt" ;; esac exec $COMMAND :wq [root@localhost rc.d]#4)、新增 rc 脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@localhost rc.d]# pwd /mnt/sysroot/etc/rc.d [root@localhost rc.d]# ls init.d rc rc0.d rc6.d rc.sysinit [root@localhost rc.d]# vim rc #!/bin/bash # RUNLEVEL=$1 for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do $I stop done for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do $I start done :wq [root@localhost rc.d]#5)、测试效果 init 0 关机效果:
init 6 重启效果:
3. 增加 rc3.d 级别的运行脚本
1)、修改 inittab 文件 1 2 3 4 5 6 [root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l3:3:wait:/etc/rc.d/rc 3 #新增一行 l6:6:wait:/etc/rc.d/rc 62)、增加一个测试脚本 tserver 来测试第三级别的运行情况 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/bin/bash # # chkconfig: 35 55 44 # description: test service script # FILE=/var/lock/subsys/`basename $0` start() { echo "starting `basename $0`..." touch $FILE } stop() { echo "stopping `basename $0`..." rm -rf $FILE } status() { if [ -e $FILE ]; then echo "Running.." else echo "stopping..." fi } usage() { echo "please insernt like start|stop|restart|status" } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage exit 1 ;; esac3)、移植相关命令 1 2 3 4 5 6 7 8 9 [root@localhost ~]# sh addcom.sh Your command: chkconfig /sbin/chkconfig copy /sbin/chkconfig finished. Continue: basename /bin/basename copy /bin/basename finished. Continue: [root@localhost ~]#经过上面的是三个步骤,应该是可以执行的,但是还是不能执行的!我们还得进行下面的步骤! 4)、增加 rc3.d 目录和相关的软链接 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# cd /mnt/sysroot/etc/rc.d/ [root@localhost rc.d]# mkdir rc3.d [root@localhost rc.d]# ls init.d rc rc0.d rc3.d rc6.d rc.sysinit [root@localhost rc.d]# cd rc3.d [root@localhost rc3.d]# ln -sv ../init.d/tserver S55tserver [root@localhost rc.d]#cd rc0.d [root@localhost rc0.d]# ln -sv ../init.d/tserver K44tserver [root@localhost rc.d]#cd rc6.d [root@localhost rc6.d]# ln -sv ../init.d/tserver K44tserver5)、修改inittab文件 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l3:3:wait:/etc/rc.d/rc 3 l6:6:wait:/etc/rc.d/rc 6 #新增下面两行 1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1 2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2 #loginprog运行依赖/bin/sh.把bin下的bash连接为sh即可实现6)、移植 mingetty 命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: mingetty /sbin/mingetty copy /sbin/mingetty finished.7)、loginprog运行依赖/bin/sh,把bin下的bash连接为sh即可实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@localhost ~]# cd /mnt/sysroot/bin/ [root@localhost bin]# ls basename bash df ls mkdir mount sync tar touch umount [root@localhost bin]# ln -sv bash sh create symbolic link `sh' to `bash' [root@localhost bin]# ll total 1384 -rwxr-xr-x 1 root root 20984 Jun 13 04:02 basename -rwxr-xr-x 1 root root 801512 Jan 22 2009 bash -rwxr-xr-x 1 root root 43192 Jun 13 03:11 df -rwxr-xr-x 1 root root 91240 Mar 1 2010 ls -rwxr-xr-x 1 root root 31664 Jun 13 03:10 mkdir -rwsr-xr-x 1 root root 60432 Jan 20 2010 mount lrwxrwxrwx 1 root root 4 Jun 13 04:32 sh -> bash -rwxr-xr-x 1 root root 20216 Jun 13 01:18 sync -rwxr-xr-x 1 root root 230464 Jun 13 03:11 tar -rwxr-xr-x 1 root root 42696 Jun 13 03:10 touch -rwsr-xr-x 1 root root 40208 Jun 13 03:11 umount [root@localhost bin]#8)、修改 rc.sysinit 文件 1 2 3 4 5 6 7 8 [root@localhost ~]# vim /mnt/sysroot/etc/rc.d/rc.sysinit #!/bin/bash # echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux" mount -n -o remount.rw / mount -n –a /bin/bash # 删除这一行 :wq9)、测试
最后大家会发现 mingetty 只能启动两个终端,但还是不能启动 3 级别的脚本!而且还没有主机名只显示 (none),大家别急,下面我们再来完善它! 4. 增加主机名 从上图中我们可以看出没有主机名,下面我们不先添加主机名! 1)、修改 rc.sysinit 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@localhost sysconfig]# vim /mnt/sysroot/etc/rc.d/rc.sysinit #!/bin/bash # #显示开机提示符 echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux" #重新挂载垠文件系统 echo "mount /" mount -n -o remount,rw / #挂载所有文件系统 echo "mount all partitions" mount -n -a #增加主机名 echo "set the hsotname" [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network [ -z $HOSTNAME -o "$HSOTNAME" == '(none)' ] && HOSTNAME=localhost /bin/hostname $HOSTNAME2)、移植 hostname 命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: hostname /bin/hostname copy /bin/hostname finished.3)、测试
主机名增加完成 ! 5. 开启虚拟终端 由于mingetty需要用户登陆,且无法启动三级别的脚本,下面利用agetty来进行登陆验证 1)、移植 agetty 命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: agetty /sbin/agetty copy /sbin/agetty finished.2)、修改 inittab 文件 1 2 3 4 5 6 7 8 9 10 11 12 [root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l3:3:wait:/etc/rc.d/rc 3 l6:6:wait:/etc/rc.d/rc 6 #下面两行删除 1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1 2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2 #新增下面两行 1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1 2:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty23)、测试
大家看到了吧, Tserver 启动了,而且还进入了终端!但是touch时不能新建文件是因为我们这里没有subsys目录!修改如下 4)、修正 新建subsys目录 1 2 3 4 5 6 [root@localhost ~]# cd /mnt/sysroot/var/lock/ [root@localhost lock]# ls [root@localhost lock]# mkdir subsys [root@localhost lock]# ls subsys [root@localhost lock]#再测试一下
测试成功!现在我们的小Linux 已经有了, 开关机功能,也能在 3 级别下运行脚本(服务)!下一篇博客中我们将增加网络功能 ^_^ ……
1. 定义系统启动过程中,显示服务启动信息的颜色脚本
从上图中我们看到,我们重新启动网卡时,右边会显示 [ ok ] 的绿色提示符,在上一博客中我们只简单的显示 tserver start …… 提示符现在不雅,下面我们就来修饰一下! 1)、编写 functions 脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [root@localhost ~]# vim functions #!/bin/bash # SCREEN=`stty -F /dev/console size 2>/dev/null` COLUN=${SCREEN#* } [ -z $COLUN ] && COLUN=80 SPA_COL=$[$COLUN-14] RED='\033[31m' GREEN='\033[32m' YELLOW='\033[33m' BLUE='\033[34m' RONMAL='\033[0m' success() { string=$1 RT_SPA=$[$SPA_COL-${#string}] echo -n "$string" for I in `seq 1 $RT_SPA`; do echo -n " " done echo -e "[ ${GREEN}OK${RONMAL} ]" } failure() { string=$1 RT_SPA=$[$SPA_COL-${#string}] echo -n "$string" for I in `seq 1 $RT_SPA`; do echo -n " " done echo -e "[ ${RED}FAILED${RONMAL} ]" }2)、给脚本增加执行权限 1 [root@localhost ~]# chmod +x functions3)、移植 seq 命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: seq /usr/bin/seq copy /usr/bin/seq finished.4)、然后在tserver等服务脚本内调用 functions 脚本,即可实现显示服务启动的信息! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #!/bin/bash # # chkconfig: 35 55 44 # description: chris service # #调用脚本 . /etc/init.d/functions FILE=/var/lock/subsys/`basename $0` prog=`basename $0` start() { echo "starting `basename $0`..." touch $FILE [ $? -eq 0 ] && success "Starting $prog" || failure "Starting $prog" } stop() { echo "stopping `basename $0`..." rm -rf $FILE [ $? -eq 0 ] && success "Stopping $prog" || failure "Stopping $prog" } status() { if [ -e $FILE ]; then echo "Running.." else echo "stopping..." fi } usage() { echo "please insernt like start|stop|restart|status" } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage exit 1 ;; esac5)、测试效果 开机效果:
关机效果:
有效果了吧,嘿嘿!下面我们来增加网络功能!
2. 增加网络功能
下面是重点,很多朋友没做成功都是这个原因!查看网卡信息,你自己的虚拟机支持的网卡与驱动。 具休查处方法如下:
1). 查看物理网卡的驱动信息 1 2 3 4 5 [root@localhost ~] # ethtool -i eth0 driver: e1000 version: 7.3.21-k8-NAPI firmware-version: bus-info: 0000:02:00.0
2). 查看网卡的物理硬件型号 1 2 [root@localhost ~] # lspci | grep -i ethernet 02:00.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
3). 查看该设备的模块信息 1 2 3 4 5 6 7 [root@localhost ~] # modinfo e1000 filename: /lib/modules/2.6.32-279.14.1.el6.i686/kernel/drivers/net/e1000/e1000.ko version: 7.3.21-k8-NAPI license: GPL description: Intel(R) PRO/1000 Network Driver author: Intel Corporation, <linux.nics@intel.com> srcversion: 1B96AEAA963BB7C0044BA00
案例如下:(我这里说两个例子,一个是RedHat 5.8 一个是CentOS 5.5) ReadHat 5.8 环境 1)、 虚拟机的网卡 查找 pcnet32 模块 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@localhost ~]# modinfo pcnet32 filename: /lib/modules/2.6.18-194.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-194.el5 SMP mod_unload 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: 883f3504bb6456c596239a507de7fd112a65a09f5faef1f984967c867e1149c0d1cfb295a3d944f009f528a8f96e85f55b72b3eb94966d22deef2fa7ea2 [root@localhost ~]#查找 mii 模块 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# modinfo mii filename: /lib/modules/2.6.18-194.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-194.el5 SMP mod_unload gcc-4.1 module_sig: 883f3504bb6456c596239a507de7fd112e5b09f55847ebc59e54b97cff863c8097bf32f8f320e90a0a5a1b8a45b5f58a468d592bde47be53a7ca7f8 [root@localhost ~]#2)、创建相应目录 1 2 3 4 [root@localhost ~]# cd /mnt/sysroot/ [root@localhost sysroot]# ls ./ lib/ lib64/ [root@localhost sysroot]# mkdir ./lib/modules3)、复制相应的模块 1 2 3 4 5 [root@localhost sysroot]# cp -p /lib/modules/2.6.18-194.el5/kernel/drivers/net/pcnet32.ko ./lib/modules/ [root@localhost sysroot]# cp -p /lib/modules/2.6.18-194.el5/kernel/drivers/net/mii.ko ./lib/modules/ [root@localhost sysroot]# ls ./lib/modules/ mii.ko pcnet32.ko [root@localhost sysroot]#4)、修改 rc.sysinit 文件 1 [root@localhost sysroot]# vim ./etc/rc.d/rc.sysinit#增加网络功能模块 1 2 3 echo "insmod pcnet32 mode" /sbin/insmod /lib/modules/mii.ko /sbin/insmod /lib/modules/pcnet32.ko5)、移植相关命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: insmod /sbin/insmod copy /sbin/insmod finished.6)、增加网卡配置文件 1 2 3 4 5 6 7 8 9 [root@localhost ~]# mkdir -p /mnt/sysroot/etc/sysconfig/network-scripts [root@localhost ~]# vim /mnt/sysroot/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static IPADDR=192.168.18.10 NETMASK=255.255.255.0 GATEWAY=192.168.18.254 ONBOOT=yes :wq7)、创建相对应脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [root@localhost ~]# vim /mnt/sysroot/etc/init.d/network #!/bin/bash # # chkconfig: 35 09 90 # description:network servce . /etc/rc.d/init.d/functions CONF=/etc/sysconfig/network-scripts/ifcfg-eth0 . $CONF start () { NETMASK=16 ifconfig eth0 $IPADDR/$NETMASK up [ -z $GATEWAY ] && route add default gw $GATEWAY } stop() { ifconfig eth0 down } status () { ifconfig eth0 } usage() { ehco "like start,stop,restart" } case $1 in start) start success "config network eth0 " ;; stop) stop success "stop network eth0" ;; restart) stop Start success "restart network eth0" ;; status) status ;; *) usage ;; esac8)、增加执行权限 1 [root@localhost ~]# chmod +x /mnt/sysroot/etc/init.d/network9)、移植 ifconfig 命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: ifconfig /sbin/ifconfig copy /sbin/ifconfig finished.10)、创建软链接 1 2 3 4 5 6 7 8 9 10 11 12 [root@localhost rc0.d]# ln -sv ../init.d/network K90network create symbolic link `K90network' to `../init.d/network' [root@localhost rc0.d]# ls K44tserver K90network S99halt [root@localhost rc6.d]# ln -sv ../init.d/network K90network create symbolic link `K90network' to `../init.d/network' [root@localhost rc6.d]# ls K44tserver K90network S99reboot [root@localhost rc3.d]# ln -sv ../init.d/network S09network create symbolic link `S09network' to `../init.d/network' [root@localhost rc3.d]# ls S09network S55tserver11)、测试效果如下
CentOS 5.5 环境,这个是我自己测试的环境,照着做的朋友请注意!与上面不同的是,我这里的网卡和驱动如下图, 1)、查看网卡与驱动类型
2)、复制相关驱动到 /lib/modules 下如下图,
3)、修改 rc.sysinit 文件,如下图
4)、移植相关命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: insmod /sbin/insmod copy /sbin/insmodfinished.5)、增加网卡配置文件 1 2 3 4 5 6 7 8 9 [root@localhost ~]# mkdir -p /mnt/sysroot/etc/sysconfig/network-scripts [root@localhost ~]# vim /mnt/sysroot/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static IPADDR=192.168.18.10 NETMASK=255.255.255.0 GATEWAY=192.168.18.254 ONBOOT=yes :wq6)、创建相对应脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [root@localhost ~]# vim /mnt/sysroot/etc/init.d/network #!/bin/bash # # chkconfig: 35 09 90 # description:network servce . /etc/rc.d/init.d/functions CONF=/etc/sysconfig/network-scripts/ifcfg-eth0 . $CONF start () { NETMASK=16 ifconfigeth0 $IPADDR/$NETMASK up [ -z $GATEWAY ] && route add default gw $GATEWAY } stop() { ifconfigeth0 down } status () { ifconfigeth0 } usage() { ehco "like start,stop,restart" } case$1 in start) start success "config network eth0 " ;; stop) stop success "stop network eth0" ;; restart) stop Start success "restart network eth0" ;; status) status ;; *) usage ;; esac7)、增加执行权限 1 [root@localhost ~]# chmod +x /mnt/sysroot/etc/init.d/network8)、移植 ifconfig 命令 1 2 3 4 [root@localhost ~]# sh addcom.sh Your command: ifconfig /sbin/ifconfig copy /sbin/ifconfigfinished.9)、创建软链接 1 2 3 4 5 6 7 8 9 10 11 12 [root@localhost rc0.d]# ln -sv ../init.d/network K90network create symbolic link `K90network' to `../init.d/network' [root@localhost rc0.d]# ls K44tserver K90network S99halt [root@localhost rc6.d]# ln -sv ../init.d/network K90network create symbolic link `K90network' to `../init.d/network' [root@localhost rc6.d]# ls K44tserver K90network S99reboot [root@localhost rc3.d]# ln -sv ../init.d/network S09network create symbolic link `S09network' to `../init.d/network' [root@localhost rc3.d]# ls S09network S55tserver10)、测试效果如下
IP地址顺利的配置上去了,嘿嘿! 11)、相关操作演示如下 为lo配置IP地址,
ping 测试,
由于我的网卡是桥接的,下面我们测试一下,ping网关
所有测试结束,嘿嘿!有兴趣的朋友可以尝试的做一下!
1. 用户认证 使用不依赖与PAM的login程序 (已经编译好的),系统上的login的编译是依赖于PAM的,这里的login程序,去掉了对PAM的依赖,可以单独利用!(login 文件见附件!!!) 1)、复制 nsswitch 相关文件 nsswitch:Network Service Switch网络服务转换是一个协议框架,定义了login读取相关配置文件的位置:/etc/psaawd /etc/shadow /etc/group,nsswitch的配置文件在/etc/nsswitch.conf,而nsswitch的运行则依赖一些库文件:/lib/libnss*、/usr/lib/libnss*! 注意:复制库的时候必须保留库的连接:cp –d 1 2 3 4 5 6 7 8 [root@localhost ~]# cp -d /lib/libnss_files* /mnt/sysroot/lib [root@localhost ~]# cp -d /usr/lib/libnss_files.so/mnt/sysroot/usr/lib/ [root@localhost ~]# mkdir /mnt/sysroot/usr/lib [root@localhost ~]# cp -p /usr/lib/libnss3.so /usr/lib/libnssckbi.so /usr/lib/libnssutil3.so /mnt/sysroot/usr/lib/ [root@localhost ~]# cp -d /lib64/libnss_files* /mnt/sysroot/lib64 [root@localhost ~]# cp -d /usr/lib64/libnss_files.so/mnt/sysroot/usr/lib64/ [root@localhost ~]# mkdir /mnt/sysroot/usr/lib64 [root@localhost ~]# cp -p /usr/lib64/libnss3.so /usr/lib64/libnssckbi.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64/2)、复制并修改 nsswitch 配置文件 1 2 3 4 5 6 7 8 [root@localhost ~]# cp -p /etc/nsswitch.conf /mnt/sysroot/etc/ [root@localhost ~]# [root@localhost ~]# vim /mnt/sysroot/etc/nsswitch.conf #只保留以下内容 passwd: files shadow: files group: files hosts: files dns3)、创建用户、密码、组 1 2 3 4 [root@localhost etc]# grep -E "^root\>" /etc/passwd > /mnt/sysroot/etc/passwd [root@localhost etc]# grep -E "^root\>" /etc/shadow > /mnt/sysroot/etc/shadow [root@localhost etc]# grep -E "^root\>" /etc/group> /mnt/sysroot/etc/group [root@localhost ~]# grep -E "^root\>" /etc/gshadow >/mnt/sysroot/etc/gshadow4)、移植相关命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@localhost ~]# sh addcom.sh Your command: mingetty /sbin/mingetty copy /sbin/mingetty finished. Continue: useradd /usr/sbin/useradd copy lib64 /lib64/libaudit.so.0 finished. copy /usr/sbin/useradd finished. Continue: usermod /usr/sbin/usermod copy /usr/sbin/usermod finished. Continue: passwd /usr/bin/passwd copy lib64 /usr/lib64/libuser.so.1 finished. copy lib64 /lib64/libgobject-2.0.so.0 finished. copy lib64 /lib64/libgmodule-2.0.so.0 finished. copy lib64 /lib64/libglib-2.0.so.0 finished. copy lib64 /usr/lib64/libpopt.so.0 finished. copy lib64 /lib64/libpam_misc.so.0 finished. copy lib64 /lib64/libpam.so.0 finished. copy /usr/bin/passwd finished. Continue: groupadd /usr/sbin/groupadd copy /usr/sbin/groupadd finished.5)、修改 inittab 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@localhost ~]# vim /mnt/sysroot/etc/inittab 1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1 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/bash 38400 tty1 2:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2 #增加下面两行 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty26)、下载一个编译好、不依赖PAM认证的login到bin下,并给其执行权限 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# cd /mnt/sysroot/ bin/ dev/ half/ lib/ lost+found/ remkdir/ sbin/ sys/ usr/ boot/ etc/ home/ lib64/ proc/ root/ source/ tmp/ var/ [root@localhost ~]# cd /mnt/sysroot/bin/ [root@localhost bin]# ls basename bash df hostname login ls mkdir mount ping rm sh sleep sync tar touch umount [root@localhost bin]# chmod +x login [root@localhost bin]# ls basename bash df hostname login ls mkdir mount ping rm sh sleep sync tar touch umount [root@localhost bin]#7)、终端登陆信息:(用户登陆的时候才会显示) /etc/issue内的内容,是通过终端来进行打印的,里面各式使用转移字符 1 2 3 4 5 [root@localhost ~]# cp /etc/issue /mnt/sysroot/etc/ [root@localhost ~]# vim /mnt/sysroot/etc/issue freeloda little linux ! Kernel \r on an \m http://freeloda.blog.51cto.com/8)、设定内核参数 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@localhost etc]# vim /mnt/sysroot/etc/sysctl.conf #直接编辑文件添加一行代码即可 net.ipv4.ip_forward = 1 [root@localhost etc]# vim /mnt/sysroot/etc/rc.d/rc.sysinit #添加以下内容 sysctl -p &> /dev/null [root@localhost ~]# sh addcom.sh #移植相关命令 Your command: sysctl /sbin/sysctl copy lib64 /lib64/libproc-3.2.7.so finished. copy /sbin/sysctl finished. Continue: id /usr/bin/id copy /usr/bin/id finished. Continue: q9)、移植 login 相关库文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@localhost ~]# ldd /bin/login libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00002b461e61c000) libpam.so.0 => /lib64/libpam.so.0 (0x00002b461e854000) libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00002b461ea5f000) libaudit.so.0 => /lib64/libaudit.so.0 (0x00002b461ec63000) libc.so.6 => /lib64/libc.so.6 (0x00002b461ee7b000) libdl.so.2 => /lib64/libdl.so.2 (0x00002b461f1d2000) /lib64/ld-linux-x86-64.so.2 (0x00002b461e3ff000) [root@localhost ~]# [root@localhost ~]# cp /lib64/libcrypt.so.1 /mnt/sysroot/lib64/ [root@localhost ~]# cp /lib64/libpam.so.0 /mnt/sysroot/lib64/ [root@localhost ~]# cp /lib64/libpam_misc.so.0 /mnt/sysroot/lib64/ [root@localhost ~]# cp /lib64/libaudit.so.0 /mnt/sysroot/lib64/ [root@localhost ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/ [root@localhost ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/ [root@localhost ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/)、测试效果
本文出自 “Share your knowledge …” 博客,请务必保留此出处http://freeloda.blog.51cto.com/2033581/1222552
|
下载次数:15 |
下载地址:点击下载 |
本资源为程序自动采集,如有侵权请联系我们移除 admin#80vps.com 来信请将#替换为@ |
下一条 centos系统中网络配置相关 上一条 CentOS 用户管理常用命令 |