Comme indiqué ailleurs, les informations sont fournies avec l' uname
appel système, lequel est codé en dur dans le noyau en cours d'exécution.
La partie version est normalement définie lors de la compilation d’un nouveau noyau par le Makefile :
VERSION = 3
PATCHLEVEL = 15
SUBLEVEL = 0
EXTRAVERSION =
quand j'avais le temps de jouer à la compilation de mes noyaux, j'y ajoutais des choses là-bas dans EXTRAVERSION; cela vous a donné des uname -r
choses comme 3.4.1-mytestkernel
.
Je ne comprends pas tout à fait cela, mais je pense que le reste de l’information se trouve Makefile
également dans la ligne 944:
# ---------------------------------------------------------------------------
# KERNELRELEASE can change from a few different places, meaning version.h
# needs to be updated, so this check is forced on all builds
uts_len := 64
define filechk_utsrelease.h
if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \
exit 1; \
fi; \
(echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";)
endef
define filechk_version.h
(echo \#define LINUX_VERSION_CODE $(shell \
expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \
echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
endef
$(version_h): $(srctree)/Makefile FORCE
$(call filechk,version.h)
include/generated/utsrelease.h: include/config/kernel.release FORCE
$(call filechk,utsrelease.h)
PHONY += headerdep
headerdep:
$(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \
$(srctree)/scripts/headerdep.pl -I$(srctree)/include
Pour le reste des données, l' sys_uname
appel système est généré à l'aide de macros (d'une manière assez compliquée), vous pouvez commencer à partir d' ici si vous vous sentez aventureux.
Le meilleur moyen de modifier de telles informations consiste probablement à écrire un module de noyau pour remplacer le uname
syscall. Je n'ai jamais fait cela, mais vous pouvez trouver des informations sur cette page à la section 4.2 (désolé, pas de lien direct). Notez cependant que ce code fait référence à un noyau assez ancien (maintenant le noyau Linux a des uts
espaces de noms, peu importe leur signification), vous devrez donc probablement le modifier beaucoup.
domainname
champ est défini par ladomainname
commande, à l'aide de l'setdomainname
appel système. De même, lenodename
champ est défini par lahostname
commande, à l'aide de l'sethostname
appel système. (Lanodename
/hostname
valeur peut être stockée dans/etc/nodename
.)