關于inode,dentry結合軟鏈接及硬鏈接的實驗

一、背景

在之前的博客?缺頁異常導致的iowait打印出相關文件的絕對路徑-CSDN博客 里 2.2.3 一節里,我們講到了file,fd,inode,dentry,super_block這幾個概念,在這篇博客里,我們針對inode和dentry做一些實驗,針對的是軟鏈接和硬鏈接的場景。

二、實驗源碼及最普通常見的場景

2.1 實驗源碼

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/dcache.h>
#include <linux/namei.h>// 模塊參數
static char *filepath = "/tmp/testfile";  // 默認文件路徑
module_param(filepath, charp, S_IRUGO);
MODULE_PARM_DESC(filepath, "Path of the file to open");char buffer[4096];int getfullpath(struct inode *inode)
{struct dentry *dentry;hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {char *path;path = dentry_path_raw(dentry, buffer, PAGE_SIZE);if (IS_ERR(path)){continue;   }printk("dentry name = %s , path = %s\n", dentry->d_name.name, path);}return 0;
}static int __init my_module_init(void) {struct file *file;printk(KERN_INFO "Opening file: %s\n", filepath);// 打開文件file = filp_open(filepath, O_RDONLY, 0);if (IS_ERR(file)) {printk(KERN_ERR "Error opening file: %ld\n", PTR_ERR(file));return PTR_ERR(file);}getfullpath(file->f_inode);// 關閉文件filp_close(file, NULL);return -EINVAL;
}static void __exit my_module_exit(void) {printk(KERN_INFO "Module exiting\n");
}module_init(my_module_init);
module_exit(my_module_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Zhaoxin");
MODULE_DESCRIPTION("A simple module to read dentry from a file's inode");

2.2 源碼分析

上面的源碼還是比較簡單的,在內核模塊里打開一個文件,使用傳入的filepath參數,要注意,如果用file_path這個名字會造成和內核里的file_path的符號相沖突導致編譯不過的情況。

內核模塊根據傳入的filepath的路徑(可以是相對路徑)打開文件,然后使用打開的文件里的file->f_inode作為參數,傳給getfullpath函數,這個getfullpath函數改造自之前的博客?缺頁異常導致的iowait打印出相關文件的絕對路徑-CSDN博客 里的 2.2.3 一節里的getfullpath函數,改得更簡單,只是打印到dmesg里:

insmod ko一定會返回失敗,為了方便調試,不用rmmod,可直接再運行insmod:

2.3?最普通場景的場景的運行情況

我們創建一個aa.txt文件,然后執行insmod testinode.ko filepath=aa.txt

dmesg的內容如下:

這時候,這個aa.txt就一個文件,沒有創建過相關的硬鏈接或軟鏈接。

三、增加一個硬鏈接后的運行情況

我們通過如下命令創建一個硬鏈接:

ln aa.txt bb.txt

然后執行一樣的命令:

insmod testinode.ko filepath=aa.txt

dmesg里的內容如下:

如果用:

insmod testinode.ko filepath=bb.txt

dmesg里的內容是一樣的:

可以看到,如果創建一個硬鏈接后,用其中任意一個符號來open文件,通過其對應的inode遍歷得到的dentry全路徑是一模一樣的。

為了進一步做實驗,我們把inode的指針也打出來:

可以從上圖里看到,無論是打開aa.txt還是打開bb.txt,其inode的地址是一樣的。

四、增加一個軟鏈接后的運行情況

通過ln -s bb.txt slinkbb.txt之后,再運行抓到的dmesg情況:

可以看到用軟鏈接的名字來open和用硬鏈接的名字來open,得到的file的f_inode地址是一樣的,自然通過f_inode指針遍歷得到的dentry也是一樣的。

我們用file里的f_path.dentry來打印出其name:

	do {char *path;path = dentry_path_raw(file->f_path.dentry, buffer, PAGE_SIZE);if (IS_ERR(path)){break;}printk("[2] dentry name = %s , path = %s\n", file->f_path.dentry->d_name.name, path);} while(0);

得到的dmesg如下:

說明file里的f_path.dentry可以得到它的軟鏈接的源頭文件路徑。

4.1 軟鏈接不同于硬鏈接,會新分配一個inode

通過ls -li如下圖就可以看到新增一個硬鏈接并不會新增一個inode,而新增一個軟鏈接就會新增一個inode(另外,之所以用open出來的file看似關聯不上這個新的inode,因為它已經在filp_open期間根據軟鏈接的inode找到了實體文件)

另外,軟鏈接可以鏈接一個文件夾或一個不存在的文件,而硬鏈接不行

4.2 軟鏈接相關的內核實現

我們看一下軟鏈接相關的內核實現,看看是哪里分配的一個inode。

創建軟鏈接的系統調用是symlink,如下圖實現:

看一下它調用的do_symlinkat的實現:

上圖里創建軟鏈接的核心函數是紅色框出的vfs_symlink函數,如下圖調用的是對應文件系統的symlink實現:

比如ext4的symlink實現,如下圖里的ext4_new_inode_start_handle函數來創建新的inode:

然后調用下圖里的ext4_add_nondir函數來把創建出來的inode放到所在的目錄的數據塊里(也建立了inode和dentry的鏈接):

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75541.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75541.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲引擎學習第201天

倉庫:https://gitee.com/mrxiao_com/2d_game_5 回顧之前的內容&#xff0c;并遇到了一次一階異常&#xff08;First-Chance Exception&#xff09;。 歡迎來到新一期的開發過程&#xff0c;我們目前正在編寫調試接口代碼。 當前&#xff0c;我們已經在布局系統上進行了一些工…

計算機視覺算法實戰——基于YOLOv8的行人流量統計系統

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ??? ????????? ?? 引言:智能客流分析的市場需求 在零售、交通、安防等領域,準確的行人流量統計對于商業決策、公共安全管理…

Redis是什么?架構是怎么樣的?

目錄 前言 一,Redis架構 1.1 本地緩存 1.2 遠程緩存 二,強大的Redis優點 2.1 支持多種數據類型 2.2 內存過期策略 2.3 內存淘汰策略 2.4 持久化 三,Redis是什么 前言 我是一個程序員,維護了一個商品服務,它的背后直連Mysql數據庫,假設商品服務對外每秒需要提供1萬次…

藍橋杯真題——傳送陣

原題連接&#xff1a;藍橋杯2024年第十五屆省賽真題-傳送陣 - C語言網 知識點&#xff1a;并查集 題目描述 小藍在環球旅行時來到了一座古代遺跡&#xff0c;里面并排放置了 n 個傳送陣&#xff0c;進入第 i 個傳送陣會被傳送到第 ai 個傳送陣前&#xff0c;并且可以隨時選擇…

彩虹表攻擊

1. 引言 密碼安全一直是信息安全領域的重要課題。攻擊者可以利用**暴力破解(Brute-Force Attack)和字典攻擊(Dictionary Attack)等方式嘗試破解密碼。然而,計算機性能的提升使得這些方法的效率不斷提高,其中彩虹表攻擊(Rainbow Table Attack)**是一種極具威脅性的密碼…

Vue2 監聽器 watcher

文章目錄 前言監聽器的作用&#xff1a;工作流程&#xff1a;基本用法1. 簡單監聽2. 對象形式配置 使用場景1. 執行異步操作2. 監聽路由變化3. 復雜對象/數組變化 關鍵配置項與計算屬性的區別動態添加監聽器注意事項 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&a…

Linux系統程序設計:從入門到高級Day02

這一篇 我帶大家復習一下&#xff0c;C語言中的文件 那一部分 大家注意 這里的圖并非原創 是當時我老師的圖片 本片作用主要是 后續會有文件相關操作&#xff0c;這篇幫大家復習C語言文件中的內容 有助于大家后面的理解。 文章中代碼大多是圖片格式&#xff0c;是因為這是我…

N元語言模型的時間和空間復雜度計算

對于N元語言模型&#xff0c;時間復雜度是O(V ^ {N-1})&#xff0c;空間復雜度是O(V ^ {N})&#xff0c;N是詞匯表的大小。 空間復雜度&#xff1a;存儲所有可能的N-1元組及其對應的詞的頻次需要大量的存儲空間。例如&#xff0c;對于一個三元模型&#xff08;N3&#xff09;&…

Tmux 核心操作速查指南

Tmux 最常用操作筆記 1. 基本概念 會話&#xff08;Session&#xff09;&#xff1a;一個tmux會話可以包含多個窗口&#xff0c;適合長期任務管理。窗口&#xff08;Window&#xff09;&#xff1a;每個窗口是一個獨立的終端界面&#xff0c;可包含多個面板。面板&#xff08…

哈希表系列一>兩數之和

目錄 題目&#xff1a;方法&#xff1a;暴力代碼&#xff1a;優化后代碼&#xff1a; 題目&#xff1a; 鏈接: link 方法&#xff1a; 暴力代碼&#xff1a; public int[] twoSum(int[] nums, int target) {解法一&#xff1a;暴力解法&#xff1a;int n nums.length;for(int…

端到端機器學習流水線(MLflow跟蹤實驗)

目錄 端到端機器學習流水線(MLflow跟蹤實驗)1. 引言2. 項目背景與意義2.1 端到端機器學習流水線的重要性2.2 MLflow的作用2.3 工業級數據處理需求3. 數據集生成與介紹3.1 數據集構成3.2 數據生成方法4. 機器學習流水線與MLflow跟蹤4.1 端到端機器學習流水線4.2 MLflow跟蹤實驗…

英語學習:讀科技論文的難處

如果讀起科技論文&#xff0c; 我們就知道自己到底欠缺什么知識了&#xff0c; 那是一個挨著一個的缺。 而且還沒有維基百科可用。 怎么辦&#xff1f;沒辦法&#xff01;硬看&#xff01; 而且還要面臨語言的差異性困難。比如這一句怎么翻譯比較合適&#xff1f;還是直接不翻譯…

001 使用單片機實現的邏輯分析儀——吸收篇

本內容記錄于韋東山老師的畢設級開源學習項目&#xff0c;含個人觀點&#xff0c;請理性閱讀。 個人筆記&#xff0c;沒有套路&#xff0c;一步到位&#xff0c;歡迎交流&#xff01; 00單片機的邏輯分析儀與商業版FPGA的邏輯分析儀異同 對比維度自制STM32邏輯分析儀商業版邏…

基數排序算法解析與TypeScript實現

基數排序&#xff08;Radix Sort&#xff09;是一種高效的非比較型整數排序算法&#xff0c;通過逐位分配與收集的方式實現排序。本文將深入解析其工作原理&#xff0c;并給出完整的TypeScript實現。 一、算法原理 1. 核心思想 多關鍵字排序&#xff1a;將整數按位數切割成不同…

最新全開源碼支付系統,贈送3套模板

最新全開源碼支付系統&#xff0c;贈送3套模板 碼支付是專為個人站長打造的聚合免簽系統&#xff0c;擁有卓越的性能和豐富的功能。它采用全新輕量化的界面UI 讓您能更方便快捷地解決知識付費和運營贊助的難題&#xff0c;同時提供實時監控和管理功能&#xff0c;讓您隨時隨地…

PHP基礎二【變量/輸出/數據類型/常量/字符串/運算符】

PHP基礎二 1. PHP變量2. PHP輸出3. 數據類型3.1 字符串3.2 整型3.3 浮點型3.4 布爾型3.5 數組3.6 對象3.7 NULL3.8 資源類型3.9 類型比較 4. 常量5. 運算符 1. PHP變量 1. 我們來看一個實例&#xff1a; <?php$x 5;$y 6;$z $x $y;echo $z; // echo 是輸出&#xff0c;…

ue5 仿鬼泣5魂類游戲角色和敵人沒有碰撞

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、問題原因二、設置碰撞2.讀入數據 總結 前言 ue5 仿鬼泣5魂類游戲角色和敵人沒有碰撞 一、問題原因 在UE5中&#xff0c;角色和敵人沒有碰撞可能是由多種原因導致的&#xff0c;以下是一些可能的原因及解決方法&#xff1a…

《AdaBoost:從弱分類器到強模型的進化之路》

目錄 1. AdaBoost 的核心思想 2. AdaBoost 的關鍵步驟 步驟 1&#xff1a;初始化樣本權重 步驟 2&#xff1a;迭代訓練弱分類器 步驟 3&#xff1a;組合弱分類器 3. 用例子詳解 AdaBoost 數據集&#xff1a; 迭代過程&#xff1a; 第1輪&#xff08;t1&#xff09;&am…

Android Settings 有線網設置界面優化

Android Settings 有線網設置界面優化 文章目錄 Android Settings 有線網設置界面優化一、前言二、簡單修改1、修改的EthernetSettings代碼&#xff1a;2、有線網ip獲取代碼&#xff1a;3、AndroidManifest.xml定義有線網的Activity4、修改后界面&#xff1a; 三、其他1、有線網…

基于web的生產過程執行管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 隨著世界經濟信息化、全球化的到來和電子商務的飛速發展&#xff0c;推動了很多行業的改革。若想達到安全&#xff0c;快捷的目的&#xff0c;就需要擁有信息化的組織和管理模式&#xff0c;建立一套合理、暢通、高效的線上管理系統。當前的生產過程執行管理存在管理效率…