Как 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
.)