- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如何获得 serial number
的 hard disk
使用 Python
驱动在 Linux
?
最佳答案
正如您所建议的,fcntl是在 Linux 上执行此操作的方法。您要翻译的 C 代码如下所示:
static struct hd_driveid hd;
int fd;
if ((fd = open("/dev/hda", O_RDONLY | O_NONBLOCK)) < 0) {
printf("ERROR opening /dev/hda\n");
exit(1);
}
if (!ioctl(fd, HDIO_GET_IDENTITY, &hd)) {
printf("%.20s\n", hd.serial_no);
} else if (errno == -ENOMSG) {
printf("No serial number available\n");
} else {
perror("ERROR: HDIO_GET_IDENTITY");
exit(1);
}
在 Ubuntu 9.10 上翻译成 Python,有点像这样:
import sys, os, fcntl, struct
if os.geteuid() > 0:
print("ERROR: Must be root to use")
sys.exit(1)
with open(sys.argv[1], "rb") as fd:
# tediously derived from the monster struct defined in <hdreg.h>
# see comment at end of file to verify
hd_driveid_format_str = "@ 10H 20s 3H 8s 40s 2B H 2B H 4B 6H 2B I 36H I Q 152H"
# Also from <hdreg.h>
HDIO_GET_IDENTITY = 0x030d
# How big a buffer do we need?
sizeof_hd_driveid = struct.calcsize(hd_driveid_format_str)
# ensure our format string is the correct size
# 512 is extracted using sizeof(struct hd_id) in the c code
assert sizeof_hd_driveid == 512
# Call native function
buf = fcntl.ioctl(fd, HDIO_GET_IDENTITY, " " * sizeof_hd_driveid)
fields = struct.unpack(hd_driveid_format_str, buf)
serial_no = fields[10].strip()
model = fields[15].strip()
print("Hard Disk Model: %s" % model)
print(" Serial Number: %s" % serial_no)
## For documentation purposes, this is the struct copied from <hdreg.h>
# struct hd_driveid {
# unsigned short config; /* lots of obsolete bit flags */
# unsigned short cyls; /* Obsolete, "physical" cyls */
# unsigned short reserved2; /* reserved (word 2) */
# unsigned short heads; /* Obsolete, "physical" heads */
# unsigned short track_bytes; /* unformatted bytes per track */
# unsigned short sector_bytes; /* unformatted bytes per sector */
# unsigned short sectors; /* Obsolete, "physical" sectors per track */
# unsigned short vendor0; /* vendor unique */
# unsigned short vendor1; /* vendor unique */
# unsigned short vendor2; /* Retired vendor unique */
# unsigned char serial_no[20]; /* 0 = not_specified */
# unsigned short buf_type; /* Retired */
# unsigned short buf_size; /* Retired, 512 byte increments
# * 0 = not_specified
# */
# unsigned short ecc_bytes; /* for r/w long cmds; 0 = not_specified */
# unsigned char fw_rev[8]; /* 0 = not_specified */
# unsigned char model[40]; /* 0 = not_specified */
# unsigned char max_multsect; /* 0=not_implemented */
# unsigned char vendor3; /* vendor unique */
# unsigned short dword_io; /* 0=not_implemented; 1=implemented */
# unsigned char vendor4; /* vendor unique */
# unsigned char capability; /* (upper byte of word 49)
# * 3: IORDYsup
# * 2: IORDYsw
# * 1: LBA
# * 0: DMA
# */
# unsigned short reserved50; /* reserved (word 50) */
# unsigned char vendor5; /* Obsolete, vendor unique */
# unsigned char tPIO; /* Obsolete, 0=slow, 1=medium, 2=fast */
# unsigned char vendor6; /* Obsolete, vendor unique */
# unsigned char tDMA; /* Obsolete, 0=slow, 1=medium, 2=fast */
# unsigned short field_valid; /* (word 53)
# * 2: ultra_ok word 88
# * 1: eide_ok words 64-70
# * 0: cur_ok words 54-58
# */
# unsigned short cur_cyls; /* Obsolete, logical cylinders */
# unsigned short cur_heads; /* Obsolete, l heads */
# unsigned short cur_sectors; /* Obsolete, l sectors per track */
# unsigned short cur_capacity0; /* Obsolete, l total sectors on drive */
# unsigned short cur_capacity1; /* Obsolete, (2 words, misaligned int) */
# unsigned char multsect; /* current multiple sector count */
# unsigned char multsect_valid; /* when (bit0==1) multsect is ok */
# unsigned int lba_capacity; /* Obsolete, total number of sectors */
# unsigned short dma_1word; /* Obsolete, single-word dma info */
# unsigned short dma_mword; /* multiple-word dma info */
# unsigned short eide_pio_modes; /* bits 0:mode3 1:mode4 */
# unsigned short eide_dma_min; /* min mword dma cycle time (ns) */
# unsigned short eide_dma_time; /* recommended mword dma cycle time (ns) */
# unsigned short eide_pio; /* min cycle time (ns), no IORDY */
# unsigned short eide_pio_iordy; /* min cycle time (ns), with IORDY */
# unsigned short words69_70[2]; /* reserved words 69-70
# * future command overlap and queuing
# */
# unsigned short words71_74[4]; /* reserved words 71-74
# * for IDENTIFY PACKET DEVICE command
# */
# unsigned short queue_depth; /* (word 75)
# * 15:5 reserved
# * 4:0 Maximum queue depth -1
# */
# unsigned short words76_79[4]; /* reserved words 76-79 */
# unsigned short major_rev_num; /* (word 80) */
# unsigned short minor_rev_num; /* (word 81) */
# unsigned short command_set_1; /* (word 82) supported
# * 15: Obsolete
# * 14: NOP command
# * 13: READ_BUFFER
# * 12: WRITE_BUFFER
# * 11: Obsolete
# * 10: Host Protected Area
# * 9: DEVICE Reset
# * 8: SERVICE Interrupt
# * 7: Release Interrupt
# * 6: look-ahead
# * 5: write cache
# * 4: PACKET Command
# * 3: Power Management Feature Set
# * 2: Removable Feature Set
# * 1: Security Feature Set
# * 0: SMART Feature Set
# */
# unsigned short command_set_2; /* (word 83)
# * 15: Shall be ZERO
# * 14: Shall be ONE
# * 13: FLUSH CACHE EXT
# * 12: FLUSH CACHE
# * 11: Device Configuration Overlay
# * 10: 48-bit Address Feature Set
# * 9: Automatic Acoustic Management
# * 8: SET MAX security
# * 7: reserved 1407DT PARTIES
# * 6: SetF sub-command Power-Up
# * 5: Power-Up in Standby Feature Set
# * 4: Removable Media Notification
# * 3: APM Feature Set
# * 2: CFA Feature Set
# * 1: READ/WRITE DMA QUEUED
# * 0: Download MicroCode
# */
# unsigned short cfsse; /* (word 84)
# * cmd set-feature supported extensions
# * 15: Shall be ZERO
# * 14: Shall be ONE
# * 13:6 reserved
# * 5: General Purpose Logging
# * 4: Streaming Feature Set
# * 3: Media Card Pass Through
# * 2: Media Serial Number Valid
# * 1: SMART selt-test supported
# * 0: SMART error logging
# */
# unsigned short cfs_enable_1; /* (word 85)
# * command set-feature enabled
# * 15: Obsolete
# * 14: NOP command
# * 13: READ_BUFFER
# * 12: WRITE_BUFFER
# * 11: Obsolete
# * 10: Host Protected Area
# * 9: DEVICE Reset
# * 8: SERVICE Interrupt
# * 7: Release Interrupt
# * 6: look-ahead
# * 5: write cache
# * 4: PACKET Command
# * 3: Power Management Feature Set
# * 2: Removable Feature Set
# * 1: Security Feature Set
# * 0: SMART Feature Set
# */
# unsigned short cfs_enable_2; /* (word 86)
# * command set-feature enabled
# * 15: Shall be ZERO
# * 14: Shall be ONE
# * 13: FLUSH CACHE EXT
# * 12: FLUSH CACHE
# * 11: Device Configuration Overlay
# * 10: 48-bit Address Feature Set
# * 9: Automatic Acoustic Management
# * 8: SET MAX security
# * 7: reserved 1407DT PARTIES
# * 6: SetF sub-command Power-Up
# * 5: Power-Up in Standby Feature Set
# * 4: Removable Media Notification
# * 3: APM Feature Set
# * 2: CFA Feature Set
# * 1: READ/WRITE DMA QUEUED
# * 0: Download MicroCode
# */
# unsigned short csf_default; /* (word 87)
# * command set-feature default
# * 15: Shall be ZERO
# * 14: Shall be ONE
# * 13:6 reserved
# * 5: General Purpose Logging enabled
# * 4: Valid CONFIGURE STREAM executed
# * 3: Media Card Pass Through enabled
# * 2: Media Serial Number Valid
# * 1: SMART selt-test supported
# * 0: SMART error logging
# */
# unsigned short dma_ultra; /* (word 88) */
# unsigned short trseuc; /* time required for security erase */
# unsigned short trsEuc; /* time required for enhanced erase */
# unsigned short CurAPMvalues; /* current APM values */
# unsigned short mprc; /* master password revision code */
# unsigned short hw_config; /* hardware config (word 93)
# * 15: Shall be ZERO
# * 14: Shall be ONE
# * 13:
# * 12:
# * 11:
# * 10:
# * 9:
# * 8:
# * 7:
# * 6:
# * 5:
# * 4:
# * 3:
# * 2:
# * 1:
# * 0: Shall be ONE
# */
# unsigned short acoustic; /* (word 94)
# * 15:8 Vendor's recommended value
# * 7:0 current value
# */
# unsigned short msrqs; /* min stream request size */
# unsigned short sxfert; /* stream transfer time */
# unsigned short sal; /* stream access latency */
# unsigned int spg; /* stream performance granularity */
# unsigned long long lba_capacity_2;/* 48-bit total number of sectors */
# unsigned short words104_125[22];/* reserved words 104-125 */
# unsigned short last_lun; /* (word 126) */
# unsigned short word127; /* (word 127) Feature Set
# * Removable Media Notification
# * 15:2 reserved
# * 1:0 00 = not supported
# * 01 = supported
# * 10 = reserved
# * 11 = reserved
# */
# unsigned short dlf; /* (word 128)
# * device lock function
# * 15:9 reserved
# * 8 security level 1:max 0:high
# * 7:6 reserved
# * 5 enhanced erase
# * 4 expire
# * 3 frozen
# * 2 locked
# * 1 en/disabled
# * 0 capability
# */
# unsigned short csfo; /* (word 129)
# * current set features options
# * 15:4 reserved
# * 3: auto reassign
# * 2: reverting
# * 1: read-look-ahead
# * 0: write cache
# */
# unsigned short words130_155[26];/* reserved vendor words 130-155 */
# unsigned short word156; /* reserved vendor word 156 */
# unsigned short words157_159[3];/* reserved vendor words 157-159 */
# unsigned short cfa_power; /* (word 160) CFA Power Mode
# * 15 word 160 supported
# * 14 reserved
# * 13
# * 12
# * 11:0
# */
# unsigned short words161_175[15];/* Reserved for CFA */
# unsigned short words176_205[30];/* Current Media Serial Number */
# unsigned short words206_254[49];/* reserved words 206-254 */
# unsigned short integrity_word; /* (word 255)
# * 15:8 Checksum
# * 7:0 Signature
# */
# };
抱歉,我认为将原始 C 结构作为注释包含在内很有用。另外,我对 fcntl
都很陌生和 struct
模块,所以我可能正在做一些单一的事情。无论如何,从命令行运行(使用 root privelidges)它看起来像这样(我已经编辑了我的确切序列以保护隐私):
fmark@fmark-laptop:~/Desktop/hdserial$ sudo python hd.py "/dev/sda"
Hard Disk Model: FUJITSU MHV2080BH PL
Serial Number: NW--------
为了能够理解这里发生了什么,您需要查看 #include <linux/hdreg.h>
在原始的 C 程序中。这包括导入 HDIO_GET_IDENTITY
常数和 struct hd_driveid
.我已经将结构体作为注释复制到了上面的python源代码中,这里不再赘述。了解 HDIO_GET_IDENTITY
的情况, grep 它的源代码(在 Ubuntu 上是 /usr/include/linux/hdreg.h
。你应该找到类似这样的东西:
#define HDIO_GET_IDENTITY 0x030d /* get IDE identification info */
因此,您会发现 HDIO_GET_IDENTITY
只是一个常数,告诉 fcntl 你有兴趣获取高清信息。您会注意到,相同的值(0x030d
是十六进制表示的整数)被分配给 Python 代码中的变量。
我现在意识到您对 Linux 很感兴趣,但我将把它留在这里以备后用。以下将获取Windows上的硬盘序列号(您需要安装wmi package):
import wmi
c = wmi.WMI()
for item in c.Win32_PhysicalMedia():
print item
关于python - 如何使用 Python 获取硬盘序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4193514/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!