进程管理:
pstree - display a tree of processes
进程管理:
pstree --打印进程树,可以清楚地看出进程之间的关系
init├─gnome-terminal─┬─bash───pstree --这里可以看到由init进程产生gnome-terminal,再产生bash,再产生pstree命令,进程之间有父进程和子进程的关系
│ ├─2*[bash]
│ ├─gnome-pty-helpe
│ └─{gnome-terminal}
[root@li ~]# cat /proc/2682/status
Name: hald-addon-acpi
State: S (sleeping)
SleepAVG: 81%
Tgid: 2682
Pid: 2682
PPid: 2674 --它的父进程
[root@li ~]# cat /proc/2674/status
Name: hald-runner
State: S (sleeping)
SleepAVG: 71%
Tgid: 2674
Pid: 2674
PPid: 2673
[root@li ~]# cat /proc/2673/status
Name: hald
State: S (sleeping)
SleepAVG: 90%
Tgid: 2673
Pid: 2673
PPid: 1
[root@li ~]# cat /proc/1/status
Name: init --init进程是开始启动产生的第一个进程
State: S (sleeping)
SleepAVG: 98%
Tgid: 1
Pid: 1
PPid: 0
常用的
ps -ef
ps aux
#firefox &
[root@li ~]# ps -ef |grep firefox
root 3944 3770 0 09:54 pts/1 00:00:00 /bin/sh /usr/lib/firefox-3.0.12/run-mozilla.sh /usr/lib/firefox-3.0.12/firefox
root 3961 3944 4 09:54 pts/1 00:00:01 /usr/lib/firefox-3.0.12/firefox
root 3984 3770 0 09:54 pts/1 00:00:00 grep firefox
--上面的第三句进程是本身自己grep的进程,如果查找时不想看的话,可以使用grep -v去掉,如下:
# ps -ef |grep firefox |grep -v grep
--如果上面的进程卡死,需要使用kill -9 进程号来杀掉进程
# kill -9 3944 3961
踢掉一个ssh连接
[root@li ~]# who
root :0 2011-07-05 09:40
root pts/1 2011-07-05 09:40 (:0.0)
root pts/2 2011-07-05 09:40 (:0.0)
root pts/3 2011-07-05 10:04 (li.cluster.com)
--确认pts/3是被li.cluster.com登陆
[root@li ~]# ps -ef |grep pts/3 |grep sshd
root 4064 2768 0 10:04 ? 00:00:00 sshd: root@pts/3
--查找出它的进程为4064
[root@li ~]# kill -9 4064
关于批量杀进程
# yum install httpd* -y
# /etc/init.d/httpd restart
--可以使用下面的两条命令都可以查出httpd有关的进程
[root@li ~]# ps -ef |grep httpd
[root@li ~]# lsof -i:80
下面四种方式批量杀掉httpd有关的进程
# kill -9 4205 4206 .......
# ps -ef |grep httpd |awk '{print $2}'|xargs kill -9
# killall httpd
# pkill httpd
==============================================
常用的查看系统各指标的命令
top - 14:08:28 up 4:54, 3 users, load average: 0.08, 0.12, 0.08-- 当前系统时间,up为系统正在运行,开机后运行的时间和,当前一共登录的用户,CPU负载
Tasks: 161 total, 1 running, 159 sleeping, 0 stopped, 1 zombie
Cpu(s): 4.5%us, 0.7%sy, 0.0%ni, 94.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2065980k total, 2012996k used, 52984k free, 71848k buffers
Swap: 4096564k total, 136k used, 4096428k free, 1579564k cached
load average: 0.08, 0.12, 0.08--分别代表cpu一分钟,五分钟,十五分钟的平均负载
当负载值长期大于5以上就要注意cpu负载过大,还要注意算上你的CPU核数
--下面这条命令是用apache这个web服务器的测试工具来进行负载压力测试的
[root@li ~]# ab -c 1000 -n 200000 http://10.1.1.35/ule01.txt
nice
进程状态
s sleeping 睡眠状态,有可能会被其它信号或者程序唤醒
R running 运行状态
Z 僵死进程
D 不可中断的睡眠,一般是等待硬件的唤醒
T 进程暂停
shift + > 和 shift + < 对进程进行排序
==============================
nice 优先级 范围是 -20到19 -20表示优先级最高,19最低
用户运行一个程序默认给的优先级为0
renice 对一个已经运行的进程进行nice值的调整
renice 19 pid
[root@li ~]# vim /tmp/test.sh
a=1
while [ $a -lt 1000000 ]
do
let a++
done
nice 优先级高的能够优先分配资源,跑得快,花费的时间少,负载越高,效果越明显
实验
在mysql里做一个大的update来占用资源,或者使用别的
第一个终端:
[root@li ~]# time sh /tmp/test.sh
real 0m39.363s
user 0m26.338s
sys 0m0.900s
第二个终端:
[root@li ~]# time nice --19 sh /tmp/test.sh --19 第一个是参数的横杠,第二个是负号
real 0m26.881s
user 0m26.008s
sys 0m0.871s
--对比上面的时间,可以看到 高优先级的花费的时间少
可以把上面的实验再做一次,马上用top查出-19的pid值,并使用renice修改
renice 19 9683
[root@li ~]# time sh /tmp/test.sh
real 0m34.665s
user 0m26.277s
sys 0m0.896s
[root@li ~]# time nice --19 sh /tmp/test.sh
real 0m37.231s
user 0m26.094s
sys 0m0.905s
--从上面的时间可以看出,-19优先级的半路被改为19后,所花费的时间反而多了
注意:只有管理才能把优先级往高调,普通用户只能调自己的,并且只能往低调,调低后还不能再调高
-----------------------------------------------
--查看内存使用情况
[root@li www]# free
total used free shared buffers cached
Mem: 2065980 2012420 53560 0 73192 1569380
-/+ buffers/cache: 369848 1696132
Swap: 4096564 136 4096428
第一行:total 总的物理内存
used 已经使用的物理内存
free 空闲的物理内存
shared 共享内存,它是用于unix与不同进程之间的一个数据共享,很少程序会用到,但是 oracle 会用到共享内存 --ipcs查看共享内存段的使用情况
buffers 缓冲区,用于存储速度不同步的设备或者优先级不同的设备之间的传输数据的区域。通过缓冲区,可以使进程之间的相互等待减少,从而使从速度慢的设备读入数据时,速度快的设备的操作不发生间断。
cached 因为cpu的速度比内存快,会设立一级缓存,二级缓存的cache。但linux下free命令这里的cached指的是page cache的内存,文件系统的cache
[root@li ~]# free
total used free shared buffers cached
Mem: 2066044 2013116 52928 0 6340 1660748
-/+ buffers/cache: 346028 1720016
Swap: 4096564 152 4096412
[root@li ~]# echo $[2013116-6340-1660748]
346028 --这才是实际使用的内存
[root@li ~]# echo $[52928+6340+1660748]
1720016 --这才是实际空闲的内存
--关于linux的内存释放
linux使用的内存不会象windows那样关掉一个进程或者程序,马上释放内存,
/proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches --linux下内存释放在这里指的就是丢掉cache,把这个值改为3就可以,但实际没有必要,实际生产环境不要乱用
================================================
作业管理:
jobs
linux下有前台和后台的概念,每个bash终端都可以运行自己的job,注意不能跨bash终端管理
& --后台运行符号,运行的程序不会占用你的终端
[root@li test]# firefox &
[1] 6003 --1代表job号,6003代表的就是pid(process identification)
[root@li test]# vim /etc/passwd --在这里按下ctrl+z键,作用是把job暂停到后台
[2]+ Stopped vim /etc/passwd
[root@li test]# vim /etc/shadow --再按ctrl+z放到后台,与ctrl+c(中断)不同
[3]+ Stopped vim /etc/shadow
[root@li test]# jobs --列出后台job列表,别的终端看不到的
[1] Running firefox &
[2]- Stopped vim /etc/passwd
[3]+ Stopped vim /etc/shadow
jobs -l --还要列出pid号
jobs -s --只列出暂停的jobs
jobs -r --只列出运行的jobs
[root@li test]# fg %1 --把第一个job也就是firefox调到前台来运行
firefox
--发现前台终端被占用,不能继续敲命令
[1]+ Stopped firefox --再次使用CTRL+Z把它暂停到后台
[root@li test]# jobs -l
[1] 3646 Stopped firefox
[2]- 3674 Stopped vim /etc/passwd
[3]+ 3675 Stopped vim /etc/shadow
--现在这里看到的是firefox在后台,并且是stop状态,这时候发现firefox是不可用的;
[root@li test]# bg %1 --让firefox这个job在后台由stop状态变为running状态
[1] firefox &
[root@li ~]# cp /share/soft/iso/rhel-5.4-server-i386-dvd.iso /
--拷贝命令可以加ctrl+Z放到后台暂停
[root@li ~]# jobs -l
[1] 29876 Running firefox &
[2] 29909 Stopped vim /etc/passwd
[3]- 29914 Stopped vim /etc/shadow
[4]+ 29994 Stopped cp -i /share/soft/iso/rhel-5.4-server-i386-dvd.iso /
--这里看到是stopped状态,去查看拷贝状态也没有在拷
[root@li ~]# bg %4 --让它在后台变为running状态,再去查看拷贝的大小发现确实在拷
--总结:可以看到上面的管理方式是在一个终端运行多个任务时用的;在pts终端就可以打开多个终端来进行,可能就用不着上面的方式;但是如果服务器没有安装图形,则可能会用到上面的job管理方式
=====================================================
系统开机启动过程:
开机-->bios(配置主板的程序,basic input and
output system,加电自检,找到启动设备的编号)-->
找到mbr(master bootloader record,它是属于硬盘的0磁盘0
扇区)-->grub-->通过grub找到vmlinuz和initrd(驱动硬件)
--> 内核启动,产生init进程-->/etc/inittab(确定系统的
启动级别)-->/etc/rc.sysinit(获取主机的网络环境和主机类型
,测试与载入设备,是否启动selinux,模块的加载,设置系统
时间.................)-->/etc/rc.local
系统启动流程
开机---> bois 硬件自检---> 19号中断 , 把MRB 加载
内存,bois 完成了任务,把控制全转交给Bootloader(Grub)
----> 读取grub.conf配置文件,加载相应的内核,初始化镜像文件到
内存,初始化镜像文件会加载一系列硬件驱动,把必要的硬件先驱动起来
,最终内核理解这些硬件-->产生第一个进程init--->init 读取配置
文件/etc/inittab,获取系统将要运行在哪个级别--->init 运
行rc.sysinit脚本,对系统进行初始化(配置主机名,生成/dev/下所
有设备文件,读取/etc/fstab进行分区挂载等)---> init 根据运行
解别,运行级别对应的目录下的所有服务启动脚本-->运行rc.local--
-> init 根据配置文件 产生多个终端
/sbin/mingetty ---> 各个终端分别运行login
\-----> gdm <---图形界面的登录程序
虚拟机的切换,ctrl+alt+shift+ F1~F6 切换
切换回来的话,比如切换回图形,先把ctrl+alt+shift+ F7四个键按着不动,再只松开shift键
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(这是永久生效)
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3 --这是定义六个级别启动的服务脚本,这六个目录的服务脚本全是做的
l4:4:wait:/etc/rc.d/rc 4 --/etc/rc.d/init.d目录下脚本的软链接
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now --定义ctrl+alt+del三键重启功能,只能在tty文本界面才能生效,服务器一般都建议把这一句给注释掉,防止误操作
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6 --定义了六个文本终端
系统引导程序 grub (就是一个boot loader)
[root@li ~]# rpm -qa |grep grub
grub-0.97-13.5
[root@li ~]# rpm -qi grub-0.97-13.5
Summary : GRUB - the 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.
[root@li ~]# ls /boot/grub/ --相关的配置文件在/boot/grub目录下
device.map iso9660_stage1_5 stage1
device.map.backup jfs_stage1_5 stage2
e2fs_stage1_5 menu.lst ufs2_stage1_5
fat_stage1_5 minix_stage1_5 vstafs_stage1_5
ffs_stage1_5 reiserfs_stage1_5 xfs_stage1_5
grub.conf splash.xpm.gz
# vim /boot/grub/grub.conf
# vim /etc/grub.conf --这个是链接文件,这两个文件修改一个,两个都会变
default=0 --默认进入第一个系统
timeout=5 --5秒钟不选择,则进入默认default指定的系统;如果改为-1表示等待时间无限
splashimage=(hd0,0)/grub/splash.xpm.gz --指定grub背景图的路径;(hd0,0)表示的就是/dev/sda1,所以这个路径其实就是指/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
root (hd0,0) --表示/dev/sda1,也就是/boot
kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet --vmlinuz是/boot分区下的,名字不能错;root=LABEL=/是启动时要知道根分区是谁;这里写的是标签。但可以替换成/dev/sdax
initrd /initrd-2.6.18-164.el5.img --initrd的路径
[root@li ~]# cat /boot/grub/device.map
(fd0) /dev/fd0
(hd0) /dev/sda --这里就决定了grub.conf里面的hd0代表的就是/dev/sda
rhgb quiet这两个参数是开机时不显示一些启动有关的信息;如果你去掉这两个参数,在开机时就会看到一大串的信息。
# dmesg --但加不加这两个参数无关紧要。开机后可以使用此命令调出那些信息
问题:如果我没有把boot分区单独分出来,我的第一个分区就是根分区,那么grub.conf里应该会怎么样改变?
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz --加/boot
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet --加boot
initrd /boot/initrd-2.6.18-164.el5.img --加boot
[root@squid ~]# cat /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 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
问题:上面如果是我机器的/etc/fstab文件,现在我把第二行,也就是/boot挂载的那一行给删除,会出现什么情况?
默认/dev/sda1挂载/boot
/dev/sda2挂载/
去掉那一行的话,则/dev/sda1不会挂载/boot;但vmlinux和initrd等启动有关的文件物理上是存在于/dev/sda1的,它就不会去挂载/boot目录,那么/boot目录则为空。那么grub.conf里指定的路径就找不到。所以开机不能启动
================================
--一个双系统,分区情况如下
[root@localhost ~]# /dev/sda1 /boot
[root@localhost ~]# /dev/sda2 /
[root@localhost ~]# /dev/sda3 swap
[root@localhost ~]# /dev/sda4 扩展分区
[root@localhost ~]# /dev/sda5 /1 --第二个操作系统就分了一个根,label为/1
--双系统只需要安装一个swap分区,两个系统不能同时打开使用,但是swap分区可以共用
两个系统都是grub.conf文件,那么到底用的是哪个?
一般来说,默认在安装第二个系统时,在安装grub那个界面默认是选择安
装到/dev/sda上,那么第二个系统的grub将覆盖第一个系统的grub。
但是第二个系统默认又没有写第一个系统的启动配置段;所以你需要在
grub.conf里加上另一个系统的配置段,加完之后,最好做一个grub-install /dev/sda (表示把本系统的grub.conf再安装到/dev/sda)
--也就是你现在想用哪个系统的grub.conf,就进入到哪个系统去grub-install /dev/sda就可以了
default=0
timeout=5
splashimage=(hd0,4)/boot/grub/splash.xpm.gz
hiddenmenu
title linux 02
root (hd0,4)
kernel /boot/vmlinuz-2.6.18-164.el5 ro root=LABEL=/1 rhgb quiet
initrd /boot/initrd-2.6.18-164.el5.img
title linux 01
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/sda5 rhgb quiet
initrd /initrd-2.6.18-164.el5.img
--现在第二段写的是使用第一个操作系统的/boot,却使用第二个操作系统的/
[root@localhost ~]# grub-install /dev/sda
--请问上面的grub.conf的写法,linux01是否能启动?
是可以启动的,但是这是限于两个系统都版本内核一致的情况。如果两个系统内核不一致,或者一个rhel,一个ubuntu,显示不能启动。
再重启系统(进行linux01),就发现,是以第一个操作系统的/boot来引导的,但是后面读取的是第二个操作系统的/ 下的/etc/fstab,所以挂载时,还是只挂载了/dev/sda5;表示这样写,相当于是只借用了/dev/sda1下的vmlinuz和initrd去引导而已
--总结:grub.conf和fstab这两个文件如果写混乱(特别是内核版本不同的多操作系统的机器),很容易造成一些头和身体不合的错误
===========================================================
手动引导grub
手动mv grub.conf
grub>root (hd0,0) --进到/boot分区
grub>kernel /vmlinuz-xxxxxxx ro root=LABEL=/ --root分区不要写错,label形式或者/dev/sdax形式都可以
grub>initrd /initrd-xxxxxxxx
grub>boot --boot代表启动
-----------------------------------------------
上面实验的几点总结:
1,报这个错误kernel-panic
就是写错了,大部分是根分区指定错误
2,分区类型如果是8e类型(fdisk /dev/sda,然后输入l来查找分区类型)
8e为逻辑磁盘组;现在不好整;
3,安装双系统,如果先安装windows,再安装linux,那么linux的grub会自动记录windows的引导;如下
引导windows的grub写法
title winxp
rootnoverify (hd0,0)
chainloader +1
4,关于安装双系统,要有free空间,在不动原来的分区的基础上,再分一个根分区,别的过程都一样,就可以再安装一个系统了
================================================
-----------------------
给grub加密码
[root@li ~]# grub-md5-crypt --用此命令产生一个密码加密串
Password:
Retype password:
$1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/ --输两次密码就可以产生加密串
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz --在下面加上加密信息
password --md5 $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/1 rhgb quiet
initrd /initrd-2.6.18-164.el5.img
=================================================
硬链接和软链接
inode:每当创建一个文件和目录的时候,都会为这个文件创建一个inode编号,这些信息都是存放在inode表里
[root@li ~]# ll -i /etc/grub.conf
427497 lrwxrwxrwx 1 root root 22 Feb 27 08:43 /etc/grub.conf -> ../boot/grub/grub.conf
[root@li ~]# ll -i /boot/grub/grub.conf
16083 -rw------- 1 root root 635 Mar 11 10:42 /boot/grub/grub.conf
--物理上并不是同一个位置,软链接(或者叫符号链接,symbolic link)
软链接: 类似windows上的快捷方式
ln - make links between files
例子: 使用vi,达到使用vim的效果; 除了做别名外,还可以做链接
[root@li ~]# which vi
/bin/vi
[root@li ~]# which vim
/usr/bin/vim
[root@li ~]# mv /bin/vi /bin/vi.bak
[root@li ~]# ln -s /usr/bin/vim /bin/vi
[root@li ~]# ll /bin/vi
lrwxrwxrwx 1 root root 12 Mar 11 14:07 /bin/vi -> /usr/bin/vim
前 后
[root@li ~]# rm /bin/vi -rf --删除是删除前面的那个,不是删除后面的;如果删除后面的会造成死链接
[root@li ~]# mv /bin/vi.bak /bin/vi
问题:如果我安装一个源码包软件(比如叫abc),在./configure时使用了--prefix=/usr/local/abc这个参数,然后再make,make install;
请问,这个软件的命令会被安装在哪? /usr/local/abc/bin/
能否直接使用此命令(非绝对路径)? 不能
不能的话如何解决? 把命令拷到$PATH指定的目录里,还有一种就链接到$PATH指定的目录里;
======================================================
[root@li test]# mkdir aaa
[root@li test]# ln -s aaa bbb
[root@li test]# ll bbb -d
lrwxrwxrwx 1 root root 3 Apr 21 14:02 bbb -> aaa
--目录可以手动做软链接
=============================
[root@li ~]# touch 123
[root@li ~]# ln -s 123 /boot/456
[root@li ~]# ll /boot/456
lrwxrwxrwx 1 root root 3 Apr 21 13:48 /boot/456 -> 123 --跨分区的死链接
[root@li ~]# rm /boot/456 -rf
[root@li ~]# ln -s /root/123 /boot/456
[root@li ~]# ll /boot/456
lrwxrwxrwx 1 root root 9 Apr 21 13:49 /boot/456 -> /root/123 --链接时应该写绝对路径
===================================
[root@li ~]# ldd /bin/ls
linux-gate.so.1 => (0x00e5e000)
librt.so.1 => /lib/librt.so.1 (0x00792000)
libacl.so.1 => /lib/libacl.so.1 (0x00ae4000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00a0a000)
libc.so.6 => /lib/libc.so.6 (0x004c9000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00640000)
/lib/ld-linux.so.2 (0x004ab000)
libattr.so.1 => /lib/libattr.so.1 (0x00d78000)
libdl.so.2 => /lib/libdl.so.2 (0x0063a000)
libsepol.so.1 => /lib/libsepol.so.1 (0x00a24000)
[root@li ~]# mv /lib/libsepol.so.1 /lib/libsepol.so.1.bak
--现在就会发现mv,cp,ls,scp等命令都不能用。解决方法:图形改,或者别的机器scp,或者做一个软链接
[root@li ~]# ln -s /lib/libsepol.so.1.bak /lib/libsepol.so.1
[root@li ~]# mv /lib/libsepol.so.1.bak /lib/libsepol.so.1
mv: overwrite `/lib/libsepol.so.1'? y
特点:
1,它会创建一个新的inode编号,相当是一个独立的文件
2,它类似于windows下的快捷方式,访问的时候多了一个中转的过程,最终访问的内容就是它链接的目标文件
3,它可以跨分区创建
4,它可以对目录进行链接
--------------------------
硬链接: inode相同,物理上指的是同一个位置
[root@li test]# touch 1
[root@li test]# ln 1 2 --不加-s参数就表示是硬链接
[root@li test]# 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
[root@li test]# ln 3 /boot/4
ln: creating hard link `/boot/4' to `3': Invalid cross-device link
[root@li test]# mkdir aaa
[root@li test]# ln aaa bbb
ln: `aaa': hard link not allowed for directory
--不能手动对目录进行硬链接,但是系统还是有一些目录的硬链接。如下面的三对:
[root@li test]# ll -di /var/mail/
196459 drwxrwxr-x 2 root mail 4096 Jul 5 10:45 /var/mail/
[root@li test]# ll -di /var/spool/mail/
196459 drwxrwxr-x 2 root mail 4096 Jul 5 10:45 /var/spool/mail/
[root@li test]# ll -di /etc/httpd/logs/
261891 drwx------ 2 root root 4096 Jul 3 10:54 /etc/httpd/logs/
[root@li test]# ll -di /var/log/httpd/
261891 drwx------ 2 root root 4096 Jul 3 10:54 /var/log/httpd/
[root@li test]# ll -di /etc/init.d/
10672002 drwxr-xr-x 2 root root 4096 Jul 5 11:25 /etc/init.d/
[root@li test]# ll -di /etc/rc.d/init.d/
10672002 drwxr-xr-x 2 root root 4096 Jul 5 11:25 /etc/rc.d/init.d/
特点:
1,它不会新创建一个inode编号,不代表一个独立的文件,物理上指向同一个文件
2,它不能跨分区创建
3,它相当于是为文件创建了一个冗余
4,不能手工对目录进行硬链接