[cas@cas ~]$ chvt 2 Couldn't get a file descriptor referring to the console [cas@cas ~]$ ll /dev/tty2 crw------- 1 root root 4, 2 Авг 30 10:25 /dev/tty2 Очевидно, что при наличии файла устровйства, но недостаточности прав доступа к нему диагностика должна быть chvt: /dev/tty2: Permission denied или подобная.
(В ответ на комментарий №0) > [cas@cas ~]$ chvt 2 > Couldn't get a file descriptor referring to the console chvt не смогла открыть консоль о чём и написала. > Очевидно, что при наличии файла устровйства, но недостаточности прав доступа к > нему диагностика должна быть > chvt: /dev/tty2: Permission denied > или подобная. Выведенное сообщение не имеет отношения к правам.
Причину неполучения файлового дескриптора она не указала, что затрудняет диагностику. И не открыть консоль, а открыть файловый дескриптор, знания о котором избыточны для использования этой программы. > Выведенное сообщение не имеет отношения к правам. Оно - следствие недостаточности прав.
(В ответ на комментарий №2) > Причину неполучения файлового дескриптора она не указала, что затрудняет > диагностику. У тебя на машине не получилось открыть дескриптор на консоль, либо все файлы устройств или дескрипторы не являются терминалами. Это исключительная ситуация, о которой было сообщено максимально полно. > И не открыть консоль, а открыть файловый дескриптор, знания о > котором избыточны для использования этой программы. Если ваша машина сломана настолько, то такие знания необходимы. > Оно - следствие недостаточности прав. Нет. Эта проблема не имеет отношения к /dev/tty2. На нормально работающей ситеме strace выглядит так: $ ls -al /dev/tty5 crw------- 1 root root 4, 5 Сен 1 18:46 /dev/tty5 $ LANG=C strace -fF -e trace=open,ioctl chvt 5 6739 open("/etc/ld.so.cache", O_RDONLY) = 3 6739 open("/lib/libc.so.6", O_RDONLY) = 3 6739 open("/proc/self/fd/0", O_RDWR) = 3 6739 ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 6739 ioctl(3, KDGKBTYPE, 0xafdad22f) = 0 6739 ioctl(3, VIDIOC_G_COMP or VT_ACTIVATE, 0x5) = 0 6739 ioctl(3, VIDIOC_S_COMP or VT_WAITACTIVE, 0x5) = 0 и происходит переключение на tty5.
Данное поведение наблюдается только при переключении из X.org. На обычной консоли всё работает. [cas@cas ~]$ LANG=C strace -fF -e trace=open chvt 2 open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib/libc.so.6", O_RDONLY) = 3 open("/proc/self/fd/0", O_RDWR) = 3 open("/dev/tty", O_RDWR) = 3 open("/dev/tty0", O_RDWR) = -1 EACCES (Permission denied) open("/dev/tty0", O_WRONLY) = -1 EACCES (Permission denied) open("/dev/tty0", O_RDONLY) = -1 EACCES (Permission denied) open("/dev/vc/0", O_RDWR) = -1 ENOENT (No such file or directory) open("/dev/vc/0", O_WRONLY) = -1 ENOENT (No such file or directory) open("/dev/vc/0", O_RDONLY) = -1 ENOENT (No such file or directory) open("/dev/console", O_RDWR) = -1 EACCES (Permission denied) open("/dev/console", O_WRONLY) = -1 EACCES (Permission denied) open("/dev/console", O_RDONLY) = -1 EACCES (Permission denied) Couldn't get a file descriptor referring to the console [cas@cas ~]$ ls -l /dev/tty0 crw--w---- 1 root root 4, 0 Авг 30 14:25 /dev/tty0
(В ответ на комментарий №4) > Couldn't get a file descriptor referring to the console Ты где-нибудь в выводе strace видишь /dev/tty2 ? Я ещё раз говорю, chvt безразличны права на этот файл. Он не смог открыть дескриптор на консоль, хотя искал его не в одном месте. Сообщение полностью описывает ситуацию. Кстати, ты напрасно исключил отслеживание ioctl в strace. Вот вывод из urxvt в Иксах: $ l /dev/tty5 crw------- 1 root root 4, 5 Сен 1 18:46 /dev/tty5 $ LANG=C strace -fF -e trace=open,ioctl chvt 5 open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib/libc.so.6", O_RDONLY) = 3 open("/proc/self/fd/0", O_RDWR) = 3 ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B4000000 opost isig icanon echo ...}) = 0 ioctl(3, KDGKBTYPE, 0xafc0b47f) = -1 EINVAL (Invalid argument) open("/dev/tty", O_RDWR) = 3 ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B4000000 opost isig icanon echo ...}) = 0 ioctl(3, KDGKBTYPE, 0xafc0b47f) = -1 EINVAL (Invalid argument) open("/dev/tty0", O_RDWR) = 3 ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 -opost -isig -icanon -echo ...}) = 0 ioctl(3, KDGKBTYPE, 0xafc0b47f) = 0 ioctl(3, VIDIOC_G_COMP or VT_ACTIVATE, 0x5) = -1 EPERM (Operation not permitted) chvt: VT_ACTIVATE: Operation not permitted Наведи порядок у себя в системе. Пожалуйста перестань переоткрывать этот баг. Ошибки нет (по крайней в первоначальной формулировке), сообщение правильное и ничего исправлять я не планирую.
(In reply to comment #5) > Ошибки нет (по крайней в первоначальной формулировке), сообщение правильное и > ничего исправлять я не планирую. С этим я почти согласен, см. ниже. (In reply to comment #3) > У тебя на машине не получилось открыть дескриптор на консоль, либо все файлы > устройств или дескрипторы не являются терминалами. Это исключительная ситуация, > о которой было сообщено максимально полно. С этим я не согласен в том смысле, что это никакая не исключительная ситуация. Доступа к /dev/tty0 (текущая вирт.консоль) может и не быть. В случае если логин произведён не с помощью login(1), а через *dm, то и управляющий терминал (/dev/tty) не является вирт.консолью, не говоря уже о /dev/console. Возвращаясь к нашей фразе: Couldn't get a file descriptor referring to the console Тут есть одна ошибка и одна неточность: Ошибка в слове "the": поскольку утилита пытается получить дескриптор любой подходящей вирт.консоли, определённый артикль тут неуместен. Неточность в слове console: поскольку речь идет о вирт.консоли (даже при попытке использовать /dev/console), было бы точнее написать "virtual console". Итого, я предлагаю заменить "the console" на "a virtual console". :) Если хочется покороче, то можно написать так: Couldn't find a suitable virtual console
(В ответ на комментарий №6) > С этим я не согласен в том смысле, что это никакая не исключительная ситуация. Насчёт исключительности я имел ввиду следующее: порядок поиска консоли таков: /proc/self/fd/0 /dev/tty /dev/tty0 /dev/vc/0 /dev/console дескрипторы 0,1,2 если ни одного нет, то для chvt это ситуация не является рабочей :) Он даже не может перейти к стадии переключения терминала. > Доступа к /dev/tty0 (текущая вирт.консоль) может и не быть. > В случае если логин произведён не с помощью login(1), а через *dm, то и > управляющий терминал (/dev/tty) не является вирт.консолью, не говоря уже о > /dev/console. Но у самой утилиты терминал должен быть. > Тут есть одна ошибка и одна неточность: > Ошибка в слове "the": поскольку утилита пытается получить дескриптор любой > подходящей вирт.консоли, определённый артикль тут неуместен. Я думаю, что "the" потому что имеется ввиду терминал на конкретном компьютере. > Итого, я предлагаю заменить "the console" на "a virtual console". :) > Если хочется покороче, то можно написать так: > Couldn't find a suitable virtual console Всё это косметические изменения и вносить их без крайней нужды мне не хочется так как предётся править ещё и все переводы. Было бы понятно если бы сообщение было в корне неправильное или не отражало сути проблемы. Я постараюсь не забыть исправить эту фразу, когда буду вносить изменения, требующие усилий локализаторов.
(В ответ на комментарий №7) > Я постараюсь не забыть исправить эту фразу, когда буду вносить изменения, > требующие усилий локализаторов. Надеюсь на это. Баг закрываю.
(В ответ на комментарий №8) > Надеюсь на это. Баг закрываю. Я рад, что решением "неверная диагностика при недостаточности прав доступа" исправляется для _тебя_ заменой в сообщении "the console" на "a virtual console". Шикарно.
(В ответ на комментарий №9) > (В ответ на комментарий №8) > > Надеюсь на это. Баг закрываю. > > Я рад, что решением "неверная диагностика при недостаточности прав доступа" > исправляется для _тебя_ заменой в сообщении "the console" на "a virtual > console". > Шикарно. Я просто знаю, что от тебя большего не дождёшься. :)