Windows系统&Linux系统(Docker内)获取硬件信息Java

    应公司要求,做一个需求,需要获取本机或者服务器的某些唯一信息,比如MAC地址,CPU序列号等硬件信息;方法都大同小异,主要的就是通过命令来获取信息,这里只列举方法!

    在Windows系统上运行代码基本没有什么难点和容易犯的错误,各种方法都可,容易出问题的地方是在linux上获取硬件信息;

// 主板序列号 windows
	private static String getMainBordId_windows() {
		String result = "";
		try {
			File file = File.createTempFile("realhowto", ".vbs");
			file.deleteOnExit();
			FileWriter fw = new java.io.FileWriter(file);
 
			String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
					+ "Set colItems = objWMIService.ExecQuery _ \n" + "   (\"Select * from Win32_BaseBoard\") \n"
					+ "For Each objItem in colItems \n" + "    Wscript.Echo objItem.SerialNumber \n"
					+ "    exit for  ' do the first cpu only! \n" + "Next \n";
 
			fw.write(vbs);
			fw.close();
			Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
			BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String line;
			while ((line = input.readLine()) != null) {
				result += line;
			}
			input.close();
		} catch (Exception e) {
			logger.error("获取主板信息错误", e);
		}
		return result.trim();
	}

// 主板序列号 linux
	private static String getMainBordId_linux() {
 
		String result = "";
		String maniBord_cmd = "dmidecode | grep 'Serial Number' | awk -F ':' '{print $2}' | tail -1";
		Process p;
		try {
			p = Runtime.getRuntime().exec(new String[] { "sh", "-c", maniBord_cmd });// 管道
			BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String line;
			while ((line = br.readLine()) != null) {
				result += line;
				break;
			}
			br.close();
		} catch (IOException e) {
			logger.error("获取主板信息错误", e);
		}
		return result;
	}

Linux命令: 

dmidecode:获取硬件信息;

grep 'Serial Number':截取Serial Number字段内容;

awk -F ’:‘  :以“:” 分割获取到的Serial Number字段内容;

'{print $2}' “:打印分割开的内容的第二段;

想要获取其他硬件信息只需更换字段和关键符号即可,举一反三。

==============================================================================================================》

遇到的问题及解决方法(以下问题皆出自Linux系统):

问题:

有一些命令,比如 ifconfig,sudo su,dmidecode手动输入都能够打印出相关信息,但是当把这些命令写道Java代码里远程执行就不行了,显示:Cannot run program xxx:Error=2,No such file or directory;任何信息都是null,一开始我以为是系统环境变量没配置好,于是我找到了以后下解决方法:

方法一 :

在用户的 home 目录下的文件 .bashrc 加入export PATH=$PATH:/sbin ,然后执行source   .bashrc  就可以执行 ifconfig 命令了(因为基本所有命令都在sbin目录)

解决办法二:

在用户目录的.bashrc文件里加上 source /etc/profile

一般来说这两个方法确实管用,并且这两个方法误导我很长时间,以致于我一直认为是代码出错,于是修改不停的代码,结果还是报错。

==============================================================================================================》

后来偶然看到一篇文章,恍然大悟,因为我们的项目是在Linux系统的docker容器中运行的,

通过上面的代码我们不难看懂,JAVA通过

Runtime.getRuntime().exec(“xxxxxx”)

这段代码去运行了dos命令。

正常运行倒也没什么问题,重点是docker是个什么东西,它是个容器化技术,它只为服务运行提供最低标准的运行环境以降低内存消耗。这里划个重点,最低标准。相当于容器内只有残缺的linux系统和你的服务代码,只要服务的代码能跑起来,我这个系统内其他的东西都是多余的,容器内都不需要,比如说dmidecode。

我们刚才的代码中就用到了dmidecode命令。由于容器内没有dmidecode工具,那么一执行,就会报错。

解决方法(重点):

如果要在docker容器中运行dmidecode命令,那么要将宿主机的如下两个目录挂载到容器中,
1:/sbin/dmidecode --这个目录是dmidecode程序的目录,如果不挂载那么容器中识别不了dmidecode命令;
2:/dev/mem --dmidecode调用时会使用到mem这个文件,如果不挂载会找不到文件;
并且还需要在启动时增加 --privileged=ture 这个参数,让容器获得近似于宿主机root的权限。

