나는 직렬 콘솔을 사용하는 독점적인 init 시스템을 갖춘 독점적인 Linux 시스템을 가지고 있습니다. 나는 최근 이 직렬 콘솔에서 xon/xoff 흐름 제어가 활성화되어 xon 문자(0x13)가 라인 노이즈로 인해 수신될 때 시작 프로세스가 정지될 위험이 있다는 것을 발견했습니다. 직렬 콘솔(systemd 기반)이 있는 다른 시스템을 살펴보면 직렬 콘솔의 흐름 제어가 비활성화되어 있는 것을 볼 수 있으며 이는 정상적인 것처럼 보입니다.
문제는 콘솔 tty의 흐름 제어 비활성화를 담당하는 시스템 부분이 무엇입니까? 이는 init 프로세스에 의해 수행됩니까, 아니면 커널 자체에 의해 수행됩니까? 즉, 이것은 커널 구성의 버그입니까, 아니면 흐름 제어를 비활성화하려면 init 시스템을 수정해야 합니까?
tcsetattr()
함수를 사용하거나 실행하여 흐름 제어를 비활성화할 수 있다는 것을 알고 있지만 stty -ixon -F /dev/console
안정적인 시스템의 경우 프로세스가 콘솔에 출력을 쓰기 전에 비활성화해야 합니다. 시스템 소스 코드를 살펴봤지만 흐름 제어를 비활성화하는 코드를 찾을 수 없습니다.
답변1
나는 귀하의 독점 Linux 시스템이나 독점 init 시스템에 대해 아무것도 모른다는 점을 인정합니다.
최근에 이 직렬 콘솔에서 xon/xoff 흐름 제어가 활성화되어 라인 노이즈로 인해 xon 문자(0x13)가 수신될 때 시작 프로세스가 중단될 위험이 있음을 확인했습니다.
부팅 단계(init 전)에 관한 한 이는 어떤 기본 Linux에서도 가능하지 않습니다. 그 이유는 간단합니다. 커널은 구성에 관계없이 시작 시 소프트웨어 흐름 제어를 처리하지 않습니다.
부팅 시 커널은 하드웨어 흐름 제어(RTS/CTS)를 처리할 수 있지만 다음 명령을 통해 특별히 지시된 경우에만 가능합니다.console
명령줄 매개변수 시작왜냐하면 디폴트가 되지 않기 때문입니다.
부팅 로그에는 부팅 명령줄에 콘솔에 대한 특수 설정이 포함되어 있는지 여부가 표시됩니다. 설정에 최종 항목이 포함된 경우아르 자형(위 링크 참조) 귀하의 회선은 가짜 RTS/CTS를 생성할 만큼 잡음이 많습니다. 그런 다음 제거하십시오.아르 자형설정에서.
getty
init가 무엇이든 간에 포트를 열고 필요한 회선 규칙을 설정하는 일부(또는 agetty, mgetty...) 프로세스의 책임을 떠날 때까지 이러한 설정을 계속해서 행복하게 수행할 것입니다 .
모든 표준 Linux 배포판에서 이 프로세스는 다음과 같습니다.아지티이는 기본적으로 하드웨어 흐름 제어를 무시하고 다른 유사한 프로세스와 달리 소프트웨어 흐름 제어(XON/XOFF)를 활성화하여 부적절하다고 판단되면 이를 비활성화하는 책임을 후속 프로세스에 맡깁니다.
따라서 먼저 로그인하지 않은 tty를 처리하는 프로세스를 이해해야 합니다. 몇 가지 명령을 실행 ps -ax
하고 다음과 같은 줄을 찾으세요(현재 내 시스템에서와 같습니다).
1515 tty2 Ss+ 0:00 /sbin/agetty 38400 tty2 linux
위에서 설명한 대로 실행 중인 경우 위에서 언급한 대로 익숙한 명령을 agetty
사용해야 합니다 (나중에 시작된 /usr/bin/login 프로세스는 어떤 줄 규칙도 변경할 수 없기 때문입니다). 프로세스가 보고하는 것과 다를 경우 소프트웨어 제어 흐름을 비활성화하는 옵션이 있을 수 있습니다.stty
agetty
물론 시끄러운 환경에서 직렬 회선을 사용하는 것은 악몽의 일부일 뿐이며 가짜 XOFF는 매우 작은 부분입니다.
회선에 잡음이 있으면 전송 속도를 낮추십시오.
RS232/RS485 변환기를 설치하여 생명을 구했습니다... ;-)