에코 안녕하세요 > /dev/console

에코 안녕하세요 > /dev/console

[배경 : 읽은 후Linux: /dev/console, /dev/tty 및 /dev/tty0의 차이점, 나는 내 이해를 확인하기 위해 몇 가지 테스트를 고안했습니다. 결과적으로 나는 /dev/console에 대한 나의 이해가 존재하지 않는다는 것을 알게 되었습니다 :). 여기서 제기된 요점 중 일부는 아마도 위 질문에 대한 의견으로 추가되어야 할 것입니다.]

저는 아치 리눅스를 실행 중이고 시작 시 "console=" 커널 매개변수가 없습니다. dmesg의 출력에는 부팅 중에 작성된 다음 세 줄이 포함됩니다.

[    0.183964] printk: console [tty0] enabled
...
[    4.908815] fbcon: Deferring console take-over
...
[    5.217652] fbcon: Taking over console

질문 1: 위의 QA 주장에 연결했습니다.

/dev/console은 기본적으로 /dev/tty0을 가리키는 가상 장치 세트입니다.

"point to"은(는) 실제로 무엇을 의미하나요? "링크하다"와 같은 뜻인가요? 그렇다면 하드링크인가, 소프트링크인가?


이제 내 시스템에서 X를 시작합니다. 나는 openbox를 사용하고 있으며 평소와 같이 첫 번째 가상 콘솔에 데스크탑이 나타납니다. (즉, Alt-Ctl-F2를 누르면 새로운 로그인 터미널이 생기고, Alt-Ctl-F1을 누르면 gui-desktopi로 돌아갑니다.) 데스크탑에서 열린 첫 번째 xterm에 다음을 입력하면 다음을 얻습니다.

crw------- 1 root root 5,  1 Nov 30 01:07 /dev/console
crw-rw-rw- 1 root tty  5,  0 Nov 29 23:23 /dev/tty
crw--w---- 1 root tty  4,  0 Nov 30 01:07 /dev/tty0
crw-rw---- 1 root uucp 4, 64 Nov 29 23:15 /dev/ttyS0
[root@scott-dell7577 ~]# tty
/dev/pts/0

따라서 이 경우 /dev/console은 아무 것도 가리키지 않는 것 같습니다.

질문 2: "fbcon이 콘솔을 차지했기 때문에" /dev/console이 더 이상 /dev/tty0을 가리키지 않습니까? /dev/console이 다른 "기본" 원시 장치를 가리키나요?


이제 진짜 문제가 생겼습니다. /dev/console의 출력을 볼 수 없습니다. 과거에는 X의 그래픽 인터페이스가 터미널 7에 있었고 Alt-Ctl-F1을 선택하면 /dev/console의 출력을 볼 수 있었습니다. 하지만 이제 GUI 자체는 터미널 1에 있으며 콘솔 문자 테이블을 보기 위해 데스크탑 아래를 "살펴보는" 방법을 알 수 없습니다. /dev/console을 보기 위해 제가 생각할 수 있는 유일한 두 가지 방법은 1. Alt-Ctrl-Backspace를 통해 X를 종료하거나 2. netconsole을 사용하여 원격 시스템에서 콘솔 출력을 보는 것입니다.

질문 3: X를 종료하면 X가 실행되는 동안 콘솔에 기록된 모든 메시지를 보게 될 것이라고 생각하는 것이 맞습니까? GUI를 표시하는 기본 터미널을 "찾아서" 콘솔 출력을 볼 수 있는 방법이 있습니까? 아니면 GUI가 첫 번째 가상 터미널 대신 두 번째 가상 터미널에 표시되도록 startx 스크립트를 수정할 수 있습니까? 이 획기적인 변경이 구현된 이유가 있습니까(현재 콘솔을 다루는 첫 번째 VT로 GUI 이동)? 콘솔 출력을 거의 볼 수 없다는 점에서 꽤 큰 단점이 있는 것 같은데, 어떤 이점을 가져오는지 알고 싶습니다.


이제 상황이 정말 이상해졌습니다. 루트만 /dev/console에 쓸 수 있다는 것을 알고 있습니다. 위에 언급된 QA에 따라 데스크탑의 루트가 아닌 xterm에 다음을 입력했습니다. 마지막 명령에 대한 응답을 설명해 주시겠습니까?

[scott@scott-dell7577 ~]$ echo hello >/dev/console
bash: /dev/console: Permission denied
[scott@scott-dell7577 ~]$ su 
Password: 
[root@scott-dell7577 scott]#  echo hello >/dev/console
[root@scott-dell7577 scott]# exit
exit
[scott@scott-dell7577 ~]$ sudo echo hello  > /dev/console
bash: /dev/console: Permission denied

