一開(kāi)始自己在網(wǎng)上也查了很多關(guān)于此方面的資料,但是沒(méi)有一個(gè)說(shuō)的能讓人徹底明白,徹底走出迷霧的。今天我將把自己更為清晰的簡(jiǎn)介說(shuō)出來(lái)供大家參考:
在講這兩個(gè)命令之前,首先要給大家講一下Linux文件系統(tǒng)在磁盤(pán)分區(qū)中是如何存儲(chǔ)一個(gè)文件的。像Windows一樣,我把Linux文件系統(tǒng)存儲(chǔ)文件時(shí)也分為三大塊:inode,dir,data。inode在Linux中對(duì)應(yīng)一個(gè)文件或一個(gè)目錄,它主要是存儲(chǔ)文件的大小、創(chuàng)建時(shí)間、訪問(wèn)時(shí)間、數(shù)據(jù)的存儲(chǔ)位置等一系列信息。下面是Linux為inode定義的數(shù)據(jù)結(jié)構(gòu):
struct ext3_inode {
__u16 i_mode; /* File mode */
__u16 i_uid; /* Low 16 bits of Owner Uid */
__u32 i_size; /* 文件大小,單位是 byte */
__u32 i_atime; /* Access time */
__u32 i_ctime; /* Creation time */
__u32 i_mtime; /* Modification time */
__u32 i_dtime; /* Deletion Time */
__u16 i_gid; /* Low 16 bits of Group Id */
__u16 i_links_count; /* Links count */
__u32 i_blocks; /* blocks 計(jì)數(shù) */
__u32 i_flags; /* File flags */
__u32 l_i_reserved1; /* 可以忽略 */
__u32 i_block[EXT3_N_BLOCKS]; /* 一組 block 指針 */
__u32 i_generation; /* 可以忽略 */
__u32 i_file_acl; /* 可以忽略 */
__u32 i_dir_acl; /* 可以忽略 */
__u32 i_faddr; /* 可以忽略 */
__u8 l_i_frag; /* 可以忽略 */
__u8 l_i_fsize; /* 可以忽略 */
__u16 i_pad1; /* 可以忽略 */
__u16 l_i_uid_high; /* 可以忽略 */
__u16 l_i_gid_high; /* 可以忽略 */
__u32 l_i_reserved2; /* 可以忽略 */
};
dir是存放文件名和inode ID對(duì)應(yīng)關(guān)系的地方。存儲(chǔ)每個(gè)對(duì)應(yīng)關(guān)系的數(shù)據(jù)結(jié)構(gòu)Linux中定義如下:
struct ext3_dir_entry_2 {
__u32 inode; /* Inode 號(hào)數(shù) */
__u16 rec_len; /* Directory entry length */
__u8 name_len; /* Name length */
__u8 file_type;
char name[EXT3_NAME_LEN]; /* File name */
};
data也就是文件數(shù)據(jù)實(shí)實(shí)在在所存在的地方了。
那么接下來(lái)開(kāi)始進(jìn)入正題:
cp(拷貝命令):比如說(shuō)拷貝bing.txt。執(zhí)行"cp bing.txt chuan.txt"拷貝命令時(shí),系統(tǒng)會(huì)產(chǎn)生一個(gè)新inode,把bing.txt相關(guān)的信息填到這個(gè)inode里面。然后把bing.txt的數(shù)據(jù)拷貝到系統(tǒng)為chuan.txt所開(kāi)辟的空間里面。最后,把chuan.txt和新inode ID對(duì)應(yīng)起來(lái)放到dir里面。
ln(鏈接命令):
鏈接命令分為兩大塊:軟連接、硬鏈接;
軟連接(命令格式ln -s file1 file2):系統(tǒng)為file2產(chǎn)生一個(gè)新的inode,把file1的inode信息完全復(fù)制到file2的inode中去。然后在dir里面添加一個(gè)對(duì)應(yīng)關(guān)系:file2 <-----> file2的inode的ID。
硬鏈接(命令格式:ln [-d] file1 file2): 硬鏈接很簡(jiǎn)單,僅僅是產(chǎn)生一個(gè)file2<----->file1的inodeID 的對(duì)應(yīng)關(guān)系。所以說(shuō)硬鏈接很節(jié)省空間,而且它有一個(gè)很大的好處,那就是可以避免誤刪除帶來(lái)的損失。因?yàn)長(zhǎng)inux中刪除一個(gè)文件時(shí)首先把這個(gè)文件的inode中i_link_count(此變量為硬鏈接數(shù)。為什么沒(méi)有軟連接呢?因?yàn)檐涍B接只是完全復(fù)制源文件的inode的并不公用源文件的inode,他只是相當(dāng)于Windows中的快捷方式而已。)變量的值減一,然后判斷i_link_count是否為0,若是則刪除。否則不會(huì)刪除。