Як коментується в іншому місці, інформація надходить із системою uname
sccall, інформація якої жорстко кодується в запущеному ядрі.
Частина версії зазвичай встановлюється при компілюванні нового ядра за допомогою 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
.)