런타임에 직렬 시스템 콘솔 활성화

런타임에 직렬 시스템 콘솔 활성화

시스템 콘솔을 활성화하는 Linux 커널 부팅 옵션이 있습니다. console=예를 들어 console=ttyS0,115200또는console=ttyS0,115200n8 http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re01.html

이 옵션을 전달하면 Linux 커널은 모든(또는 일부) 커널 메시지를 콘솔에 인쇄하므로 디버깅에 유용합니다.

재부팅하지 않고 런타임에 Linux에서 시스템 콘솔을 변경하는 방법이 있습니까(일부 특수 sysctls/ioctls/또는 파일 시스템 사용 /proc) /sys?

첫 번째 경우: 현재 부팅에 옵션이 없었고 console=(/proc/cmdline에서 확인) 상황을 디버깅하기 위해 /dev/ttyS0 직렬 포트에 dmesg 인쇄를 활성화하고 싶습니다.

두 번째 경우: 내 설정이 잘못되어 console=ttyS0,9600재부팅하지 않고 속도를 변경하고 싶습니다(이전 콘솔 설정을 제거하거나 115200 설정이 양호한 새 콘솔을 추가하거나 속도만 변경).

( console=옵션이 구문 분석되는 위치, 현재 설정 /sys또는 /proc현재 설정이 저장되는 위치)

답변1

이것은 나에게 효과적이었습니다.

sudo agetty ttyUSB0 115200
sudo password:
ctrl+z
bg
disown

disown 터미널을 사용하지 않으면 agetty도 종료됩니다(터미널을 닫을 때 SIGHUP 신호).

다른 PC에서는 를 사용하여 로그인할 수 있습니다 screen /dev/ttyUSB0 115200. 로그인/비밀번호 프롬프트가 표시됩니다.

답변2

런타임에 완전한 실제 하드웨어 콘솔이 추가되지는 않지만 경우에 따라 더 나은 것: "netconsole"을 만나보세요. 커널 로그 수집을 위한 단방향 이더넷 네트워크의 UDP를 통한 커널 콘솔 에뮬레이션입니다. 더 이상 USB-UART 어댑터나 널 모뎀 케이블, 고가의 COM-over-Ethernet이 필요하지 않습니다."콘솔 서버"장치. 그리고 더 이상 전송하지 않습니다(클래식 커널 콘솔을 사용하여 전송을 원할 수도 있습니다).매직 SysRq, 그러나 netconsole에서는 그렇지 않음).

선적 서류 비치:https://www.kernel.org/doc/Documentation/networking/netconsole.txt

예:

Netconsole이 작동하려면 커널 구성에서 활성화(또는 모듈로 구축)되어야 합니다. (때때로 커널을 실행하기 위한 netconsole 모듈을 구축하고 재부팅 없이 Linux에 modprobe하는 것이 가능할 수도 있습니다).

Linux 명령줄(재부팅 포함)을 사용하려면 다음을 추가하세요.

netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr]

모든 것을 지정해야 합니다: 소스 UDP 포트, 소스 ipv4 주소, "eth0"과 같은 네트워크 인터페이스 이름(eth0의 이름을 위치 관련 이름으로 바꾸는 udev에서 작동합니까?), 대상 UDP 포트 및 ipv4, 형식의 대상 macaddress도 지정해야 합니다. 6바이트 00:13:32:20:r9:a5.

수신기는 입니다 nc -u -l $tgt_port.

Arch wiki의 런타임 구성 예 -https://wiki.archlinux.org/index.php/Netconsole

# set log level for kernel messages
dmesg -n 8

modprobe configfs
modprobe netconsole
mount none -t configfs /sys/kernel/config

# 'netconsole' dir is auto created if the module is loaded 
mkdir /sys/kernel/config/netconsole/target1
cd /sys/kernel/config/netconsole/target1

# set local IP address
echo 192.168.0.111 > local_ip
# set destination IP address
echo 192.168.0.17 > remote_ip
# set local network device name (find it trough ifconfig, examples: eth0, eno1, wlan0)
echo eno1 > dev_name
# find destination MAC address
arping -I $(cat dev_name) $(cat remote_ip) -f | grep -o ..:..:..:..:..:.. > remote_mac

echo 1 > enabled

관련 정보