Вот мой обновленный 6-экранный Xorg.conf (без Xinerama):
# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings: version 340.46 (pbuilder@zam904) Fri Oct 17 21:29:34 UTC 2014
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" RightOf "Screen0"
Screen 2 "Screen2" 0 1080
Screen 3 "Screen3" RightOf "Screen2"
Screen 4 "Screen4" RightOf "Screen3"
Screen 5 "Screen5" RightOf "Screen4"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
Option "Xinerama" "0"
EndSection
Section "Files"
EndSection
Section "InputDevice"
# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection
Section "Monitor"
# HorizSync source: edid, VertRefresh source: edid
Identifier "Monitor0"
VendorName "Unknown"
ModelName "VIZ E601i-A3E"
HorizSync 31.0 - 70.0
VertRefresh 50.0 - 77.0
Option "DPMS"
Option "DPI" "96x96"
EndSection
Section "Monitor"
# HorizSync source: edid, VertRefresh source: edid
Identifier "Monitor1"
VendorName "Unknown"
ModelName "VIZ E601i-A3E"
HorizSync 31.0 - 70.0
VertRefresh 50.0 - 77.0
Option "DPMS"
Option "DPI" "96x96"
EndSection
Section "Monitor"
# HorizSync source: edid, VertRefresh source: edid
Identifier "Monitor2"
VendorName "Unknown"
ModelName "DELL 1908FP"
HorizSync 31.0 - 83.0
VertRefresh 56.0 - 76.0
Option "DPMS"
EndSection
Section "Monitor"
# HorizSync source: edid, VertRefresh source: edid
Identifier "Monitor3"
VendorName "Unknown"
ModelName "DELL 1905FP"
HorizSync 30.0 - 81.0
VertRefresh 56.0 - 76.0
Option "DPMS"
EndSection
Section "Monitor"
# HorizSync source: edid, VertRefresh source: edid
Identifier "Monitor4"
VendorName "Unknown"
ModelName "DELL 1905FP"
HorizSync 30.0 - 81.0
VertRefresh 56.0 - 76.0
Option "DPMS"
EndSection
Section "Monitor"
# HorizSync source: edid, VertRefresh source: edid
Identifier "Monitor5"
VendorName "Unknown"
ModelName "DELL 1907FPV"
HorizSync 30.0 - 81.0
VertRefresh 56.0 - 76.0
Option "DPMS"
EndSection
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 275"
BusID "PCI:1:0:0"
Screen 0
EndSection
Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 275"
BusID "PCI:1:0:0"
Screen 1
EndSection
Section "Device"
Identifier "Device2"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 8400GS"
BusID "PCI:2:0:0"
Screen 0
EndSection
Section "Device"
Identifier "Device3"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 8400GS"
BusID "PCI:2:0:0"
Screen 1
EndSection
Section "Device"
Identifier "Device4"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 8400 GS"
BusID "PCI:3:0:0"
Screen 0
EndSection
Section "Device"
Identifier "Device5"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 8400 GS"
BusID "PCI:3:0:0"
Screen 1
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "Stereo" "0"
Option "metamodes" "DVI-I-2: nvidia-auto-select +0+0"
Option "SLI" "Off"
Option "MultiGPU" "Off"
Option "BaseMosaic" "off"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "Device1"
Monitor "Monitor1"
DefaultDepth 24
Option "Stereo" "0"
Option "metamodes" "DVI-I-3: nvidia-auto-select +0+0"
Option "SLI" "Off"
Option "MultiGPU" "Off"
Option "BaseMosaic" "off"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Screen"
Identifier "Screen2"
Device "Device2"
Monitor "Monitor2"
DefaultDepth 24
Option "Stereo" "0"
Option "metamodes" "DVI-I-1: nvidia-auto-select +0+0 {rotation=left}"
Option "SLI" "Off"
Option "MultiGPU" "Off"
Option "BaseMosaic" "off"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Screen"
Identifier "Screen3"
Device "Device3"
Monitor "Monitor3"
DefaultDepth 24
Option "Stereo" "0"
Option "metamodes" "VGA-0: nvidia-auto-select +0+0 {rotation=left}"
Option "SLI" "Off"
Option "MultiGPU" "Off"
Option "BaseMosaic" "off"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Screen"
Identifier "Screen4"
Device "Device4"
Monitor "Monitor4"
DefaultDepth 24
Option "Stereo" "0"
Option "metamodes" "DVI-I-1: nvidia-auto-select +0+0 {rotation=left}"
Option "SLI" "Off"
Option "MultiGPU" "Off"
Option "BaseMosaic" "off"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Screen"
Identifier "Screen5"
Device "Device5"
Monitor "Monitor5"
DefaultDepth 24
Option "Stereo" "0"
Option "metamodes" "VGA-0: nvidia-auto-select +0+0 {rotation=left}"
Option "SLI" "Off"
Option "MultiGPU" "Off"
Option "BaseMosaic" "off"
SubSection "Display"
Depth 24
EndSubSection
EndSection
С Xinerma я теряю ускорение, и в некоторых случаях оно тормозит, но его можно использовать.
Думаю, я наконец понял это.
Спасибо, Дагмар, за последнее предложение. Это ближе к тому месту, где я хочу быть, но еще не совсем там.
Статус: решено на 90%.
Да, монтирование пространств имен — это один из подходов:
$ cat file
foo
$ cat other-file
bar
$ sudo unshare -m zsh -c 'mount --bind other-file file; USERNAME=$SUDO_USER; cat file'
bar
$ cat file
foo
Выше использовалось zsh
для восстановления uid/gid исходного пользователя для перехваченной команды cat.
Вот способ сделать это с предварительной загрузкой, чтобы втиснуть некоторый код между программой и системной библиотекой с помощью небольшого фрагмента кода. Это предполагает, что программа является динамически связанным двоичным файлом или скриптом, выполняемым динамически связанным двоичным файлом (т. е. он не связан статически). Запишите следующий код в файл override_fopen.c
:
#include <dlfcn.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#ifndef FROM
#error "Define FROM to the path to override in double quotes, e.g. -DFROM='\"/bad\"'"
#endif
#ifndef TO
#error "Define TO to the path to use instead in double quotes, e.g. -DFROM='\"/good\"'"
#endif
FILE *fopen(const char *path, const char *mode) {
void *(*original_fopen)(const char *, const char *) = dlsym(RTLD_NEXT, "fopen");
if (!strcmp(path, FROM)) {
path = TO;
}
return original_fopen(path, mode);
}
int open(const char *path, int oflag, ...) {
int (*original_open)(const char *, int, ...) = dlsym(RTLD_NEXT, "open");
int ret;
va_list args;
if (!strcmp(path, FROM)) {
path = TO;
}
va_start(args, oflag);
if (oflag & O_CREAT) {
ret = original_open(path, oflag, (mode_t)va_arg(args, mode_t));
} else {
ret = original_open(path, oflag);
}
va_end(args);
return ret;
}
Скомпилируйте с помощью следующей команды (это для Linux, для других вариантов Unix могут потребоваться другие параметры). Обратите внимание на кавычки вокруг пути, который вы хотите переопределить.
gcc -DFROM='"/path/to/file"' -DTO='"/path/to/alternate/content"' -D_GNU_SOURCE -O -Wall -fPIC -shared -o override_fopen.so override_fopen.c -ldl
Запустите программу следующим образом (в OSX используйте DYLD_PRELOAD
вместо LD_PRELOAD
):
LD_PRELOAD=./override_fopen.so ./myexe
Это работает, только если программа вызывает fopen
или открыть
библиотечную функцию. Если он вызывает какую-то другую функцию, вам нужно переопределить ее. Вы можете использовать ltrace
, чтобы увидеть, какие библиотечные вызовы делает программа.