uname到底是从哪里得到信息的?
我想这应该是直截了当的。不幸的是,我找不到任何只包含这些信息的标题。
假设有人想将uname
/uname -s
的基本输出从Linux
更改为其他输出(实质上是重命名内核)。
他(她)如何才能以正确的方式(即改变来源)做到这一点?
发布于 2014-06-14 00:03:17
数据存储在init/version.c中:
struct uts_namespace init_uts_ns = {
.kref = {
.refcount = ATOMIC_INIT(2),
},
.name = {
.sysname = UTS_SYSNAME,
.nodename = UTS_NODENAME,
.release = UTS_RELEASE,
.version = UTS_VERSION,
.machine = UTS_MACHINE,
.domainname = UTS_DOMAINNAME,
},
.user_ns = &init_user_ns,
.proc_inum = PROC_UTS_INIT_INO,
};
EXPORT_SYMBOL_GPL(init_uts_ns);
字符串本身包含/生成/编译。h:
#define UTS_MACHINE "x86_64"
#define UTS_VERSION "#30 SMP Fri Apr 11 00:24:23 BST 2014"
在包含/生成/utsRelase.h:
#define UTS_RELEASE "3.14.0-v2-v"
UTS_SYSNAME可以在include/linux/uts.h中定义。
#ifndef UTS_SYSNAME
#define UTS_SYSNAME "Linux"
#endif
或者在makefiles中定义#
最后,主机名和域名可以由/proc/sys/ can /{ hostname、domainname}控制。这些是每个UTS命名空间:
# hostname
hell
# unshare --uts /bin/bash
# echo test > /proc/sys/kernel/hostname
# hostname
test
# exit
# hostname
hell
发布于 2014-06-13 14:10:26
uname
实用程序从uname()
系统调用中获取其信息。它填充这样的结构(请参阅man 2 uname
):
struct utsname {
char sysname[]; /* Operating system name (e.g., "Linux") */
char nodename[]; /* Name within "some implementation-defined
network" */
char release[]; /* Operating system release (e.g., "2.6.28") */
char version[]; /* Operating system version */
char machine[]; /* Hardware identifier */
#ifdef _GNU_SOURCE
char domainname[]; /* NIS or YP domain name */
#endif
};
这直接来自运行中的内核。我假设所有的信息都是硬编码的,除了domainname
(还有nodename
、machine
和release
,参见注释)。来自uname -r
的发布字符串可以在编译时通过配置来设置,但我非常怀疑sysname字段是否可以--它是Linux内核,没有任何理由可以使用其他任何东西。
但是,由于它是开源的,所以您可以更改源代码并重新编译内核,以便使用您想要的任何sysname。
发布于 2014-06-13 22:47:13
在Linux交叉引用和您提到的/proc/sys/kernel/ostype
的帮助下,我跟踪了ostype
到包含/linux/sysctl.h,其中一条评论说名字是通过调用register_sysctl_table
添加的。
那么打电话在哪里?其中一个地方是内核/用户名称_sysctl.c,其中包括包含/linux/uts.h,我们在那里发现:
/* *定义uname()应该返回的内容*/ #ifndef UTS_SYSNAME # Defines UTS_SYSNAME "Linux“#endif
因此,正如内核文档所述:
优化这些值的唯一方法是重新构建内核。
:-)
https://unix.stackexchange.com/questions/136959
复制相似问题