linux一切皆文件之塊設備文件(四)

来源:https://www.cnblogs.com/MrVolleyball/archive/2018/11/21/9993137.html
-Advertisement-
Play Games

一、知識準備 1、在linux中,一切皆為文件,所有不同種類的類型都被抽象成文件(比如:塊設備,socket套接字,pipe隊列) 2、操作這些不同的類型就像操作文件一樣,比如增刪改查等 3、塊設備是將信息存儲在大小固定的塊中,每一個塊都有自己的地址,塊設備支持隨機訪問。典型的塊設備比如我們使用的硬 ...


一、知識準備

1、在linux中,一切皆為文件,所有不同種類的類型都被抽象成文件(比如:塊設備,socket套接字,pipe隊列)
2、操作這些不同的類型就像操作文件一樣,比如增刪改查等
3、塊設備是將信息存儲在大小固定的塊中,每一個塊都有自己的地址,塊設備支持隨機訪問。典型的塊設備比如我們使用的硬碟


二、環境準備

組件 版本
OS Ubuntu 16.04.4 LTS


三、主設備號(major)與次設備號(minor)

● 當一塊磁碟被註冊到操作系統的時候,會被分配主設備號與次設備號
● 其中主設備號代表了該設備屬於的類型,次設備號代表了該設備在操作系統中的唯一標識

主設備號

root@Bastion:~# ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0 9月  30 17:47 /dev/sda
brw-rw---- 1 root disk 8,  1 9月  30 17:47 /dev/sda1

sda的主設備號是8,代表了sda這塊磁碟是屬於8這個類型的,那8是什麼類型的?

root@Bastion:~# grep 8 /proc/devices
108 ppp
128 ptm
248 pps
  8 sd

在/proc/devices告訴我們,8是屬於sd類型的,那sd又是啥意思?

打開 https://www.kernel.org/doc/Documentation/admin-guide/devices.txt

   8 block  SCSI disk devices (0-15)
          0 = /dev/sda      First SCSI disk whole disk
         16 = /dev/sdb      Second SCSI disk whole disk
         32 = /dev/sdc      Third SCSI disk whole disk
            ...
        240 = /dev/sdp      Sixteenth SCSI disk whole disk

        Partitions are handled in the same way as for IDE
        disks (see major number 3) except that the limit on
        partitions is 15.

終於清楚的看到,8這個類型代表了塊設備,並且是SCSI 硬碟

次設備號

由於/dev/sda做了1個分區/dev/sda1,再加上原有的/dev/sda,操作系統內核給二者打上了唯一的標記:
8,0 代表了/dev/sda
8,1 代表了/dev/sda1

小結一下:
主設備號:代表著某一類型的設備,比如SCSI硬碟、虛擬硬碟、USB等等
次設備號:操作系統分配的整數,與主設備號一起(major,minor),組成了該設備在操作系統當中唯一的ID

四、塊設備文件

● 塊設備文件是連接用戶空間和內核空間的橋梁,通過塊設備文件描述符,能夠找到內核中的設備驅動程式
● 通過內核中的驅動程式從而對該設備進行讀寫

   +----------------------+
   | user space           |
   |                      |
   |      +---------+     |
   |      | test.py |     |
   |      +---------+     |
   +----------------------+
               |
               |
          +----v----+
          |/dev/sda1|
          +----+----+
               |
               |(8,1)
               |
+---------------------------------------------
| kernel space |                             |
|              |                             |
|              v                             |
|        +-----+----+      +---------------+ |
|        | major:8  |      | device driver | |
|        +-----+----+      |               | |
|              |           +---------------+ |       +--------+
|              +---------->|  minor:1      |-------->| device |
|                          +---------------+ |       +--------+
|                          |               | |
|                          +---------------+ |
+--------------------------------------------+


五、測試

(a)首先虛擬一個塊設備文件

root@Bastion:~# dd if=/dev/zero of=/tmp/device_test bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0890014 s, 1.2 GB/s
root@Bastion:~# mknod /dev/device_test b 7 80
root@Bastion:~# losetup /dev/device_test /tmp/device_test

我們已經虛擬出一個塊設備文件了,由於是通過losetup虛擬出來的,所以major號只能為7

下麵將該塊設備格式化、掛載:

root@Bastion:~# mkfs.ext4 /dev/device_test
mke2fs 1.42.13 (17-May-2015)
Discarding device blocks: done
Creating filesystem with 102400 1k blocks and 25688 inodes
Filesystem UUID: f38c24be-851b-41ff-8d55-4e692d5a4c83
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

