Belirli bir VT’yi başka bir kafaya con2fb
( kaynak kodu , ayrıca ilk linkte ve ayrıca bu linklerin buharlaşması durumunda da ayrıca). O zaman kullan con2fb /dev/fb1 /dev/tty2
TTY2’yi ikinci çerçeveye taşımak için
Bunun olası dezavantajı, eski monitörün (bu durumda portre monitörünüz) artık girişi kabul etmemesidir. Birinin odağı terminaller arasında nasıl değiştireceğini bilemedim.
gibi bir şey kullanmadan Alt + F1 veya Ctrl + Alt + F1 ,
bu yüzden bu oldukça küçük bir dezavantaj.
Ayrıca bakınız: LinuxQuestions ve LWN Ayrıca, yaşlarına rağmen, bu soruyu yanıtlama girişimleri de var (ilk bağlantı geçmesi durumunda da burada). Bunu yaptıktan sonra X'i çalıştırmayı denerseniz, LWN postu korkunç uyarıları tehdit eder, ancak aynı zamanda çoklu framebuffer yamalarının henüz çekirdekte olmadıklarını ve bu nedenle biraz güncel olmadığını da tartışır.
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;
}