• 當前位置:首頁 > IT技術 > 系統服務 > 正文

    Linux應用開發【第十五章】存儲設備應用開發
    2021-12-13 17:41:25

    @[TOC]

    15 存儲設備應用開發

    15.1 SD/TF卡,U盤使用步驟

    15.1.1 SD/TF卡,U盤的硬件接口

    Linux應用開發【第十五章】存儲設備應用開發

    ? 如上圖的100ask6ull開發板,⑦為USB口,U盤從這里插入;?為mico sd卡槽,micro sd卡可以直接從這里插入。

    ? 注:micro sd卡也叫tf卡,它是sd卡類的一種,還有sd卡,mini sd卡等,我們簡稱這一類都叫sd卡。

    15.1.2 確定設備點

    ①U盤確定設備點

    ? 下圖是未插入U盤前/dev/目錄下的內容

    Linux應用開發【第十五章】存儲設備應用開發

    ? 當我們插入U盤后/dev/目錄下的內容為下圖

    Linux應用開發【第十五章】存儲設備應用開發

    ? 由這兩幅圖,可以清楚看到插入U盤后,/dev/目錄下多了sda,sda1,很顯然這兩個東西就是和我們的U盤有關的。

    ? 當我們插入U盤linux系統一般都會提示該設備節點是哪個,下圖就是當我們插入U盤后我們串口終端接收的信息,上面提示了有U盤插入,同時設備節點是sda

    Linux應用開發【第十五章】存儲設備應用開發

    ? sd表示這是個scsi,sata硬盤設備。

    ? a:表示這是第一塊硬盤,

    ? 1:這是這塊硬盤的第一個分區,同時也是主分區。

    ? 根據以上內容,我們應該就能看出sda,sda1表示什么意思了。

    ? sda表示整個U盤存儲設備

    ? sda1表示是sda的第一個分區。

    ②SD卡確定設備點

    ? 下圖是未插入SD卡前/dev/目錄下的內容

    Linux應用開發【第十五章】存儲設備應用開發

    ? 當我們插入SD卡后/dev/目錄下的內容為下圖

    Linux應用開發【第十五章】存儲設備應用開發

    ? 由這兩幅圖,可以清楚看到插入SD卡后,/dev/目錄下多了mmcblk0,mmcblk0p1,很顯然這兩個東西就是和我們的SD卡有關的。

    ? 當我們插入sd卡,linux系統一般都會提示該設備節點是哪個,下圖就是當我們插入sd卡后我們串口終端接收的信息,上面提示了有sd卡插入,同時設備節點是mmcblk0

    Linux應用開發【第十五章】存儲設備應用開發

    ? mmc 應該是 sd 的前身,所以sd與mmc 的驅動通用,于是Linux 就把設備節點名稱延續下來了。

    blk表示這是塊設備,隨后跟的數字是該設備的編號blk0,表示編號為0的塊設備,區分塊設備用的。

    ? p表示是分區,p1 表示這是第一個分區。

    ? 根據以上內容,我們應該就能看出mmcblk0,mmcblk0p1表示什么意思了。

    ? mmcblk0表示整個sd卡設備

    ? mmcblk0p1表示這是sd卡設備的第一個分區。

    15.1.3 分區

    ? 我們使用fdisk工具來分區,

    ? 執行fdisk /dev/mmcblk0后,輸入m(進入菜單功能選項)進入 fdisk 畫面:

    Linux應用開發【第十五章】存儲設備應用開發

    ? 常用的是:d l m p q t w命令

    ? 我們嘗試利用剩余空間增加一個分區

    ? 此時按下w 就可以將分區信息存儲到分區表中,并離開 fdisk;如果你決定這樣的操作不對,也可以直接按下 q 取消剛剛的fdisk工具的所有動作,并退出fdisk。

    15.1.4 格式化并掛載

    ? 上一小節,我們新建立了一個分區,我們的第二個分區為 /dev/mmcblk0p2 ,分區類型為 Linux ,此時我們可以mkfs.ext3 /dev/mmcblk0p2對其進行格式化

    Linux應用開發【第十五章】存儲設備應用開發

    ? 此時我們可以用mount命令掛載該分區到我們想要的目錄

    mount -t ext3 /dev/mmcblk0p2 /mnt/

    ? 通過df –Th命令查看是否掛載成功。

    Linux應用開發【第十五章】存儲設備應用開發

    ? 當然我們也可以掛載mmcblk0p1這個分區,也是先指定某種文件系統格式化該分區,然后再用mount命令指定掛載的格式的同時掛載,最后df –Th命令查看是否掛載成功。

    ? U盤的分區,格式化,掛載等操作和sd卡一致,只是將/dev/mmcblk0 變成了/dev/sda1。

    15.1.5 介紹分區表

    Linux應用開發【第十五章】存儲設備應用開發

    ? 上圖是利用fdisk 里的p功能字,打印分區表功能顯示的。

    ? Device:表示這是哪一個分區,這里表示是mmcblk0的的一個分區;

    ? Boot:表示啟動引導標志;

    ? StartCHS:分區開始的柱面、磁頭、扇區;

    ? EndCHS:分區結束的柱面、磁頭、扇區;

    ? StartLBA:邏輯塊地址起始位置;

    ? EndLBA: 邏輯塊地址結束位置;

    ? Sectors: 扇區數量;

    ? Size:分區大小。

    ? Id與Type:成對出現,id表示文件系統類型編號,type表示文件系統類型標記

    ? 注:這里的Id與Type其實只是做個標記,并沒有實際變成我們想要的文件系統格式,因此如果需要掛載時,還需要用mkfs相關命令的格式化為對應文件系統格式后再掛載。

    15.2 自動掛載U盤

    15.2.1 udev規則

    ? udev是Linux(linux2.6內核之后)默認的設備管理工具。udev 以守護進程的形式運行,通過偵聽內核發出來的 uevent 來管理 /dev目錄下的設備文件。通過udev編寫對應規則,實現設備節點變化時做出規定的動作,例如本節所說的熱拔插實驗、

    ? udev常用的規則我們了解下。

    ? 1)規則文件中以 "#" 開頭的行以及空行將被忽略;

     2)規則文件必須以 .rules 作為后綴名,否則將被忽略;
    
     3)規則文件分別位于: 系統規則目錄(/usr/lib/udev/rules.d)、 運行時規則目錄(/run/udev/rules.d)、 本機規則目錄(/etc/udev/rules.d),/etc/ 的優先級最高、 /run/ 的優先級居中、 /usr/lib/ 的優先級最低,也就是說我們可以在本機規則目錄(/etc/udev/rules.d)下添加新的規則,它優先級最高,如果存有低優先級的同類規則,也會被高優先級的新規則替換掉,規則文件開頭的數字越小它的執行順序越靠前。
    
     4)"鍵"有兩種類型:匹配與賦值。 如果某條規則的所有匹配鍵的值都匹配成功,那么就表示此條規則匹配成功, 也就是此條規則中的所有賦值鍵都會被賦予指定的值。

    ? 匹配類:

    ? ①“==”等于;

    ? ②“!=”不等于;

    ? ③“ACTION”匹配事件的動作,例如"add"表示插入一個設備;

    ? ④“KERNEL”匹配設備的內核名稱,如sda;

    ? ⑤“SUBSYSTEM” 所屬的子系統。例如"sound"或"net"等。

    ? 賦值類:

    ? ①“=”,為鍵賦予指定的值;

    ? ②“LABEL”設置一個可用作 GOTO 跳轉目標的標簽;

    ? ③“GOTO” 跳轉到下一個匹配的 LABEL 標簽所在的規則;

    ? ④“RUN”{類型}對于每一個設備事件來說,在處理完規則之后,都可以再接著執行一個程序列表(默認為空)。 不同的"類型"含義如下:"program"一個外部程序, 如果是相對路徑, 那么視為相對于 /usr/lib/udev 目錄。 否則必須使用絕對路徑。如果未明確指定"類型", 那么這是默認值。"builtin"與 program 類似,但是僅用于表示內置的程序。程序名與其參數之間用空格分隔。 如果參數中含有空格,那么必須使用單引號(')界定。僅可使用運行時間非常短的前臺程序, 切勿設置任何后臺守護進程或者長時間運行的程序

    ?

    ? 如需更加詳細關于udev內容可以參考這兩篇文章《udev 中文手冊 [金步國]》,《Writing udev rules.html》文章鏈接已保存在本章對應目錄下。

    15.2.2 正則表達式

    ? 在udev的設備匹配上用到正則表達式,我們大致了解下,如需更加詳細的內容可以參考這篇文章《正則表達式30分鐘入門教程》,文章鏈接已保存在本章對應目錄下。

    ①在電腦上查找文件,如果需要找‘.c’文件,我們通常會用‘*.c’就可以查找全部的‘.c’文件,如下圖

    Linux應用開發【第十五章】存儲設備應用開發

    這里使用的 * 就是通配符,表示任意字符。

    ②如果我們想要更加精確的表達的話就無能為力了,因此引入了正則表達式。

    ·:表示任意字符(換行符除外);

    *:表示重復0次或更多次;

    +:表示重復1次或更多次;

    ?:表示重復0次或1次;

    [~]:表示這里面的字符里的某一個,例如[abc]表示abc中的其中一個,[1-9]表示1至9的其中一個。

    ? 例如leds?[1-3],其中s?表示s出現0次或者1次,[1-3]?表示1至3的某一個,出現0次或1次,根據以上信息匹配的結果就是leds,led1,led2,led3。我們通過一個語句就匹配了4個設備,多么簡練。

    15.2.3 自動掛載U盤

    ①創建用于掛載U盤的目錄

    mkdir /mnt/usb –p

    ②在/etc/udev/rules.d目錄下添加用于檢測U盤插入規則(add),終端下執行以下命令創建第一個U盤插入規則。

    vim /etc/udev/rules.d/11-add-usb.rules 

    在11-add-usb.rules中添加如下內容:

    ACTION!="add",GOTO="END"
    KERNEL=="sda[0-9]",RUN+="/etc/mount-usb.sh %k"
    LABEL="END"

    ? 上面的內容意思是:如果不是add添加事件,那么就跳到END標簽處結束,如果是add事件那么執行以下規則,如果添加的設備是sda0至sda9中任意一個,那么就執行RUN后面的內容,此處是一個腳本,一個掛載U盤的腳本,它還帶有個參數%k,表示kernel的值。

    ? 然后在/etc/目錄下創建mount-usb.sh腳本

    ? 在mount-usb.sh中添加如下內容:

    #!/bin/sh
    mount  -t vfat /dev/$1 /mnt/usb
    sync

    ? 上面的內容意思是:#!/bin/sh表示是腳本文件,按腳本文件解析,mount -t vfat /dev/$1 /mnt/usb表示按vfat格式將/dev/$1掛載到/mnt/usb目錄下,其中這里的$1就是之前規則里傳入進來的%k,也就是kernel值。Sync表示同步U盤數據。

    ? 最后記得給腳本文件添加執行權限。

    chmod +x /etc/mount-usb.sh

    ③在/etc/udev/rules.d目錄下添加用于檢測U盤移出規則(remove),終端下執行以下命令創建第U盤移出規則。

    vim /etc/udev/rules.d/11-remove-usb.rules

    在11-remove-usb.rules中添加如下內容:

    ACTION!="remove",GOTO="END"
    KERNEL=="sda[0-9]",RUN+="/etc/umount-usb.sh %k"
    LABEL="END"

    上面的內容意思是:如果不是remove添加事件,那么就跳到END標簽處結束,如果是remove事件那么執行以下規則,如果移出的設備是sda0至sda9中任意一個,那么就執行RUN后面的內容,此處是一個腳本,一個卸載U盤的腳本,它還帶有個參數%k,表示kernel的值。

    ? 然后在/etc/目錄下創建umount-usb.sh腳本

    ? 在umount-usb.sh中添加如下內容:

    #!/bin/sh
    sync
    umount /mnt/usb

    ? 上面的內容意思是:#!/bin/sh表示是腳本文件,按腳本文件解析,先同步U盤數據,然后再卸載,其中這里的$1就是之前規則里傳入進來的%k,也就是kernel值。

    ? 最后記得給腳本文件添加執行權限。

    chmod +x /etc/umount-usb.sh

    ④設置好規則后,當我們插入U盤,執行df –Th就會顯示如下圖

    Linux應用開發【第十五章】存儲設備應用開發

     表明/dev/sda1已經成功掛載在/mnt/usb目錄下了。

    ? 注1: vfat格式也就是fat32格式,使用vfat格式是由于windows操作系統與linux操作系統都支持,這樣U盤就可以在windows操作系統與linux操作系統之間作為交換文件的介質。

    ? 注2:Linux 系統中欲寫入U盤等存儲介質內時,有的時候為了效率起見,會寫到 filesystem buffer 中,這個 buffer 是一塊記憶體空間,如果欲真正的寫入U盤等存儲介質內需要執行sync 指令,它會將存于 buffer 中的數據強制寫入U盤等存儲介質內,這也是為什么腳本里在要加入sync的原因。

    15.3 掛載后就是一般的讀寫文件

    ? 成功掛載后,我們就可以在掛載目錄下進行創建,修改等文件操作,就等同于操作U盤上的文件。

    Linux應用開發【第十五章】存儲設備應用開發

      如上圖,我們在終端使用以下命令創建兩個文本文件。
    touch /mnt/usb/111.txt
    touch /mnt/usb/222.txt

    ? 然后再拔出U盤,插到電腦中查看是否存在111.tx與222.txt

    Linux應用開發【第十五章】存儲設備應用開發

    ? 我們可用在上面添加些內容,然后再插入開發板,查看電腦上修改的內容在開發板上是否顯示。在111.txt中添加abc,在222.txt中添加100ask,保存,彈出U盤,插入開發板。 通過cat命令查看內容,如下圖

    Linux應用開發【第十五章】存儲設備應用開發

    ? 顯示的內容正確,以后我們就可以通過U盤把電腦的東西往開發板上搬了。

    本文摘自 :https://blog.51cto.com/w

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码