Jak skomentowano w innym miejscu, informacje pochodzą z uname
syscall, który jest zakodowany na stałe w uruchomionym jądrze.
Część wersji jest zwykle ustawiana podczas kompilacji nowego jądra przez Makefile :
VERSION = 3
PATCHLEVEL = 15
SUBLEVEL = 0
EXTRAVERSION =
kiedy miałem czas na zabawę w kompilowanie jądra, dodawałem tam rzeczy w EXTRAVERSION; które dały ci uname -r
takie rzeczy jak 3.4.1-mytestkernel
.
Nie do końca to rozumiem, ale myślę, że reszta informacji znajduje się Makefile
również w wierszu 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
W przypadku pozostałych danych sys_uname
syscall jest generowany za pomocą makr (w dość skomplikowany sposób), możesz zacząć od tego miejsca, jeśli czujesz się ryzykowny.
Prawdopodobnie najlepszym sposobem na zmianę takich informacji jest napisanie modułu jądra, aby zastąpić uname
syscall; Nigdy tego nie zrobiłem, ale informacje można znaleźć na tej stronie w punkcie 4.2 (przepraszam, brak bezpośredniego linku). Zauważ jednak, że ten kod odnosi się do dość starego jądra (teraz jądro Linuksa ma uts
przestrzenie nazw, cokolwiek mają na myśli), więc prawdopodobnie będziesz musiał je zmienić.
domainname
Pole jest ustawione przezdomainname
polecenia, za pomocąsetdomainname
wywołania systemowego. Podobnienodename
pole jest ustawiane przezhostname
polecenie za pomocąsethostname
wywołania systemowego. (Wartośćnodename
/hostname
może być przechowywana w/etc/nodename
.)