首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >uname是从哪里得到信息的?

uname是从哪里得到信息的?
EN

Unix & Linux用户
提问于 2014-06-13 13:56:30
回答 5查看 40.8K关注 0票数 51

uname到底是从哪里得到信息的?

我想这应该是直截了当的。不幸的是,我找不到任何只包含这些信息的标题。

假设有人想将uname/uname -s的基本输出从Linux更改为其他输出(实质上是重命名内核)。

他(她)如何才能以正确的方式(即改变来源)做到这一点?

EN

回答 5

Unix & Linux用户

发布于 2014-06-14 00:03:17

数据存储在init/version.c中:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
#define UTS_MACHINE "x86_64"
#define UTS_VERSION "#30 SMP Fri Apr 11 00:24:23 BST 2014"

在包含/生成/utsRelase.h:

代码语言:javascript
运行
复制
#define UTS_RELEASE "3.14.0-v2-v"

UTS_SYSNAME可以在include/linux/uts.h中定义。

代码语言:javascript
运行
复制
#ifndef UTS_SYSNAME
#define UTS_SYSNAME "Linux"
#endif

或者在makefiles中定义#

最后,主机名和域名可以由/proc/sys/ can /{ hostname、domainname}控制。这些是每个UTS命名空间:

代码语言:javascript
运行
复制
# hostname
hell
# unshare --uts /bin/bash
# echo test > /proc/sys/kernel/hostname 
# hostname
test
# exit
# hostname
hell
票数 32
EN

Unix & Linux用户

发布于 2014-06-13 14:10:26

uname实用程序从uname()系统调用中获取其信息。它填充这样的结构(请参阅man 2 uname):

代码语言:javascript
运行
复制
       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 (还有nodenamemachinerelease,参见注释)。来自uname -r的发布字符串可以在编译时通过配置来设置,但我非常怀疑sysname字段是否可以--它是Linux内核,没有任何理由可以使用其他任何东西。

但是,由于它是开源的,所以您可以更改源代码并重新编译内核,以便使用您想要的任何sysname。

票数 28
EN

Unix & Linux用户

发布于 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

因此,正如内核文档所述:

优化这些值的唯一方法是重新构建内核。

:-)

票数 8
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/136959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档