修改完之后我也是解决了困扰我许久的问题。

注意点:

1、/sbin/dmidecode直接挂载为容器中的/sbin/dmidecode,不要修改成其他的目录名;
2、不要注释原来的脚本,不要把/data映射注释修改了,会导致容器找不到Jar包,启动失败;
3、容器的启动函数中多或者少一个字符 ,会导致容器启动参数不完整,无法启动;

PS:对于不太了解运维及部署知识的小伙伴来说修改这个可能还是比较棘手,万一改出毛病来得不偿失,建议找运维人员修改。

总结一下,其实容器中想要用的任何东西,无论是文件还是程序还是什么别的,都可以通过挂载的形式从宿主机中挂载到容器中,让容器中可以访问到。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为一个 AI 语言模型,我认为在安装 Docker 时,WindowsLinux 系统都有各自的优劣势。Windows 系统在安装 Docker 时需要安装 Docker Desktop,但是它提供了更友好的图形界面和更好的兼容性。而 Linux 系统则可以通过命令行更方便地进行 Docker 的安装和管理,同时也更加稳定和安全。因此,具体选择哪个系统安装 Docker,需要根据自己的需求和使用场景来决定。 ### 回答2: 在选择在Windows系统Linux系统中安装Docker时,我们需要考虑多个因素。 首先,Windows系统Linux系统的架构和设计思维不同。Windows系统是商业性操作系统,主要用于桌面应用程序,因此在安装Docker时可能会面临一些限制和兼容性问题。相比之下,Linux系统是以服务器和开发者为目标的操作系统,对于Docker的支持更加友好和成熟。 其次,Windows系统上的Docker使用了Hyper-V虚拟化技术,这可能会导致性能上的一些损失,特别是在资源消耗方面。而Linux系统上的Docker则可以直接利用宿主机的核心功能,避免了这些性能损失。 此外,Linux系统上的Docker社区活跃度更高,拥有更多的用户和开发者参与。这意味着在遇到问题时,我们可以更快地找到帮助和解决方案。 然而,在某些情况下,由于特定的需求或限制,选择在Windows系统上安装Docker可能更为合适。例如,如果我们需要在Windows操作系统中使用与Docker相关的特定工具或应用程序,那么在Windows上安装Docker将更加便利。 综上所述,根据需求和具体情况来选择在Windows系统Linux系统中安装Docker是必要的。通常情况下,由于Linux系统Docker的支持更好且性能更佳,我们更推荐在Linux系统中安装Docker。 ### 回答3: 在Windows系统Linux系统安装Docker,我们需要考虑一些因素来确定哪个更好。 首先,Windows系统是一个广泛使用的操作系统,有许多开发人员和用户熟悉。因此,在Windows系统上安装Docker可以使这些用户更容易上手并开始使用Docker。此外,Windows系统提供了一些图形用户界面(GUI)工具,可以方便地管理和监视Docker容器。 然而,Linux系统对于Docker来说也有一些显著的优势。首先,Docker最初是在Linux系统上进行开发和优化的,因此在Linux系统上的性能和稳定性可能会更好。此外,许多云计算平台和服务器都是基于Linux系统的,所以在Linux上安装Docker更符合这些环境的需求。 另一个不容忽视的因素是Docker系统资源的要求。Linux系统相对来说较轻量,因此它在运行Docker时通常需要较少的资源。与之相对,Windows系统要求更高的硬件资源,这可能会导致在较老的或资源受限的设备上运行Docker时遇到性能问题。 最后,我们还需要考虑到个人或团队的技术水平和偏好。如果你或你的团队已经熟悉了Windows系统,那么在Windows上安装Docker可能更容易。但如果你更熟悉Linux系统,或者你的项目需要在Linux环境下进行开发和测试,那么在Linux上安装Docker可能更适合。 总结起来,选择在Windows系统还是Linux系统上安装Docker取决于多个因素,包括你的操作系统偏好、技术水平、项目需求和可用资源。对于大多数情况来说,Linux系统可能更适合运行Docker,但是Windows系统也提供了一些方便的工具和界面来管理Docker容器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值