Почему именно uname -m сообщает о неверной архитектуре при запуске от Sun Grid Engine (SGE)?
У меня есть 64-битные системы Debian Squeeze, на которых установлена более старая 32-битная версия SGE execd. Когда я бегу uname -m
в командной строке я получаю то, что ожидаю: x86_64
, Но когда я бегу uname -m
внутри сценария SGE на том же хосте вывод i686
, Это нарушает все, что зависит от правильного прочтения uname -m
,
Я могу обойти эту проблему, поэтому мой вопрос скорее академический, чем практический. Я загрузил исходный код uname, но не смог найти, откуда он берет данные об архитектуре машины. Я предполагаю, что эта проблема возникает потому, что uname -m
запускается 32-битным родительским процессом вместо 64-битного родительского процесса. Итак, мой вопрос - верно ли это предположение, и если да, то почему на uname влияет архитектура процесса, который его выполняет?
1 ответ
uname -m
используется для сообщения personality(2)
"виртуальной машины", выполняющей код. Поскольку ядро может запускать код с разными личностями (скажем, 32-разрядный код на 64-разрядной машине, дополненный "только" 32-разрядным адресным пространством или короткими inode, различными номерами сигналов или аналогичными ограничениями), программы могут использовать вывод uname -m
определить, как они должны работать - то есть, какие интерфейсы ядра они получат во время выполнения.
Поэтому важно, чтобы uname -m
отражать личность, а не весь объем оборудования.
Возможно, вы можете вставить вызов setarch(8)
или же personality(2)
в ваше программное обеспечение до fork(2)
exec()
вашей uname -m
командные и последующие вспомогательные программы.