一. 硬链接(hard link)和软链接(符号链接,Symbolic link)
1. 软链接: 类似windows上的快捷方式
inode:每当创建一个文件和目录的时候,都会为这个文件创建一个innode编号,这些信息都是存放在innode表里
# ll /etc/grub.conf
lrwxrwxrwx 1 root root 22 Mar 27 03:14 /etc/grub.conf -> ../boot/grub/grub.conf
如何查看两个文件内容是否一致?
diff /etc/grub.conf /boot/grub/grub.conf --没有输出表示两文件一样
# md5sum /etc/grub.conf --值一样表示两文件一样
35118be6c622c3973bcb58078fd1aeed /etc/grub.conf
# md5sum /boot/grub/grub.conf
35118be6c622c3973bcb58078fd1aeed /boot/grub/grub.conf
ln - make links between files
# pwd
/test
# touch 1
# ln -s 1 /boot/2 --这样做的/boot/2是一个死链接
# ln -s /test/1 /boot/2 --正确做法使用绝对路径
# ldd /bin/ls
linux-vdso.so.1 => (0x00007fff2c14d000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003d12200000)
librt.so.1 => /lib64/librt.so.1 (0x0000003d11600000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003d14200000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003511800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003d10a00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d10600000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d10200000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d10e00000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003d1f200000)
如果mv /lib64/libselinux.so.1 /lib64/libselinux.so.1.bak这个库,可以用ln -s 做个软链接回来
如果rm /lib64/libselinux.so.1 -rf 删除了这个库,你可以使用图形的firefox去下载别人的httpd共享(其它的方法基本都行不通)
特点:
1,它会创建一个新的innode编号,相当是一个独立的文件
2,它类似于windows下的快捷方式,访问的时候多了一个中转的过程,最终访问的内容就是它链接的目标文件
3,它可以跨分区创建
4,它可以对目录进行链接
5,如果目标文件删除了,那么链接文件就变成死链接
2. 硬链接(相当于备份)
# touch 1
# ln 1 2
# ll -i
total 4
327367 -rw-r--r-- 2 root root 0 Apr 18 09:56 1
327367 -rw-r--r-- 2 root root 0 Apr 18 09:56 2
# ln 3 /boot/4
ln: creating hard link `/boot/4' to `3': Invalid cross-device link
# ln a b
ln: `a': hard link not allowed for directory
特点:
1,它不会新创建一个innode编号,不代表一个独立的文件
2,它不能跨分区创建
3,它相当于是为文件创建了一个冗余,相当于一个备份
4,不能手工对目录进行硬链接
系统上默认还是有一些目录硬链接的
# pwd
/var/mail
# pwd -P
/var/spool/mail
# ll -id /var/mail/
1705023 drwxrwxr-x. 2 root mail 4096 Jul 18 09:47 /var/mail/
# ll -id /var/spool/mail/
1705023 drwxrwxr-x. 2 root mail 4096 Jul 18 09:47 /var/spool/mail/
# ll -id /etc/init.d/
393312 drwxr-xr-x. 2 root root 4096 Jul 18 16:45 /etc/init.d/
# ll -id /etc/rc.d/init.d/
393312 drwxr-xr-x. 2 root root 4096 Jul 18 16:45 /etc/rc.d/init.d/
# ll -di /etc/httpd/logs/
1835199 drwx------. 2 root root 4096 Jul 15 00:19 /etc/httpd/logs/
# ll -di /var/log/httpd/
1835199 drwx------. 2 root root 4096 Jul 15 00:19 /var/log/httpd/
二. linux运行级别
# vim /etc/inittab
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this) --关机
# 1 - Single user mode --单用户模式
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)--多用户模式,但没有NFS,没有网络
# 3 - Full multiuser mode --带网络的文本多用户模式,如果3模式没有网络的话就和2模式一样
# 4 - unused --保留
# 5 - X11 --图形模式
# 6 - reboot (Do NOT set initdefault to this) --重启
#
id:5:initdefault: --设定开机后默认的启动级别,不要设成0或者6,如果设成0或者6致命开机不了,在grub的选择界面按E编辑这一次启动进入5模式(临时,只对这次进系统有效),进入后再修改/etc/initab(这是永久生效)
# runlevel --现在是5级别
N 5 --表示第一次的级别为5
使用ctrl+alt+F2切换登录后,再使用runlevel看到还是5级别
# init 3 --用这个命令才能完全切换到3级别
# runlevel
5 3 --表示由5级别切成3级别
切换为3级别后使用ctrl+alt+F1也切换不回来图形了,因为已经是完全的3级别了
在3级别要启动图形startx或gdm,init 5
三. 服务管理
手动启动或关闭服务,与开机自动自动启动服务无关
service httpd start
service httpd stop
service httpd restart
/etc/init.d/httpd restart
/etc/init.d/和/etc/rc.d/init.d 目录下存放的都是服务启动脚本
对于一个服务脚本,一般都有下面两行注释
# chkconfig: - 85 15
- 代表2345级别,如果要自定级别的话在这里可以用数字表示,例如:23
85 代表开机时启动的顺序号为85
15 代表关机时关闭服务的顺序号为15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
chkconfig - updates and queries runlevel information for system services
# chkconfig --list --查看服务开机在各个级别是否启动
NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off
acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off
apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# chkconfig --list |grep httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
修改httpd服务开机后不自动启动
# chkconfig httpd off
# chkconfig --list |grep httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
修改httpd服务开机后自动启动
# chkconfig httpd on
# chkconfig --list |grep httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
可以针对特定的级别来设定开机后自动启动或者关闭
# chkconfig httpd off --level 23
# chkconfig --list |grep httpd
httpd 0:off 1:off 2:off 3:off 4:on 5:on 6:off
删除一个服务(--只是chkconfig命令看不到了)
# chkconfig --del httpd
# chkconfig --list |grep httpd
添加一个服务(相对于chkconfig --del)
# chkconfig --add httpd
# chkconfig --list |grep httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
如果你自己写了一个服务的启动脚本,如何让它支持chkconfig
有两点要求:1, 服务脚本要存在于/etc/init.d或者是/etc/rc.d/init.d,必须要执行权限
2, 就是要有 # chkconfig:
# description: 这两行
#!/bin/bash
#
# hello say hello
#
# chkconfig: 2345 80 10
# description: say hello to you
#
echo hello
S表示start
K表示kill
K15httpd 和 S85httpd对应chkconfig: - 85 15里的85和15这两个数字
# ls /etc/rc0.d/ 到/etc/rc6.d/里全是软链接,为什么?
答案:因为有0-6多个级别,同一个服务脚本在每个级别里有不同的应用(有些是启动,有些是关闭)。如果对一个服务脚本有修改的需求,得去0-6这七个目录里都修改一次。所以linux设计全部软链接到/etc/init.d/目录,如果要修改只改一次就可以了。
# ntsysv --level 2345
按照当前所学建议只留下haldaemon,messagebus,network,rsyslog,sshd,vmware这六个
特别是haldaemon,messagebus这两个,少一个就会造成开机后鼠标键盘动不了
优化完后,使用下面的命令查出5级别自动开机的服务,确认OK
# chkconfig --list |grep 5:on |awk '{print $1}'
四. 系统开机启动过程
开机-->bios或EFI(配置主板的程序,BIOS=basic input and output system,EFI=Extensible Firmware Interface加电自检,找到启动设备的编号)-->找到mbr(master bootloader record,它是属于硬盘的0磁盘0扇区,硬盘最前的512个节点)-->grub(双系统,选择其一启动)-->通过grub找到vmlinuz和initramfs(驱动硬件)--> 内核启动,产生init进程-->/etc/inittab(确定系统的启动级别)-->/etc/rc.sysinit(获取主机的网络环境和主机类型,测试与载入设备,是否启动selinux,模块的加载,设置系统时间.....)-->/etc/fstab-->按照inittab里的级别来对应的启动/etc/rcX.d/里的服务-->/etc/rc.local-->gdm系统登录
/etc/rc.local --写上你在登录前要自动做的命令或脚本
mount /soft/rhel-server-6.3-x86_64-dvd.iso /yum/ -o loop
# ll /etc/rc5.d/S99local --这是一个软链接,如果这个软链接没了,则你写到/etc/rc.local里的命令也不会生效
lrwxrwxrwx. 1 root root 11 Jul 14 07:26 /etc/rc5.d/S99local -> ../rc.local
让开机后自动关机的方式有很多
1,inittab默认级别改为0
2,/etc/rc.local里加一句init 0
3,在一定要自启动的服务脚本里如/etc/init.d/network里加一句init 0
4, 在环境变量文件如/root/.bash_profile里加init 0
5, 在时间任务里定义一个时间init 0
五. grub
1. grub 就是一个boot loader程序
# rpm -qa |grep grub
grub-0.97-77.el6.x86_64
# rpm -qi grub-0.97-77.el6.x86_64
Summary : Grand Unified Boot Loader.
Description :
GRUB (Grand Unified Boot Loader) is an experimental boot loader
capable of booting into most free operating systems - Linux, FreeBSD,
NetBSD, GNU Mach, and others as well as most commercial operating
systems.
# vim /boot/grub/grub.conf
--如果是使用了efi分区(/boot/efi)的话,路径则在# vim /boot/efi/EFI/redhat/grub.conf
default=0 --默认进第一个系统
timeout=5 --有5秒选择时间,这里可以写负数,指的是一直在等待,一定要用户选择
splashimage=(hd0,0)/grub/splash.xpm.gz --指的是grub界面的图片,hd0是由/boot/grub/device.map来指定
title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
root (hd0,0) --boot分区
kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM.UTF-8 rhgb quiet
initrd /initramfs-2.6.32-279.el6.x86_64.img
rhgb表示redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg也可以看到
quiet表示在启动过程中只有重要信息显示,类似硬件自检的消息不回显示
问题1:假设现在的系统分区情况如下
/dev/sda1 /boot
/dev/sda2 swap
/dev/sda3 /
那么它的启动应该按下面的写法
title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rhgb quiet
initrd /initramfs-2.6.32-279.el6.x86_64.img
如果分区情况如下
/dev/sda1 /
/dev/sda2 swap
请问我的grub.conf应该如何写
title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda1 rhgb quiet
initrd /boot/initramfs-2.6.32-279.el6.x86_64.img
问题2:假设我现在的/etc/fstab文件如下
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
/dev/sda3 swap swap defaults 0 0
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
我如果删除了fstab里的第一行,请问重启系统会怎么样?
结果为:启动是grub不受影响,只是系统启动后/dev/sda1分区没有挂载到/boot目录而已.
原因是grub去找vmlinuz和initramfs不是去找/boot目录的,而是去找/dev/sda1的,所以fstab不管怎么改都不会影响grub(而且按启动顺序来讲,fstab在grub之后)
问题3:假设我现在同一个硬盘上装了两个linux(我们称为linux1和linux2),分区情况如下:
/dev/sda1 /boot --第一个系统boot分区
/dev/sda2 / --第一个系统的根
/dev/sda3 swap
/dev/sda4 extended
/dev/sda5 / --第二个系统的根,它没有分boot分区
两个linux到底用的是谁的grub?
在装第二个系统时有一步叫install boot loader on /dev/sda前打勾,那么它会覆盖第一个系统的grub,就会使用第二个系统的grub;如果没有打勾,那就是用的第一系统的grub
如果使用第二个系统的grub,它里面是否能引导第一个系统呢?
如果第一系统是windows,第二个系统是linux,那么默认就可以引导windows
如果第一系统是linux,第二个系统也是linux,默认它没有第一个系统的引导记录,那么如何让它引导第一个系统?
结果就是你自己手动写上第一个系统的引导项就可以了
title linux01
root (hd0,0)
kernel /vmlinux-xxx ro root=/dev/sda2
initrd /initramfs-xxx
title linux02
root (hd0,4)
kernel /boot/vmlinux-xxx ro root=/dev/sda5
initrd /boot/initramfs-xxx
写上第一个系统的引导项后,我就可以引导进入第一个系统,同理也可以在第一个系统里再写上第二个系统的引导项,如果我现在想使用第一个系统的grub,又应该怎么做?
grub-install /dev/sda --这表示把当前系统的grub配置安装到sda的mbr里去覆盖别的系统的grub
制作GRUB开机画面底图splash.xpm.gz
(1)准备一幅图片,要求它的分辨率是640×480(因为grub只支持这个分辨率的图片),将图片格式转成xpm(因为grub只支持这个格式的图片),并且该xpm的图片色深必须是14,此要求用一个命令就可以完成:
# yum install ImageMagick (因为要用到convert工具)
# convert -resize 640x480 -colors 14 123.jpg splash.xpm
上面这句命令是将winner.png 转换成符合要求的图片splash.xpm
(2)我们可以这样检查图片是否符合grub的要求,用命令:
# more splash.xpm
在文件头部如果可以找到这些信息,则说明该图片可以被grub正常显示:
static char *10[] = {
"640 480 14 1",
(3) # gzip -9 splash.xpm
(4) 最后得到splash.xpm.gz,将其放到/boot/grub/路径下,替换掉原图片
2. grub加密码
给grub加密码 (防止别人在启动系统时修改grub进入1级别改你的root密码)
但是你有grub密码,别人还是可以通过rescue模式来进入你的系统)
# grub-md5-crypt --用此命令产生一个密码加密串
Password:
Retype password:
$1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/ --输两次密码就可以产生加密串
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz --在下面加上加密信息,建议加到第一个title的上面就可以了,因为它是锁这句话之后的代码
password --md5 $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/
title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM.UTF-8 rhgb quiet
initrd /initramfs-2.6.32-279.el6.x86_64.img
3. grub排错
--grub排错引导例子: 注意:做下面实验不要使用lvm,lvm不支持下面这种做法
当grub丢失,或者 grub写的有错误时,进系统时会发现grub文件找不到或者直接到grub>的界面
grub>root (hd0,0) --进到/boot分区
grub>kernel /vmlinuz-xxxxxxx ro root=LABEL=/ --root分区不要写错,label形式或者/dev/sdax形式都可以
grub>initrd /initramfs-xxxxxxxx
grub>boot --boot代表启动
进入系统后,再修改好grub,看需要再grub-install /dev/sda
4. 硬盘安装linux系统
# df -h
/dev/sda6 47G 4.0G 40G 9% /soft
准备下面这些东西,最好都放到一个专门的分区挂载目录,我这里是/dev/sda6
/soft/rhel-server-6.3-x86_64-dvd.iso
/soft/isolinux/
/soft/images/
/soft/vmlinuz
/soft/initrd.img
重启你的操作系统,在grub界面按C键
grub > root (hd0,5)
grub > kernel /vmlinuz
grub > initrd /initrd.img
grub > boot
就会进入装系统的界面,和以前装系统的过程几乎一样,只有一个地方不一样就是有一步它会问你你的安装方式,你选择hard drive,然后再会问你iso的路径,你选择/dev/sda6就可以了
本文暂时没有评论,来添加一个吧(●'◡'●)