root@Bastion:~# mount /dev/device_test /mnt
root@Bastion:~# df -h | grep /mnt
/dev/device_test   93M  1.6M   85M   2% /mnt
root@Bastion:/mnt# ls -l /dev/device_test
brw-r--r-- 1 root root 7, 80 Nov 12 09:54 /dev/device_test

至此,我們擁有了一個塊設備,並且大小為100M

(b)測試腳本

準備一個python文件,每秒往test.log寫入hello world

root@Bastion:/mnt# more device_test.py
import time
f = open('test.log','a+')
while 1:
    f.write('hello world\n')
    time.sleep(1)

運行並查看其打開的文件描述符

root@Bastion:/mnt# python device_test.py &
[1] 25873
root@Bastion:/mnt# lsof -n | grep 25873
COMMAND     PID   TID             USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
...
python    25873                   root    3u      REG               7,80      8923         14 /mnt/test.log

整理一下我們的信息:

● 首先運行腳本,它的進程號為25873。腳本的邏輯是需要打開test.log,然後進行讀寫
● 由於腳本中是相對路徑,並且當前目錄在/mnt下,/mnt相關聯的硬碟是/dev/device_test
● 進程通過/dev/device_test拿到了該設備的設備號(7,80)
● 通過設備號在記憶體中找到對應的設備驅動程式,然後通過設備驅動程式對塊設備進行讀寫
● 在塊設備上沒有發現test.log,首先創建一個,然後開始對該文件每秒寫入一句'hello world'


六、小結

● 當塊設備掛載的時候,會先在操作系統的/dev下創建一個塊設備文件,並且分配主設備號與次設備號
● 塊設備文件是連接用戶空間和內核空間的橋梁,應用程式通過它能夠找到在內核中的設備驅動,從而實現對設備的讀寫



至此,本文結束
在下才疏學淺,有撒湯漏水的,請各位不吝賜教...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 恢復內容開始 1.使用yum安裝 2.創建倉庫 1.創建成功後在svn下麵多了幾個文件夾。 2.特別關註一下conf文件夾,這個是存放配置文件的 3.配置passwd 賬號密碼 4.配置authz 許可權 5.配置svnserve.conf 5.啟動與停止 6.連接測試 這裡使用TortoiseSVN ...
  • 老夫生於上世紀五十年代,作為八零後的大叔,九零後的老伯,同時也是你們動輒就要重裝的操作系統,我的學名是“電腦管理控製程序”,英譯“operating system”,小老弟們常喊我“OS”。雖說是老弟,目的卻都不怎麼單純,大部分人只想玩我,剩下一小撮人卻鐘愛探索我的身體,他們沉迷於當下,但真正願意... ...
  • 關於systemd的學習筆記,講述了主要用法指令、配置以及如何自定義單元等 ...
  • 1.firewalld共用上網 1.服務端操作(有外網的伺服器) 1.開啟防火牆並加入開機自啟動 2.移除預設所有人能訪問ssh的規則 3.添加只允許10.0.0.1這台主機訪問 4.開啟ip偽裝,為後續主機提供共用上網【管理機】 5.重啟firewalld生效 2.沒有外網的伺服器操作 1.沒有公 ...
  • 一、命令介紹 groupadd:創建用戶組 groupmod:修改用戶組屬性 groupdel:刪除用戶組 二、實例 groupadd 添加用戶組testusers groupadd testusers 這裡我們知道查看用戶信息我們可以通過/etc/passwd 來查看。 查看組信息我們則可以通過查 ...
  • 首先,說一下問題發生的場景: 因為懶,所以用 yum 安裝 apache ,因為 centos 的源自帶 php 5.4 不能符合環境要求,而不想用其他源,所以選擇源碼編譯安裝 php 5.6 安裝完畢後,apache 不解析 php ,不解析的現象是瀏覽器直接顯示或下載了 php 文件的源代碼 過 ...
  • 一、linux的用戶 linux的用戶和windwos差不多,分為管理員用戶和普通用戶。 普通用戶:許可權沒那麼高而已。 管理員用戶:在linux中就是 root 用戶,所擁有的許可權是最高的。 二、linux的目錄結構 註意:Linux中沒有像windows那樣分c盤、d盤...最底層就是 / 也就是 ...
  • kuberntes 系統使用 etcd 存儲所有數據,是最重要的組件之一,註意 etcd集群只能有奇數個節點(1,3,5...),本文檔使用3個節點做集群。 一、基礎環境 軟體包 etcd下載地址: "https://github.com/coreos/etcd/releases" 伺服器 架構圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...