Wie ändere ich den Ausgabemonitor für eine Textkonsole in Linux / Ubuntu 12.10?

628
Jherico

Ich arbeite mit einer nVidia-Karte und mehreren Monitoren, und der standardmäßig für den Textmodus verwendete Monitor befindet sich im Hochformatmodus. Ich zwinge mich dazu, meinen Kopf zur Seite zu bewegen, wenn ich zu einer Konsole wechsle. Wie kann ich den Standardmonitor für den Textmodus auf einen der anderen angeschlossenen Monitore umstellen? Das Umschalten der Kabel auf der Karte ist keine Option.

2

1 Antwort auf die Frage

0
Ben Stern

Sie können einen bestimmten VT mit einem anderen Kopf verschieben con2fb( Quellcode, auch im ersten Link und auch unten, falls diese Links verdampfen). Dann verschieben Sie con2fb /dev/fb1 /dev/tty2TTY2 in den zweiten Framebuffer.

Der mögliche Nachteil dabei ist, dass der alte Monitor (in diesem Fall Ihr Porträtmonitor) keine Eingaben mehr akzeptiert. Ich bin mir jedoch nicht sicher, wie man den Fokus zwischen den Terminals verlagern kann, ohne etwas wie Alt+ F1 oder Ctrl+ Alt+ zu verwenden F1, daher ist dies ein ziemlich kleiner Nachteil.

Siehe auch: LinuxQuestions und LWN, die trotz ihres Alters auch versuchen, diese Frage zu beantworten (auch hier, falls der erste Link wegfällt ). Der LWN-Beitrag droht drohende Warnungen, wenn Sie versuchen, X danach auszuführen. Es wird jedoch auch erläutert, dass sich die verschiedenen Framebuffer-Patches noch nicht im Kernel befinden und daher etwas veraltet sind.

con2fb.c:

/* This is a userspace utility which allows you to redirect the console to another framebuffer device. You can specify devices & consoles by both numbers and devices. Framebuffers numbers are zero-based (/dev/fb0, ...), while consoles are one-based (/dev/tty1, ...).  Original source: https://www.dafyddcrosby.com/dual-framebuffers/  Slightly updated from the original by Ben Stern to fix some minor warnings. License: GPL v2. Compile with: gcc -O2 -Wall -Werror -o con2fb con2fb.c */  #include <errno.h> #include <linux/fb.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>  int main(int argc, char* argv[]) { struct fb_con2fbmap c2m; char* fbPath; u_int32_t con, fb; char* e; char* progname; struct stat sbf; int rv = 0; int f = -1;  progname = strrchr(argv[0], '/');  if (progname != NULL) { progname++; } else { progname = argv[0]; } if (argc < 3) { fprintf(stderr, "usage: %s fbdev console\n", progname); return ENOENT; }  do { fb = strtoul(argv[1], &e, 10); if (*e) { if (stat(argv[1], &sbf) < 0) {  rv = errno; fprintf(stderr, "%s: Can't stat %s: %s\n", progname, argv[1], strerror(errno)); break; }  if (!S_ISCHR(sbf.st_mode)) { fprintf(stderr, "%s: %s isn't a character device!\n", progname, argv[1]); rv = EINVAL; break; }  fb = sbf.st_rdev & 0xFF; if (fb >= 32) { fb >>= 5; } fbPath = argv[1]; } else { fbPath = "/dev/fb0"; }  con = strtoul(argv[2], &e, 10); if (*e) { if (stat(argv[2], &sbf) < 0) { rv = errno; fprintf(stderr, "%s: Can't stat %s: %s\n", progname, argv[2], strerror(errno)); break; } if (!S_ISCHR(sbf.st_mode)) { fprintf(stderr, "%s: %s isn't a character device!\n", progname, argv[2]); rv = EINVAL; break; } con = sbf.st_rdev & 0xFF; }  c2m.console = con; c2m.framebuffer = fb; f = open(fbPath, O_RDWR); if (f < 0) { rv = errno; fprintf(stderr, "%s: Can't open %s: %s\n", progname, fbPath, strerror(errno)); break; }  if (ioctl(f, FBIOPUT_CON2FBMAP, &c2m)) { rv = errno; fprintf(stderr, "%s: Can't set console mapping: %s\n", progname, strerror(errno)); break; } } while (0);  if (f >= 0) { close(f); } return rv; }