網站首頁 編程語言 正文
????????本篇文章介紹嵌入式平臺linux系統中raid0如何使用,并了解raid0磁盤陣列的工作原理,在后面文章中介紹pcie+switch存儲方案raid0陣列的實現。在linux系統中raid0配置使用的mdadm命令,在嵌入式平臺中,mdadm命令一般默認是沒有的,需要手動安裝mdadm命令。本次編寫塊設備驅動用兩片內存模擬磁盤做raid0,在塊設備中提供讀寫內存接口,打印內存接口,方便跟蹤mdadm命令工作原理。
安裝mdadm命令
- 下載mdadm.tar.gz
- tar –xzvf mdadm.tar.gz
- make ?CROSS_COMPILE=arm-linux-gnueabihf- 這里指定自己平臺的編譯器,如果編譯中報錯,修改Makefile,去掉CWFLAGS中的-Werror,再次編譯就可以通過。
- 將當前目錄的mdadm命令拷貝到嵌入式平臺中
塊設備驅動程序編寫是比較簡單的,這里我僅貼代碼,就不講解具體的代碼。
驅動初始化函數,提供了塊設備驅動初始化和注冊,分配了一塊4MB大小的內存,用于模擬磁盤,具體代碼如下所示。
??????驅動初始化函數中提供了file_operations接口和request_queue塊設備請求隊列,?request_queue用于文件系統與磁盤之間的數據交互,交互最小單元為一個bio結構,最常見的一次數據交互大小為4KB,請求隊列函數如下所示。
- ????????塊設備請求隊列函數中,添加了打印信息,方便查看本次bio請求讀寫的扇區位置和扇區的個數,通過判斷bio結構的讀寫實現bio緩存到內存的拷貝或內存到bio緩存的拷貝,ramblock_buf這個就是用內存模擬的磁盤,大小為4MB,在file_operations結構的read函數中,程序會讀取這個內存的數據,方便跟蹤兩塊磁盤中數據的分布,file_operations結構代碼如下所示。
????????在read函數中,將拷貝ramblock_buf這塊內存的數據到應用程序,拷貝多大通過上位機調用read函數是傳入參數。應用程序將讀兩個驅動程序的內存數據,同時創建遞增數文件,遞增數文件方便對比兩片內存的關聯性。
遞增數文件創建函數如下所示。
????????應用程序主程序會讀取內存數據,并且將數據寫入到data0或者data1文件中,具體代碼如下所示。
????????代碼準備工作已經完成,開始上板實測效果,需要先配置內核支持raid0,具體配置如下。
????????在開發板中手動加載驅動程序,同時執行mdadm命令,本次chunk大小為64KB,具體操作如下所示。
????????mdadm --query /dev/md0和./mdadm --detail /dev/md0命令用于查詢raid0設備信息,通過查詢設備信息可以確定raid0制作完成,下面開始格式化文件系統,掛載文件系統,拷貝遞增數據到掛載目錄,并且執行應用程序,將讀取的兩個內存數據分別通過tftp命令拷貝到windos。
????????通過compare比較data0和data1文件,發現生成的數據文件規律為一邊拷貝64k的數據,這也正是raid0的基本原理,比較數據如下所示。
????????左右紅框的內的數據,上下一行的差值都是0x4000=16KB,但是數據時32字節對齊的,所以數據的總數為16Kb*4=64KB,跟mdadm創建時指定的chunk參數一致,左右紅框中,右邊的結尾剛好是左邊紅框的開始,這也說明數據時左右以64KB大小在切換。本篇文章講解了linux系統中raid0的使用方法,也給出了詳細測試說明,后面文章分析pcie-switch價格raid0陣列方案設計。
所有命令如下:
insmod ram_drv0.ko insmod ram_drv1.ko ./mdadm -Cv /dev/md0 --chunk=64 -l0 -n2 /dev/ramblock0 /dev/ramblock1 ./mdadm --query /dev/md0 ./mdadm --detail /dev/md0 mkfs.ext4 /dev/md0 mount /dev/md0 /tmp/ cp increase.data /tmp/ ./test_raid0 0 0 8192 tftp -p -l data0 10.10.10.66 ./test_raid0 1 0 8192 tftp -p -l data1 10.10.10.66 |
原文鏈接:https://blog.csdn.net/qq_21792169/article/details/122474736
相關推薦
- 2022-10-08 Pandas數據分析之pandas文本處理_python
- 2022-03-04 運行 npm 會彈出詢問 “你要如何打開這個文件?“
- 2023-01-05 Kotlin?泛型邊界型變及星投影使用詳解_Android
- 2022-03-26 C++鏈表節點的添加和刪除介紹_C 語言
- 2022-05-15 Qt windows打開資源管理器并高亮文件
- 2023-12-20 UML類圖中各箭頭表示總結
- 2022-07-04 Python繪制多因子柱狀圖的實現示例_python
- 2022-06-23 30行代碼實現React雙向綁定hook的示例代碼_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支