Как unameотмечалось в другом месте, информация поступает с системным вызовом, который жестко запрограммирован в работающем ядре.
Часть версии обычно устанавливается при компиляции нового ядра с помощью Makefile :
VERSION = 3
PATCHLEVEL = 15
SUBLEVEL = 0
EXTRAVERSION =
когда у меня было время поиграть с компиляцией своих ядер, я обычно добавлял туда вещи в EXTRAVERSION; который дал вам uname -r такие вещи, как 3.4.1-mytestkernel.
Я не полностью понимаю это, но я думаю, что остальная информация настроена Makefileтакже в строке 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
Для остальных данных sys_unameсистемный вызов генерируется с помощью макросов (довольно запутанным образом), вы можете начать отсюда, если вы чувствуете себя авантюрным.
Вероятно, лучший способ изменить такую информацию - написать модуль ядра для переопределения unameсистемного вызова; Я никогда этого не делал, но вы можете найти информацию на этой странице в разделе 4.2 (извините, прямой ссылки нет). Однако обратите внимание, что этот код ссылается на довольно старое ядро (теперь ядро Linux имеет utsпространства имен, что бы они ни значили), поэтому вам, вероятно, придется его сильно изменить.
domainnameПоле задаетсяdomainnameкомандой, с помощьюsetdomainnameсистемного вызова. Аналогично,nodenameполе задаетсяhostnameкомандой, используяsethostnameсистемный вызов. (Значениеnodename/hostnameможет храниться в/etc/nodename.)