1.理解硬件
1.1磁盤
- 機械磁盤是計算機中的?個機械設備
- 磁盤--- 外設
- 慢
- 容量?,價格便宜
1.2磁盤物理結構?
?
1.3磁盤的存儲結構?
扇區:是磁盤存儲數據的基本單位,512字節,塊設備?
?
如何定位?個扇區呢?確定磁頭要訪問哪?個柱?(磁道)(cylinder)可以先定位磁頭(header)定位?個扇區(sector)柱?(cylinder),磁頭(head),扇區(sector),顯然可以定位數據了,這就是數據定位(尋址)?式之?,CHS尋址?式。
扇區是從磁盤讀出和寫?信息的最?單位,通常??為 512 字節。磁頭(head)數:每個盤??般有上下兩?,分別對應1個磁頭,共2個磁頭磁道(track)數:磁道是從盤?外圈往內圈編號0磁道,1磁道...,靠近主軸的同?圓?于停靠磁頭,不存儲數據柱?(cylinder)數:磁道構成柱?,數量上等同于磁道個數扇區(sector)數:每個磁道都被切分成很多扇形區域,每道的扇區數量相同圓盤(platter)數:就是盤?的數量磁盤容量=磁頭數 × 磁道(柱?)數 × 每道扇區數 × 每扇區字節數細節:傳動臂上的磁頭是共進退的
?1.4磁盤的邏輯結構
細節:傳動臂上的磁頭是共進退的
?
?
磁道:某?盤?的某?個磁道展開:
即:?維數組
柱面:整個磁盤所有盤?的同?個磁道,即柱?展開:![]()
?
柱?上的每個磁道,扇區個數是?樣的這不就是?維數組嗎
整盤:?
整個磁盤不就是多張?維的扇區數組表(三維數組?)
?
?
LBA地址轉成CHS地址,CHS如何轉換成為LBA地址。?
1.5?CHS && LBA地址?
- 磁頭數*每磁道扇區數 = 單個柱?的扇區總數
- LBA = 柱?號C*單個柱?的扇區總數 + 磁頭號H*每磁道扇區數 + 扇區號S - 1
- 即:LBA = 柱?號C*(磁頭數*每磁道扇區數) + 磁頭號H*每磁道扇區數 + 扇區號S - 1
- 扇區號通常是從1開始的,?在LBA中,地址是從0開始的
- 柱?和磁道都是從0開始編號的
- 總柱?,磁道個數,扇區總數等信息,在磁盤內部會?動維護,上層開機的時候,會獲取到這些參數。
- 柱?號C = LBA // (磁頭數*每磁道扇區數)【就是單個柱?的扇區總數】
- 磁頭號H = (LBA % (磁頭數*每磁道扇區數)) // 每磁道扇區數
- 扇區號S = (LBA % 每磁道扇區數) + 1
- "//": 表?除取整
?2.引入文件系統
2.1引?"塊"概念?
注意:
- 磁盤就是?個三維數組,我們把它看待成為?個"?維數組",數組下標就是LBA,每個元素都是扇區
- 每個扇區都有LBA,那么8個扇區?個塊,每?個塊的地址我們也能算出來。
- 知道LBA:塊號 = LBA/8
- 知道塊號:LBA=塊號*8 + n. (n是塊內第?個扇區)
?
2.2引?"分區"概念?
?
?
2.3引?"inode"概念
?
[root@localhost linux]# ls -l
總?量 12
-rwxr-xr-x. 1 root root 7438 "9? 13 14:56" a.out
-rw-r--r--. 1 root root 654 "9? 13 14:56" test.c
每?包含7列:? 模式? 硬鏈接數? ?件所有者? 組? ??? 最后修改時間? ?件名ls -l讀取存儲在磁盤上的?件信息,然后顯?出來
其實這個信息除了通過這種?式來讀取,還有?個stat命令能夠看到更多信息?
[root@localhost linux]# stat test.c
File: "test.c"
Size: 654 Blocks: 8 IO Block: 4096 普通?件
Device: 802h/2050d Inode: 263715 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-09-13 14:56:57.059012947 +0800
Modify: 2017-09-13 14:56:40.067012944 +0800
Change: 2017-09-13 14:56:40.069012948 +0800
?到這我們要思考?個問題,?件數據都儲存在”塊”中,那么很顯然,我們還必須找到?個地?儲存 ?件的元信息(屬性信息),?如?件的創建者、?件的創建?期、?件的??等等。這種儲存文件元信息的區域就叫做inode,中?譯名為”索引節點”。
ls -li命令
?
注意:Linux下?件的存儲是屬性和內容分離存儲的Linux下,保存?件屬性的集合叫做inode,?個?件,?個inode,inode內有?個唯?的標識符,叫做inode號
?所以?個?件的屬性inode?什么樣?呢?
/*
* Structure of an inode on the disk
*/
struct ext2_inode {__le16 i_mode; /* File mode */__le16 i_uid; /* Low 16 bits of Owner Uid */__le32 i_size; /* Size in bytes */__le32 i_atime; /* Access time */__le32 i_ctime; /* Creation time */__le32 i_mtime; /* Modification time */__le32 i_dtime; /* Deletion Time */__le16 i_gid; /* Low 16 bits of Group Id */__le16 i_links_count; /* Links count 引用計數*/__le32 i_blocks; /* Blocks count */__le32 i_flags; /* File flags */union {struct {__le32 l_i_reserved1;} linux1;struct {__le32 h_i_translator;} hurd1;struct {__le32 m_i_reserved1;} masix1;} osd1; /* OS dependent 1 */__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */__le32 i_generation; /* File version (for NFS) */__le32 i_file_acl; /* File ACL */__le32 i_dir_acl; /* Directory ACL */__le32 i_faddr; /* Fragment address */union {struct {__u8 l_i_frag; /* Fragment number */__u8 l_i_fsize; /* Fragment size */__u16 i_pad1;__le16 l_i_uid_high; /* these 2 fields */__le16 l_i_gid_high; /* were reserved2[0] */__u32 l_i_reserved2;} linux2;struct {__u8 h_i_frag; /* Fragment number */__u8 h_i_fsize; /* Fragment size */__le16 h_i_mode_high;__le16 h_i_uid_high;__le16 h_i_gid_high;__le32 h_i_author;} hurd2;struct {__u8 m_i_frag; /* Fragment number */__u8 m_i_fsize; /* Fragment size */__u16 m_pad1;__u32 m_i_reserved2[2];} masix2;} osd2; /* OS dependent 2 */
};
/*
* Constants relative to the data blocks
*/
#define EXT2_NDIR_BLOCKS 12
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
備注:EXT2_N_BLOCKS = 15
注意:?件名屬性并未納?到inode數據結構內部inode的???般是128字節或者256,我們后?統?128字節任何?件的內容??可以不同,但是屬性???定是相同的
兩個問題:
3.ext2 文件系統
3.1宏觀認識??
?
?
3.2Block Group
?ext2?件系統會根據分區的??劃分為數個Block Group。?每個Block Group都有著相同的結構組成。
3.3塊組內部構成
3.3.1超級塊(Super Block)?
/*
* Structure of the super block
*/
struct ext2_super_block {__le32 s_inodes_count; /* Inodes count */__le32 s_blocks_count; /* Blocks count */__le32 s_r_blocks_count; /* Reserved blocks count */__le32 s_free_blocks_count; /* Free blocks count */__le32 s_free_inodes_count; /* Free inodes count */__le32 s_first_data_block; /* First Data Block */__le32 s_log_block_size; /* Block size */__le32 s_log_frag_size; /* Fragment size */__le32 s_blocks_per_group; /* # Blocks per group */__le32 s_frags_per_group; /* # Fragments per group */__le32 s_inodes_per_group; /* # Inodes per group */__le32 s_mtime; /* Mount time */__le32 s_wtime; /* Write time */__le16 s_mnt_count; /* Mount count */__le16 s_max_mnt_count; /* Maximal mount count */__le16 s_magic; /* Magic signature */__le16 s_state; /* File system state */__le16 s_errors; /* Behaviour when detecting errors */__le16 s_minor_rev_level; /* minor revision level */__le32 s_lastcheck; /* time of last check */__le32 s_checkinterval; /* max. time between checks */__le32 s_creator_os; /* OS */__le32 s_rev_level; /* Revision level */__le16 s_def_resuid; /* Default uid for reserved blocks */__le16 s_def_resgid; /* Default gid for reserved blocks *//*
* These fields are for EXT2_DYNAMIC_REV superblocks only.
*
* Note: the difference between the compatible feature set and
* the incompatible feature set is that if there is a bit set
* in the incompatible feature set that the kernel doesn't
* know about, it should refuse to mount the filesystem.
*
* e2fsck's requirements are more strict; if it doesn't know
* about a feature in either the compatible or incompatible
* feature set, it must abort and not try to meddle with
* things it doesn't understand...
*/__le32 s_first_ino; /* First non-reserved inode */__le16 s_inode_size; /* size of inode structure */__le16 s_block_group_nr; /* block group # of this superblock */__le32 s_feature_compat; /* compatible feature set */__le32 s_feature_incompat; /* incompatible feature set */__le32 s_feature_ro_compat; /* readonly-compatible feature set */__u8 s_uuid[16]; /* 128-bit uuid for volume */char s_volume_name[16]; /* volume name */char s_last_mounted[64]; /* directory where last mounted */__le32 s_algorithm_usage_bitmap; /* For compression *//** Performance hints. Directory preallocation should only* happen if the EXT2_COMPAT_PREALLOC flag is on.*/__u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */__u16 s_padding1;/** Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.*/__u8 s_journal_uuid[16]; /* uuid of journal superblock */__u32 s_journal_inum; /* inode number of journal file */__u32 s_journal_dev; /* device number of journal file */__u32 s_last_orphan; /* start of list of inodes to delete */__u32 s_hash_seed[4]; /* HTREE hash seed */__u8 s_def_hash_version; /* Default hash version to use */__u8 s_reserved_char_pad;__u16 s_reserved_word_pad;__le32 s_default_mount_opts;__le32 s_first_meta_bg; /* First metablock block group */__u32 s_reserved[190]; /* Padding to the end of the block */
};
3.3.2GDT(Group Descriptor Table)
// 磁盤級blockgroup的數據結構
/*
* Structure of a blocks group descriptor
*/
struct ext2_group_desc
{__le32 bg_block_bitmap; /* Blocks bitmap block */__le32 bg_inode_bitmap; /* Inodes bitmap */__le32 bg_inode_table; /* Inodes table block*/__le16 bg_free_blocks_count; /* Free blocks count */__le16 bg_free_inodes_count; /* Free inodes count */__le16 bg_used_dirs_count; /* Directories count */__le16 bg_pad;__le32 bg_reserved[3];
};
3.3.3塊位圖(Block Bitmap)?
- ??作用??:標記??數據塊(Data Block)??的使用狀態。
- 原理??:
- 每個比特(bit)對應一個數據塊:
1
:塊已被占用(存儲了文件數據)。0
:塊空閑可用。
- 例如:塊位圖?
11100010
?表示前3個塊已用,第4-6個塊空閑,第7個塊已用,第8個塊空閑。
- 每個比特(bit)對應一個數據塊:
- ??示例??:
- 若文件系統有 1024 個塊,塊位圖需占用?
1024/8 = 128 字節
(1字節=8比特)。
- 若文件系統有 1024 個塊,塊位圖需占用?
3.3.4inode位圖(Inode Bitmap)??
- ??作用??:標記??Inode 的使用狀態??。
- ??原理??:
- 每個比特對應一個 Inode:
1
:Inode 已被占用(關聯了文件/目錄)。0
:Inode 空閑。
- 例如:Inode 位圖?
10100000
?表示第1、3個 Inode 已用,其余空閑。
- 每個比特對應一個 Inode:
- ??示例??:
- 若塊組包含 8192 個 Inode,Inode 位圖需占用?
8192/8 = 1024 字節
。
- 若塊組包含 8192 個 Inode,Inode 位圖需占用?
特性 | 塊位圖(Block Bitmap) | Inode 位圖(Inode Bitmap) |
---|---|---|
??管理對象?? | 數據塊(Data Blocks) | Inode |
??標記內容?? | 數據塊是否被文件占用 | Inode 是否關聯文件/目錄 |
??大小計算?? | 總塊數 ÷ 8(字節) | 總Inode數 ÷ 8(字節) |
??分配策略?? | 優先分配連續空閑塊 | 分配第一個空閑 Inode |
3.3.5i節點表(Inode Table)
- 唯一標識文件??:每個區對應一個唯一的 Inode 編號(如?
Inode 1053
)。 - ??存儲元數據??:包括權限、所有者、大小、時間戳等。
- ??數據塊尋址??:通過指針(直接/間接)定位文件內容所在的磁盤塊。
- 當前分組所有Inode屬性的集合
- inode編號以分區為單位,整體劃分,不可跨分區
屬性 | 說明 |
---|---|
??物理位置?? | 位于文件系統的 ??塊組(Block Group)?? 內,緊鄰 Inode Bitmap。 |
??存儲單元?? | 多個 Inode 連續存儲,占用一個或多個磁盤塊(Block)。 |
??大小固定?? | EXT2/3 中每個 Inode 固定為 ??128字節??,EXT4 可擴展(如 256字節)。 |
示例計算??:
若磁盤塊大小為 4KB,一個塊可存儲?4096/128 = 32
?個 Inode。
3.3.6Data Block?
- 對于普通?件,?件的數據存儲在數據塊中。
- 對于?錄,該?錄下的所有?件名和?錄名存儲在所在?錄的數據塊中,除了?件名外,ls -l命令看到的其它信息保存在該?件的inode中。
- Block 號按照分區劃分,不可跨分區
屬性 | 說明 |
---|---|
??作用?? | 存儲文件內容或目錄條目(文件名 + Inode編號映射)。 |
??大小?? | 通常為 ??1KB、2KB、4KB??(EXT4默認4KB),格式化時確定,不可動態調整。 |
??分配單位?? | 文件系統以塊為單位分配空間,即使文件只有1字節也占用整個塊。 |
??尋址方式?? | 通過Inode的??直接/間接指針??定位數據塊。 |
Data Block?太大可以跨組保存?
?3.4inode和datablock映射
?
索引級別?? | ??管理能力??(假設塊大小=4KB,指針4字節) | ??圖中對應部分?? |
---|---|---|
??直接塊?? | 12×4KB = ??48KB?? | 圖中左側"12個直接塊"區域 |
??一級間接?? | 1024指針×4KB = ??4MB?? | "一級間接塊索引表指針"指向的表格 |
??二級間接?? | 1024×1024×4KB = ??4GB?? | 二級索引表的多層結構 |
??三級間接?? | 10243×4KB = ??4TB?? | 圖中最右側的三級指針鏈 |
?
知道inode號的情況下,在指定分區,請解釋:對?件進?增、刪、查、改是在做什么?
- 分區之后的格式化操作,就是對分區進?分組,在每個分組中寫?SB、GDT、Block Bitmap、Inode Bitmap等管理信息,這些管理信息統稱: ?件系統
- 只要知道?件的inode號,就能在指定分區中確定是哪?個分組,進?在哪?個分組確定 是哪?個inode
- 拿到inode?件屬性和內容就全部都有了
?通過touch?個新?件來看看如何?作。
[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc
?為了說明問題,我們將上圖簡化:
?
1.存儲屬性內核先找到?個空閑的i節點(這?是263466)。內核把?件信息記錄到其中。2.存儲數據該?件需要存儲在三個磁盤塊,內核找到了三個空閑塊:300,500,800。將內核緩沖區的第?塊數據復制到300,下?塊復制到500,以此類推。3.記錄分配情況?件內容按順序300,500,800存放。內核在inode上的磁盤分布區記錄了上述塊列表。4.添加?件名到?錄
新的?件名abc。linux如何在當前的?錄中記錄這個?件?內核將??(263466,abc)添加到?錄?件。?件名和inode之間的對應關系將?件名和?件的內容及屬性連接起來。abc → 263466 → 塊300/500/800
操作步驟 | 圖片中的標注證據 |
---|---|
??1. 分配Inode?? | i節點表 中的263466 條目 |
??2. 分配數據塊?? | 數據區 的塊300, 500, 800 |
??3. 記錄塊列表?? | 文件所使用的數據塊列表:300,500,800 |
??4. 添加目錄項?? | 增加到目錄的入口:(263466, abc) |
?3.5?錄與?件名?
?
?
local@bite:~/code/test/test$ pwd
/home/local/code/test/test
local@bite:~/code/test/test$ ls -li
total 24
1596260 -rw-rw-r-- 1 local local 814 Oct 28 20:32 test.c
?如:要訪問test.c, 就必須打開test(當前?作?錄),然后才能獲取test.c對應的inode進?對?
件進?訪問。
3.6路徑解析
?/home/local/code/test/test/test.c
都要從根?錄開始,依次打開每?個?錄,根據?錄名,依次訪問每個?錄下指定的?錄,直到訪問到test.c。這個過程叫做Linux路徑解析。
所以,我們知道了:訪問?件必須要有?錄+?件名=路徑的原因根?錄固定?件名,inode號,?需查找,系統開機之后就必須知道
3.7路徑緩存
?
Linux中,在內核中維護樹狀路徑結構的內核結構體叫做: struct dentry?
struct dentry {atomic_t d_count;unsigned int d_flags; /* protected by d_lock */spinlock_t d_lock; /* per dentry lock */struct inode* d_inode; /* Where the name belongs to - NULL is* negative *//** The next three fields are touched by __d_lookup. Place them here* so they all fit in a cache line.*/struct hlist_node d_hash; /* lookup hash list */struct dentry* d_parent; /* parent directory */struct qstr d_name;struct list_head d_lru; /* LRU list *//** d_child and d_rcu can share memory*/union {struct list_head d_child; /* child of parent list */struct rcu_head d_rcu;} d_u;struct list_head d_subdirs; /* our children */struct list_head d_alias; /* inode alias list */unsigned long d_time; /* used by d_revalidate */struct dentry_operations* d_op;struct super_block* d_sb; /* The root of the dentry tree */void* d_fsdata; /* fs-specific data */
#ifdef CONFIG_PROFILINGstruct dcookie_struct* d_cookie; /* cookie, if any */
#endifint d_mounted;unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};
?dentry找到了,inode就找到了?
操作?? | ??無緩存?? | ??有緩存?? |
---|---|---|
??首次訪問?/path/abc ?? | 需讀取圖中所有目錄塊和Inode表。 | 僅第一次需訪問磁盤。 |
??重復訪問?? | 每次重復解析路徑。 | 直接從緩存返回Inode,零磁盤I/O。 |
??刪除/重命名文件?? | 需同步更新緩存和圖中磁盤結構。 | 緩存失效,觸發重新解析。 |
3.8掛載分區
我們已經能夠根據inode號在指定分區找?件了,也已經能根據?錄?件內容,找指定的inode了,在指定的分區內,我們可以為所欲為了。可是:
問題:inode不是不能跨分區嗎?Linux不是可以有多個分區嗎?我怎么知道我在哪?個分區???
?3.8.1?個實驗
$ dd if=/dev/zero of=./disk.img bs=1M count=5 #制作?個?的磁盤塊,就當做?個分區#創建5MB的空白鏡像#通過dd命令創建的disk.img就是典型的??磁盤鏡像文件??
$ mkfs.ext4 disk.img # 格式化寫??件系統
$ mkdir /mnt/mydisk # 建?空?錄
$ df -h # 查看可以使?的分區
Filesystem Size Used Avail Use% Mounted on
udev 956M 0 956M 0% /dev
tmpfs 198M 724K 197M 1% /run
/dev/vda1 50G 20G 28G 42% /
tmpfs 986M 0 986M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 986M 0 986M 0% /sys/fs/cgroup
tmpfs 198M 0 198M 0% /run/user/0
tmpfs 198M 0 198M 0% /run/user/1002
$ sudo mount -t ext4 ./disk.img /mnt/mydisk/ # 將分區掛載到指定的?錄$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 956M 0 956M 0% /dev
tmpfs 198M 724K 197M 1% /run
/dev/vda1 50G 20G 28G 42% /
tmpfs 986M 0 986M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 986M 0 986M 0% /sys/fs/cgroup
tmpfs 198M 0 198M 0% /run/user/0
tmpfs 198M 0 198M 0% /run/user/1002
/dev/loop0 4.9M 24K 4.5M 1% /mnt/mydisk$ sudo umount /mnt/mydisk # 卸載分區
local@bite:/mnt$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 956M 0 956M 0% /dev
tmpfs 198M 724K 197M 1% /run
/dev/vda1 50G 20G 28G 42% /
tmpfs 986M 0 986M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 986M 0 986M 0% /sys/fs/cgroup
tmpfs 198M 0 198M 0% /run/user/0
tmpfs 198M 0 198M 0% /run/user/1002
?注意:
/dev/loop0 在Linux系統中代表第?個循環設備(loop device)。循環設備,也被稱為回環設備或者loopback設備,是?種偽設備(pseudo-device),它允許將?件作為塊設備(block device)來使?。這種機制使得可以將?件(?如ISO鏡像?件)掛載(mount)為?件系統,就像它們是物理硬盤分區或者外部存儲設備?樣
最多可以同時掛載8個不同的磁盤鏡像文件??(每個鏡像需要獨占一個loop設備)
local@bite:/mnt$ ls /dev/loop* -l
brw-rw---- 1 root disk 7, 0 Oct 17 18:24 /dev/loop0
brw-rw---- 1 root disk 7, 1 Jul 17 10:26 /dev/loop1
brw-rw---- 1 root disk 7, 2 Jul 17 10:26 /dev/loop2
brw-rw---- 1 root disk 7, 3 Jul 17 10:26 /dev/loop3
brw-rw---- 1 root disk 7, 4 Jul 17 10:26 /dev/loop4
brw-rw---- 1 root disk 7, 5 Jul 17 10:26 /dev/loop5
brw-rw---- 1 root disk 7, 6 Jul 17 10:26 /dev/loop6
brw-rw---- 1 root disk 7, 7 Jul 17 10:26 /dev/loop7
crw-rw---- 1 root disk 10, 237 Jul 17 10:26 /dev/loop-control
?df
?命令(最直接)快速判斷當前所在分區
.
?表示當前目錄??,輸出顯示其所在設備(如?/dev/vda1
)和掛載點(/home
)。?
$ df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 20G 28G 42% /home
?
3.8.2一個結論
?4.軟硬鏈接
4.1硬鏈接?
??基本概念??
- ??硬鏈接?? 是文件系統中??指向同一個 inode 的多個文件名??,即多個路徑指向同一份數據。
- 所有硬鏈接??地位平等??,沒有“原始文件”和“鏈接文件”之分。
- 刪除任意一個硬鏈接,只要還有其他鏈接存在,文件數據就不會被釋放。
特點?
??1.共享 inode??
- 所有硬鏈接指向同一個 inode,因此:
- 修改任一硬鏈接的內容,其他硬鏈接也會同步變化。
- 它們的文件屬性(權限、所有者、時間戳等)完全相同。
2.不跨文件系統??
- 硬鏈接必須在??同一個文件系統??內創建(因為 inode 是文件系統局部的)。
3.不能鏈接目錄??(超級用戶除外)
- 普通用戶無法用?
ln
?創建目錄的硬鏈接,防止形成循環引用(但內核允許?.
?和?..
?這樣的特殊硬鏈接)。
4.??刪除不影響數據??
- 只有當??所有硬鏈接都被刪除??,且沒有進程占用文件時,數據才會真正釋放。
?創建硬鏈接?
ln 源文件 硬鏈接名
ln file.txt hardlink_to_file.txt
此時?file.txt
?和?hardlink_to_file.txt
?指向同一個 inode,修改其中一個會影響另一個。
查看硬鏈接??
ls -i
?? 查看 inode 號(相同 inode 表示是硬鏈接):?
ls -i file.txt hardlink_to_file.txt
//輸出示例:
123456 file.txt
123456 hardlink_to_file.txt # inode 相同
?
263563 - rw - r--r--. 2 root root 0 9? 15 17:45 abc
263563 - rw - r--r--. 2 root root 0 9? 15 17:45 abc-hard//2是多個新的文件名指向目標文件,硬連接數//增加inode引用計數的數字
?創建目錄后發現是2,是因為目錄里.也是硬鏈接
目錄里..是3是因為上級目錄和上級目錄里的.和當前目錄里的..是同一inode
?4.2軟鏈接
基本概念??
軟鏈接(Symbolic Link,又稱符號鏈接)是 Linux/Unix 系統中的一種特殊文件類型,它??存儲的是另一個文件或目錄的路徑??,類似于 Windows 的“快捷方式”。
創建軟鏈接??
ln -s 目標文件或目錄 軟鏈接名稱
ln -s /var/log/syslog my_log_link # 創建指向系統日志的軟鏈接
?此時?my_log_link
?是一個獨立文件,內容為路徑?/var/log/syslog
。
識別軟鏈接??
ls -l
?? 顯示軟鏈接及其指向的目標:?
ls -l my_log_link
//輸出示例:
lrwxrwxrwx 1 user group 13 Jan 1 12:00 my_log_link -> /var/log/syslog
//首字母 l 表示軟鏈接。
//-> 后是目標路徑。
?
gcc myapp.c -o /.../myapp # 編譯并輸出到目標路徑
ln -s /.../myapp exe # 創建軟鏈接 exe
現在目錄下有一個名為?exe
?的軟鏈接,指向?/.../myapp
。
直接運行?exe
./exe??
- Shell 會先解析?
./exe
?的路徑:
?./
?表示當前目錄,所以 Shell 查找當前目錄下的?exe
。- 發現?
exe
?是一個軟鏈接,指向?/.../myapp
。- Shell 最終執行?
/.../myapp
。
4.3軟硬連接對?
?
4.4軟硬連接的?途:?
?