uname
Утилита получает информацию от uname()
системного вызова. Это заполняет структуру как это (см. man 2 uname
):
struct utsname {
char sysname[]; /* Operating system name (e.g., "Linux") */
char nodename[]; /* Name within "some implementation-defined
network" */
char release[]; /* Operating system release (e.g., "2.6.28") */
char version[]; /* Operating system version */
char machine[]; /* Hardware identifier */
#ifdef _GNU_SOURCE
char domainname[]; /* NIS or YP domain name */
#endif
};
Это происходит прямо из запущенного ядра. Я бы предположил , вся информация жестко закодированы в нем, за исключением , может быть domainname
(и , как выясняется, также nodename
, machine
и release
смотрите комментарии). Строка релиза from uname -r
может быть установлена через конфигурацию во время компиляции, но я очень сомневаюсь, что поле sysname может - это ядро Linux, и для него нет никакой разумной причины использовать что-либо еще.
Однако, поскольку это открытый исходный код, вы можете изменить исходный код и перекомпилировать ядро, чтобы использовать любое имя, которое вы хотите.
лютик золотистый
источник
domainname
Поле задаетсяdomainname
командой, с помощьюsetdomainname
системного вызова. Аналогично,nodename
поле задаетсяhostname
командой, используяsethostname
системный вызов. (Значениеnodename
/hostname
может храниться в/etc/nodename
.)uname
команда получает информацию из системного вызова. И откуда системный вызов получает информацию? (Ответ, предоставленный другими авторами здесь: он жестко запрограммирован в ядре во время компиляции.)machine
когда-нибудь измениться? Он не может быть жестко закодирован в ядре, потому что он может адаптироваться к аппаратному обеспечению, но, несомненно, тогда он будет установлен во время загрузки и не изменится после этого. Но нет: его можно установить для каждого процесса (например, для отчетаi686
в 32-битной обработке на x86_64). Кстати,release
также может быть настроен для процесса в некоторой степени (попробуйтеsetarch i686 --uname-2.6 uname -a
).machine
,nodename
иrelease
в вопросе со ссылкой на комментарии. Опять же, вопрос был не о всех этих областях.Данные хранятся в init / version.c:
Сами строки находятся в include / generate / compile.h:
и в include / генерируется / utsrelease.h:
UTS_SYSNAME может быть определен в include / linux / uts.h
или как #define в make-файлах
Наконец, имя хоста и имя домена могут контролироваться / proc / sys / kernel / {имя хоста, имя домена}. Это для пространства имен UTS:
источник
unshare
. Как-то мне удалось пропустить эту команду до сегодняшнего дня. Благодарность!include/generated/compile.h
генерируетсяscripts/mkcompile_h
: unix.stackexchange.com/a/485962/32558С помощью Cross Reference Linux и ваше упоминание
/proc/sys/kernel/ostype
, я разыскал ,ostype
чтобы включать / Linux / sysctl.h , где комментарий говорит , что имена добавляются по телефонуregister_sysctl_table
.Так откуда это называется ? Одним из мест является kernel / utsname_sysctl.c , который включает в себя include / linux / uts.h , где мы находим:
Итак, как сказано в документации ядра :
:-)
источник
Как
uname
отмечалось в другом месте, информация поступает с системным вызовом, который жестко запрограммирован в работающем ядре.Часть версии обычно устанавливается при компиляции нового ядра с помощью Makefile :
когда у меня было время поиграть с компиляцией своих ядер, я обычно добавлял туда вещи в EXTRAVERSION; который дал вам
uname -r
такие вещи, как3.4.1-mytestkernel
.Я не полностью понимаю это, но я думаю, что остальная информация настроена
Makefile
также в строке 944:Для остальных данных
sys_uname
системный вызов генерируется с помощью макросов (довольно запутанным образом), вы можете начать отсюда, если вы чувствуете себя авантюрным.Вероятно, лучший способ изменить такую информацию - написать модуль ядра для переопределения
uname
системного вызова; Я никогда этого не делал, но вы можете найти информацию на этой странице в разделе 4.2 (извините, прямой ссылки нет). Однако обратите внимание, что этот код ссылается на довольно старое ядро (теперь ядро Linux имеетuts
пространства имен, что бы они ни значили), поэтому вам, вероятно, придется его сильно изменить.источник
Хотя я не смог найти ничего в источнике, чтобы указать на это, я считаю, что он использует системный вызов uname.
man 2 uname
должен рассказать вам больше об этом. Если это так, то получение информации напрямую из ядра и ее изменение, вероятно, потребует перекомпиляции.
Вы можете изменить двоичный файл так, чтобы он не создавался так, как вам хочется, просто напишите поверх него, пожалуйста, с помощью программы. Недостатком является то, что некоторые скрипты полагаются на этот вывод.
источник
strace uname
, он подтвердит, чтоuname
системный вызов используется.Правильный способ изменить uname - изменить заголовки компиляции и перекомпилировать, как предлагали другие. Но я не уверен, почему вы захотите пережить столько неприятностей, когда вы можете сделать что-то вроде,
или даже
источник
Ответ от Rmano дал мне частичку, но настоящую магию легче обнаружить, передав
Q=
опцию вmake
командной строке в директорию с исходным кодом ядра. она позволяет увидеть детали, один из которых является вызов скрипта:echo "4.4.19$(/bin/sh ./scripts/setlocalversion .)"
. выполнение того же фрагмента дает номер версии ядра4.4.19-00010-ge5dddbf
. если вы посмотрите на сценарий, он определяет число из системы управления версиями, и его запускbash -x
показывает точный процесс:Это показывает, что, если я хочу собрать модуль ядра для работы с моим работающим ядром, я получаю неправильную версию с тегами и неверный коммит. Мне нужно это исправить и собрать как минимум DTB (
make dtbs
), чтобы создать сгенерированные файлы с правильным номером версии.Оказывается, даже этого было недостаточно. Мне пришлось заменить
scripts/setlocalversion
на тот, который просто делает:затем пересоберите автоматически сгенерированные файлы:
тогда я мог собрать пример драйвера Дерека Моллоя и смог
insmod
успешно. по-видимому, предупреждение обModule.symvers
отсутствии присутствия не имело значения. все, что Linux использовал, чтобы определить, будет ли работать модуль, это строка localversion.источник
scripts/mkcompile_h
В версии 4.19 это файл, который генерирует
include/generated/compile.h
и содержит несколько интересных частей/proc/version
: https://github.com/torvalds/linux/blob/v4.19/scripts/mkcompile_h#<version>
часть приходит из.version
файла на дереве сборки, который получает приращение всякий раз , когда происходит ссылка (требуется файл / конфиг изменения) отscripts/link-vmlinux.sh
.Может быть переопределено
KBUILD_BUILD_VERSION
переменной среды:дата - это просто необработанный
date
звонок:и аналогично имя пользователя происходит из
whoami
(KBUILD_BUILD_USER
) и имя хоста изhostname
(KBUILD_BUILD_HOST
)Версия компилятора взята
gcc -v
, и, кажется, ее нельзя контролировать.Вот как изменить версию этого вопроса: https://stackoverflow.com/questions/23424174/how-to-customize-or-remove-extra-linux-kernel-version-details-shown-at-boot
источник