2016-07-04 61 views
11

以絕對文件路徑開始,我希望獲得以下信息:如何獲取Linux上的文件路徑詳細的設備/分區信息(如UUID,串口硬盤等)

  1. 的掛載點文件系統的存儲位置(爲了計算相對於安裝點的路徑)
  2. 文件系統的UUID和標籤
  3. 硬件的類型(或供應商名稱)和序列號包含分區的驅動器

我知道2和3在許多情況下可能是不確定的(例如,用於回送,ramfs,encyrpted設備),這是完全沒問題的。 我也知道如何使用外殼和系統工具(如df/sys/proc文件系統)獲取該信息。請參閱this question以供參考。

但是,我正在尋找最簡單的方法來用Python 3.5編程。這意味着:

  • 身高系統調用的/proc/sys解析內容,而不是
  • 避免調用子流程和分析它們的輸出(煩瑣的定義)(可能隨時更改或依賴於內核配置?)

到目前爲止,我在路徑上使用os.stat()stat_result.st_dev獲取塊設備的主要和次要號碼。但是,有什麼正確的方法呢?

有例如

  • /proc/mounts
  • /proc/partitions
  • /sys/dev/block/<major>:<minor>

注: 關於安裝塊設備的分區,/proc/mounts/proc/partitions似乎是規範的信息源(這是OK)。對於的UUID,標籤,連續等我目前使用udevadm和解析輸出:

def get_udev_properties(dev_name):   
    cmd = ["udevadm", "info", "--query=property", "--name", dev_name] 
    result = subprocess.run(cmd, stdout=subprocess.PIPE) 
    return parse_properties(result.stdout) 

此外應注意:從我acutal抽象的問題,人們可能要問更普遍的:

  • 對於Linux系統調用和內核文件系統,塊設備的規範標識或表示是什麼?
  • 什麼是通過主要和次要號碼獲得表示的正確方法?
  • 獲取有關塊設備的詳細信息的正確方法是什麼?
+1

當前'/斌/ mount'工作的版本中找到。 [這裏解釋文件的結構](https://www.kernel.org/doc/Documentation/filesystems/proc.txt)。 [問題的答案如何使用C](http://stackoverflow.com/questions/9280759/linux-function-to-get-mount-points)表示沒有更好的選擇。 – Phillip

+0

@Phillip如果從'/ proc'解析文件是規範的方式,那麼這是一個有效的答案。我發現很難找到關於我想獲得的數據的規範性參考資料/最佳實踐。 –

+0

'os.stat'很好,沒有什麼不妥之處。 –

回答

1

這將意味着一些公用事業和anlyze輸出。使用os.popen啓動,您可以使用bklkid查找uuids,讀取/etc/mtab文件許可證可以知道系統中安裝了哪些文件系統,從而裝入點。 sfdisk -l輸出爲您提供了磁盤解剖。 hdparm -I /dev/xxx會給你序列號。

3

這是一個script on GitHub我早些時候今天使用Python獲取有關驅動器的品牌和型號(和許多其他人的)信息碰到。

/proc/partitions持有的分區信息;有關更詳細的信息,您可以像現在一樣運行子進程,或者例如GPT do the parsing yourself

+0

我將賞金賞給你,因爲你的回答包含了我最有用的信息(或者指向我)。但是,我不會接受它,因爲關於最佳實踐或規範解決方案沒有明確的答案。到現在爲止,我甚至懷疑我會在SO上得到這樣的答案。主要是因爲它是一個特定的話題。 –

+0

謝謝,我同意不接受答案。可能你可以問SuperUser? – LSerni

+0

我現在可能會離開它。我目前的解決方案似乎運作良好,但我不太喜歡它。通過查看替代方案(例如,像'hdparm'那樣花哨的'ioctl'調用或直接與'dbus'或'udev'交互)解析'/ proc'和'udevadm'的輸出似乎是一個好主意。 –

2

做到這一點的最好辦法是通過pyparted。 Pyparted是由Parted開發人員維護的Parted的python綁定。你可以找到源代碼on github。不幸的是UUID的無法分開,所以你必須通過閱讀'的/ proc /自/ mountinfo`解析blkid

相關問題