歡迎您光臨本站 註冊首頁

linux07-進程與系統引導

←手機掃碼閱讀     火星人 @ 2014-03-08 , reply:0

進程管理:


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,不能手工對目錄進行硬鏈接

本文出自 「linuxart」 博客,請務必保留此出處http://linuxart.blog.51cto.com/686203/843921


[火星人 ] linux07-進程與系統引導已經有676次圍觀

http://coctec.com/docs/linux/show-post-45746.html