일반 사용자로서 콘솔에 쓰려고 하면 권한이 거부되었습니다. 루트로 고소했는데 지금은 오류가 없습니다. (물론 출력도 에코되지 않습니다. 이는 위에서 말했듯이 콘솔 출력이 GUI 아래에 "숨겨져" 있기 때문이라고 생각합니다.) 그런 다음 루트를 종료하고 sudo를 통해 동일한 명령을 실행했습니다. 뭐하세요?

질문 5: 루트로 명령을 실행하는 것과 sudo를 통해 명령을 실행하는 것의 차이점은 무엇입니까? 하나는 허용하고 다른 하나는 허용하지 않아야 합니까?


마지막 연습으로 지침에 따라 네트워크 콘솔 시설을 설정했습니다.여기. 모든 것이 연결된 것처럼 보이며 모든 진단/자세한 출력은 콘솔이 실제로 리디렉션되고 있음을 나타냅니다. 하지만 명령을 입력하면

에코 안녕하세요 > /dev/console

로컬 컴퓨터에는 오류가 없습니다. 그러나 "안녕하세요"도 없었습니다. /dev/console에 대한 쓰기가 파이프의 원격 끝에 나타나지 않게 하는 간단한 버퍼링 문제가 있습니까?

말이 길어져서 미안하지만 현실이 내 기대와 너무 일치하지 않아 답답했습니다. 물론 가장 큰 문제 두 가지는 1. 루트가 실행할 수 있는 명령이 있는데 sudo로 실행하면 "Permission Denied"를 반환합니다. 2. /dev에 X를 표시하는 새로운 기본값을 사용하는 것은 불가능해 보입니다. /ttyS0 /dev/console에 출력합니다.

다섯 가지 질문에 대한 정답을 알려주셔서 감사합니다!

답변1

~어디 갔어 echo hello >/dev/console?

다음으로 이동합니다.

  1. /dev/tty0(활성 가상 터미널: 마지막으로 전환된 터미널 등 /dev/tty1/dev/tty2GUI 뒤에 숨겨질 수 있습니다.)
  2. console=ttyXXX마지막 커널 부팅 명령줄 인수로 지정된 직렬 또는 가상 터미널입니다.
  3. 다른 tty는 /dev/console나중에 으로 리디렉션됩니다 ioctl(fd, TIOCCONS). 이 리디렉션은 사용자 모드 출력에만 영향을 미칩니다 /dev/console(커널 메시지는아니요리디렉션됩니다). 또한 더 흥미롭게 만들기 위해 리디렉션되는 위치를 확인할 방법이 전혀 없습니다 ;-)

그럼에도 불구하고 콘텐츠를 에코한다고 해서 /dev/console커널 메시지가 되어 dmesg에 표시되는 것은 아닙니다(그리고 netconsole커널 메시지가 다른 도구를 통해 리디렉션되는 모든 곳).

[ /dev/console]는 기본값을 가리킵니다 /dev/tty0.

"point to"은(는) 실제로 무엇을 의미하나요? "링크하다"와 같은 뜻인가요? 그렇다면 하드링크인가, 소프트링크인가?

아니요, /dev/console별도의 문자 장치입니다(예: /dev/tty=>제어 터미널 또는 /dev/tty0=>활성 가상 터미널). 모든 마법은 커널에서 발생합니다. 실제 엔드포인트 /dev/console(위의 3번에서 리디렉션된 엔드포인트 대신)를 얻으려면 ioctl 을 사용할 수 있습니다 TIOCGDEV.같지 않은/dev/tty는 pseudo-tty를 참조할 수 없기 /dev/console때문에 와 함께 안정적으로 사용할 수 있습니다 ./dev/console

GUI를 표시하는 기본 터미널을 "보고" 콘솔 출력을 볼 수 있는 방법이 있습니까?

가지다/dev/vcs*, 그러나 GUI 뒤에서 새 데이터가 스크롤되는 대신 마지막 행을 계속 덮어쓰면 vts가 올바르게 업데이트되지 않습니다.

# perl -0777 -CO -e '
   $c = unpack 'xC', <>; close ARGV;
   $t = join "", map chr $_, unpack "L*", <>;
   s/(.{$c})/$1\n/g, s/ +$//mg, s/\n+$/\n/ for $t;
   print $t
' /dev/vcs{a,u}
...
content of the active vt
...

관련 정보