Дальнейшее изучение источника дало ответ. Как обычно, это связано с тем, что Debian поставляет старые версии основных компонентов.
if (lsflag)
{
int i, fo, oth;
#ifdef MULTIUSER
if (multi)
real_uid = multi_uid;
#endif
SET_GUID();
i = FindSocket((int *)NULL, &fo, &oth, SockMatch);
if (quietflag) {
if (rflag)
exit(10 + i);
else
exit(9 + (fo || oth ? 1 : 0) + fo);
}
if (fo == 0)
Panic(0, "No Sockets found in %s.\n", SockPath);
Panic(0, "%d Socket%s in %s.\n", fo, fo > 1 ? "s" : "", SockPath);
/* NOTREACHED */
}
Где Паника это следующее
void Panic (int err, const char *fmt, VA_DOTS)
{
char buf[MAXPATHLEN*2];
PROCESS_MESSAGE(buf);
debug3("Panic('%s'); display=%x displays=%x\n", buf, display, displays);
if (displays == 0 && display == 0)
{
printf("%s\r\n", buf);
if (PanicPid)
Kill(PanicPid, SIG_BYE);
}
else if (displays == 0)
{
/* no displays but a display - must have forked.
* send message to backend!
*/
char *tty = D_usertty;
display = 0;
SendErrorMsg(tty, buf);
sleep(2);
_exit(1);
}
else
for (display = displays; display; display = display->d_next)
{
if (D_status)
RemoveStatus();
FinitTerm();
Flush(3);
#ifdef UTMPOK
RestoreLoginSlot();
#endif
SetTTY(D_userfd, &D_OldMode);
fcntl(D_userfd, F_SETFL, 0);
write(D_userfd, buf, strlen(buf));
write(D_userfd, "\n", 1);
freetty();
if (D_userpid)
Kill(D_userpid, SIG_BYE);
}
#ifdef MULTIUSER
if (tty_oldmode >= 0)
{
# ifdef USE_SETEUID
if (setuid(own_uid))
xseteuid(own_uid); /* may be a loop. sigh. */
# else
setuid(own_uid);
# endif
debug1("Panic: changing back modes from %s\n", attach_tty);
chmod(attach_tty, tty_oldmode);
}
#endif
eexit(1);
}
Что касается того, почему Panic()
не возвращает код ошибки, переданный ему через элемент err
, ваше предположение так же хорошо, как и мое. Похоже, аргумент -Q
также не работает, несмотря на то, что он присутствует.
По сути, версия apt
не работает.
Первые ПК имели максимум 4 последовательных порта на базе чипа 8250 UART. Преодолеть этот предел было возможно, но обычно требовались либо другие аппаратные реализации, либо, по крайней мере, специальные драйверы, чтобы включить большее количество портов. Современный 16550A может быть обратно совместим со старыми чипами 8250 как на уровне программирования , так и на физическом уровне .
(В конце 1980-х — начале 1990-х при переходе на более новуюболее быстрый набор -модема с более старым/более дешевым компьютером, возможно, было необходимо вытащить фактические чипы 8250 из их сокетов и заменить их на 16550A, чтобы добиться постоянной ошибки -бесплатных загрузок.)
При быстром поиске в Google ST16650V2 выглядит как версия, модернизированная для совместимости с шиной PCI (e ), но она по-прежнему максимально совместима со старыми программными интерфейсами.
Ядро Linux имеет параметр времени компиляции -«Количество последовательных портов 8250/16550 для регистрации во время выполнения» (CONFIG_SERIAL_8250_RUNTIME_UARTS
), для которого по умолчанию установлено значение 4. Debian 10 не изменил это значение по умолчанию в своих стандартных пакетах ядра.
Но это значение может быть переопределено параметром загрузки ядра8250.nr_uarts
(или, может быть, просто nr_uarts
для старых версий ядра, хотя я думаю, что это слишком старо, чтобы применять его к Debian 10 ).
Поскольку у вас всего 5 портов, которые обрабатываются драйвером последовательного порта, совместимым с 8250 -, вам следует добавить 8250.nr_uarts=5
в конец строки GRUB_CMDLINE_LINUX_DEFAULT=
в /etc/default/grub
. Результирующая строка конфигурации может выглядеть так:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash 8250.nr_uarts=5"
После внесения изменений вы должны запустить update-grub
от имени пользователя root, чтобы изменения вступили в силу в GRUB. После перезагрузки ваша система сможет использовать все 5 последовательных портов, совместимых с 8250 -.