unameは実際にどこから情報を取得しますか?
私はこれが簡単な問題だと思います。残念ながら、この情報を含む本が見つかりませんでした。
uname
uname -s
誰か/のデフォルト出力を別のものに変更したいとしましょうLinux
(本質的にカーネルの名前を変更する)。
彼/彼女はどのように正しい方法で作業を行います(ソースの変更など)。
答え1
データは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);
文字列自体はinclude/generated/compile.hにあります。
#define UTS_MACHINE "x86_64"
#define UTS_VERSION "#30 SMP Fri Apr 11 00:24:23 BST 2014"
そしてinclude/generated/utsrelease.hから:
#define UTS_RELEASE "3.14.0-v2-v"
UTS_SYSNAMEはinclude/linux/uts.hで定義できます。
#ifndef UTS_SYSNAME
#define UTS_SYSNAME "Linux"
#endif
またはmakefileの#defineとして
最後に、ホスト名とドメイン名は/proc/sys/kernel/{hostname,domainname}で制御できます。 UTSによる名前は次のとおりです。
# hostname
hell
# unshare --uts /bin/bash
# echo test > /proc/sys/kernel/hostname
# hostname
test
# exit
# hostname
hell
答え2
この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カーネルなので、他のものを使う理由はありません。
しかし、オープンソースなので、ソースコードを変更してカーネルを再コンパイルして、必要なシステム名を使用できます。
答え3
誰かの助けを借りてLinuxの相互参照/proc/sys/kernel/ostype
私はあなたが言及したことにostype
従いました。/linux/sysctl.hを含む、を呼び出して名前が追加されたことをコメントアウトしますregister_sysctl_table
。
だからそれはどこですか?~から?場所があるカーネル/utsname_sysctl.c、含む/linux/uts.h が含まれます。、私たちは以下を見つけます:
/* * Defines for what uname() should return */ #ifndef UTS_SYSNAME #define UTS_SYSNAME "Linux" #endif
だからカーネル文書状態:
この値を調整する唯一の方法は、カーネルを再構築することです。
:-)
答え4
scripts/mkcompile_h
v4.19では、これは生成されたファイルであり、include/generated/compile.h
次の興味深い部分が含まれています/proc/version
。https://github.com/torvalds/linux/blob/v4.19/scripts/mkcompile_h
このセクションは、リンクが発生するたびに増加するビルドツリーのファイル
#<version>
から来ます(ファイル/構成変更が必要です)。.version
scripts/link-vmlinux.sh
KBUILD_BUILD_VERSION
環境変数としてオーバーライドできます。if [ -z "$KBUILD_BUILD_VERSION" ]; then VERSION=$(cat .version 2>/dev/null || echo 1) else VERSION=$KBUILD_BUILD_VERSION fi
日付は単に生の
date
呼び出しです。if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then TIMESTAMP=`date` else TIMESTAMP=$KBUILD_BUILD_TIMESTAMP fi
whoami
同様に、ユーザー名は()からKBUILD_BUILD_USER
来、ホスト名はhostname
(KBUILD_BUILD_HOST
)から来ます。コンパイラのバージョンは で提供され、
gcc -v
制御できないようです。
質問のコンテンツバージョンを変更する方法は次のとおりです。https://stackoverflow.com/questions/23424174/how-to-customize-or-remove-extra-linux-kernel-version-details-shown-at-boot