Обратите внимание, что этими условиями не является Linux определенная но конкретная файловая система. Большинство файловых систем, используемых текущим Unix и Unix как системы, или получено или вдохновлено исходной файловой системой Unix, которая определила суперблок и inode идиомы. Linux может также смонтировать несколько файловых систем, с которыми нет никакого понятия суперблока и/или inode, при этом наиболее распространенным является FAT. Другой, ZFS, не использует суперблоки, но überblocks.
Я использую этот простой (самодельный) сценарий, который продолжает опрашивать RandR и переключается между LVDS1 и VGA1, когда VGA соединен/разъединен. (Для выводов HDMI, в следующем файле сценария, изменение весь VGA1
кому: HDMI1
)
Это - грязное решение, все же это работает просто великолепно.
Это настраивается для моей установки: необходимо будет, скорее всего, изменить выходные имена RandR (LVDS1
и VGA1
) и в отличие от меня Вы, вероятно, согласитесь со своим режимом по умолчанию RandR для VGA.
#!/bin/bash
# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080
# default monitor is LVDS1
MONITOR=LVDS1
# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
echo "Switching to VGA1"
xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
MONITOR=VGA1
}
function DeactivateVGA {
echo "Switching to LVDS1"
xrandr --output VGA1 --off --output LVDS1 --auto
MONITOR=LVDS1
}
# functions to check if VGA is connected and in use
function VGAActive {
[ $MONITOR = "VGA1" ]
}
function VGAConnected {
! xrandr | grep "^VGA1" | grep disconnected
}
# actual script
while true
do
if ! VGAActive && VGAConnected
then
ActivateVGA
fi
if VGAActive && ! VGAConnected
then
DeactivateVGA
fi
sleep 1s
done
Полные шаги:
Помещенный выше сценария (homemadeMonitor.sh
) в Вас предпочтенный каталог
Сделайте .sh исполняемый файл файла путем ввода следующей команды в терминале
chmod +x homemadeMonitor.sh
Выполните .sh файл
./homemadeMonitor.sh
Ответ к" способ сказать, что монитор был включен в" части вопроса:
Поддержка все еще варьируется вполне немного, но с недавними ядрами существует некоторая поддержка генерации udev события, когда замена в горячем режиме дисплея происходит. С ядром 2.6.38 и аппаратными средствами ATI X1400, я получаю событие в первый раз, когда я подключаю дисплей VGA, но никакие события на последующих разъединениях или не соединяются снова дисплея. Аппаратные средства Intel могут иметь лучшую поддержку. NVIDIA собственный драйвер в настоящее время не поддерживает KMS; я не попытался искать события замены в горячем режиме на аппаратных средствах NVIDIA, но я сомнителен, что они работали бы.
Если Вы хотите экспериментировать с udev, Вы могли бы попробовать следующие шаги:
[drm] radeon kernel modesetting enabled
и [drm] initializing kernel modesetting
udevadm monitor --property
и посмотрите, сообщают ли о событиях (скидка-) при подключении дисплеевЕсли Вы получаете udev события, демонстрирующиеся замена в горячем режиме, можно инициировать сценарий с правилом udev как:
ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"
Примечание: Это не будет работать при использовании GPU NVIDIA с собственным двоичным драйвером так как он не использует KMS. Вы не получите udev событий.
Относительно инструмента, который может сохранить профили конфигурации монитора на основе на дисплей и в расчете на пользователя, autorandr сделает точно это. https://github.com/wertarbyte/autorandr.
Мой ноутбук имеет карту NVIDIA, таким образом, я использую disper бэкенд вместо xrandr: http://willem.engen.nl/projects/disper/. Autorandr будет использовать disper в качестве бэкенда для управления мониторами при вызове его как autodisper
. Для остальной части этого сообщения, хотя, я обращусь к нему как autorandr
для непротиворечивости.
Можно сохранить профили с autorandr --save profile_name
. Выполнение autorandr
отдельно затем даст Вам список профилей и определит, какой обнаруживается как текущая конфигурация.
Например:
$ autorandr
laptop
syncmaster19 (detected)
Можно сказать этому автоматически загружать соответствующий профиль для текущей конфигурации с autorandr --change
. Эта команда, соединенная с правилом udev выполнить его, когда это заменено в горячем режиме, сделала бы то, что Вы запросили.
Как добавленная предосторожность я добавил --default laptop
к той команде, которая сделает это значением по умолчанию к дисплею ноутбука, если не будет никакого сохраненного профиля, который соответствует текущей конфигурации. Так полная команда я использую для переключения, дисплеи:
autorandr --change --default laptop
К сожалению, моя машина не дает вывода udev, когда я заменяю свой монитор в горячем режиме. Я использую NVIDIA собственные драйверы, так, чтобы не было удивительно. Таким образом, я связал его с ключом XF68Display (Fn-F8) на данный момент, который является почти как хороший.
udev
– Leo Gallucci
26.01.2014, 17:38
autorandr
: github.com/phillipberndt/autorandr
– Olegs Jeremejevs
17.11.2017, 15:14
Я использовал правило udev, предложенное выше наряду со сценарием оболочки, который похож
#!/bin/sh
dmode="$(cat /sys/class/drm/card0-VGA-1/status)"
export DISPLAY=:0
export XAUTHORITY=/home/yourusername/.Xauthority
if [ "${dmode}" = disconnected ]; then
/usr/bin/xrandr --auto
elif [ "${dmode}" = connected ];then
/usr/bin/xrandr --output VGA1 --auto --right-of LVDS1
else /usr/bin/xrandr --auto
fi
Часть Xauthority является основной, а также экспорт DISPLAY
, можно использовать эхо $DISPLAY
видеть, какому числу это равно. Использовать xrandr -q
для наблюдения внешних мониторов, Вы имеете. Последнее еще оператор должен только удостовериться, что Вы никогда не застреваете без дисплея.
Доступна небольшая программа, которая ждет от X-сервера уведомления об изменении конфигурации монитора, а затем выполняет данную команду (например, autorandr
, упомянутую в другом ответе): https://bitbucket.org/portix/srandrd/overview
Похоже, это более чистое решение, использующее udev
(где нужно беспокоиться о поиске подходящего X-сервера и т.д.)
Полагаю, что люди, смотрящие на этот вопрос, не те, кто хочет использовать GNOME, и тем, кто использует GNOME, не пришлось бы смотреть на этот вопрос, но в интересах полноты:
GNOME имеет эту функциональность встроенную. Если вы измените настройку через gnome-control-center, gnome-settings-daemon запомнит её (в .config/monitors.xml
) и автоматически применит её, когда монитор будет подключён или отключён.
К сожалению, конфигурация в файле monitors.xml плохо документирована. См. вопрос здесь . Инструментарий отображения гномов также не имеет средств настройки панорамирования, масштабирования для каждого монитора и не выполняет масштабирование. Поскольку многие люди используют экран ноутбука HiDPI вместе с обычным экраном DPI, этих инструментов недостаточно для получения работоспособного решения.
Я видел это , упомянутое в качестве пункта дорожной карты для Wayland , хотя, когда это, в конце концов, произойдет, мы можем увидеть исправления для упомянутых проблем. До этого момента на Gnome я просто запускаю скрипт запуска после задержки для установки xrandr вручную.
При использовании решения PEORO у меня есть дополнительный вывод из Xrandr, поэтому я использовал опцию -c для GREP, которая подсчитывает количество совпадений. Я адаптировал его для HDMI и добавил аудиосъемку также:
#!/bin/bash
# adapted from http://unix.stackexchange.com/questions/4489/
# default monitor is LVDS1
MONITOR=LVDS1
# functions to switch from LVDS1 to HDMI1
function ActivateHDMI {
xrandr --output HDMI1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
pactl set-card-profile 0 output:hdmi-stereo-extra1
MONITOR=HDMI1
}
function DeactivateHDMI {
xrandr --output HDMI1 --off --output LVDS1 --auto
pactl set-card-profile 0 output:analog-stereo
MONITOR=LVDS1
}
# functions to check if HDMI is connected and in use
function HDMIActive {
[ $MONITOR = "HDMI1" ]
}
function HDMIConnected {
[[ `xrandr | grep "^HDMI1" | grep -c disconnected` -eq 0 ]]
}
# actual script
while true
do
if ! HDMIActive && HDMIConnected
then
ActivateHDMI
fi
if HDMIActive && ! HDMIConnected
then
DeactivateHDMI
fi
sleep 1s
done
Если у вас, должно быть, он, должно быть, он автоматически определяет отображение, когда он подключен, кажется, что самое чистое решение состоит в том, чтобы добавить правило UDEV для запуска скрипта, содержащего ваши команды xrandr. Вот пример из решения одного пользователя 1 :
Монитор (выходные) События UDEV с UDEVADM
Этот шаг будет наиболее важным для каждого пользователя. Беги UdevAdm Monitor --environment --udev
. Затем подключите свой кабель HDMI.
Правило UDEV
на основе выхода из вышеуказанной команды пользователь создал это правило UDEV на /etc/udev/rules.d/95-monitor-hotplug.rules
.
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/dan/.Xauthority", RUN+="/usr/local/bin/hotplug_monitor.sh"
Примечание. Переменные среды используются, чтобы Xrandr будет выполняться в профиле пользователя.
Xrandr Script HotPlug_Monitor.sh
Вы можете настроить параметры Xrandr, чтобы удовлетворить ваши потребности.
#! /usr/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/dan/.Xauthority
function connect(){
xrandr --output HDMI1 --right-of LVDS1 --preferred --primary --output LVDS1 --preferred
}
function disconnect(){
xrandr --output HDMI1 --off
}
xrandr | grep "HDMI1 connected" &> /dev/null && connect || disconnect
Редактирование моего ответа, чтобы сделать его проще для настройки.
Установите AUTORANDR для автоматизации макета экрана в Xrandr, захватите последнюю .deb из https://github.com/nalipaz/autplestrandr/reluses и Run:
dpkg -i [file]
Установка AutoRandr с сохраненными макетами экрана
autorandr --save [docked|mobile|home|etc]
В качестве примера, на моем ноутбуке без каких-либо мониторов подключил, я настроил Arandr так, как я так хочу, а затем запустил:
autorandr --save mobile
затем подключил мой HDMI и перенастроить Arandr, затем RAN:
autorandr --save docked
после настройки каждого из ваших Макеты Вы можете запустить (заменить «мобильный» с предыдущим любимым именем, я использовал Mobile):
autorandr --default mobile
Теперь, когда AutoRandr - это все настройки, вы можете автоматизировать процесс, установив пакет, который будет опросить для подключенных дисплеев и запустить AutoRandr - -майте
при обнаружении. Да, я знаю о UDEV, и вы можете установить это, если это работает для вас, но в моем тестировании UDEV не работал на моем HDMI последовательно. Он работал только 1 из каждых 20 заглушек / отключений или около того, а иногда он просто остановился вообще.
Скачать последний .deb отсюда: https://github.com/nalipaz/poll-xrandr/relestest/ Затем установить с
dpkg -i [file]
, скорее всего, необходимо, чтобы вы запустили больше задач на Завершение AutoRandr --Change
, AutoRandr позволяет вставлять эти команды в файл, называемый ~ / .auTorandr / postswitch. Делайте следующим образом:
cd ~/.autorandr/ && touch postswitch && chmod +x postswitch
Теперь отредактируйте файл PostWitch, чтобы иметь что-то похожее на следующее:
#!/bin/bash
if pidof conky > /dev/null 2>&1; then
killall conky
fi
(sleep 2s && xrandr-adjust-brightness restore -q) &
(sleep 2s && nitrogen --restore) &
(sleep 3s && conky -q) &
Кроме того, вы, вероятно, захотите добавить AutoRandr и Poll-Xrandr в свои запуска, что-то вроде следующие две команды:
autorandr --change &
poll-xrandr &
Отключить Или подключите монитор и посмотрите магию!
Для тех, кто по какой-либо причине не хочет использовать маршрут горячего подключения, все еще можно не проводить опрос в сценарии с помощью inotifywait:
#!/bin/bash SCREEN_LEFT=DP2 SCREEN_RIGHT=eDP1 START_DELAY=5 renice +19 $$ >/dev/null sleep $START_DELAY OLD_DUAL="dummy" while [ 1 ]; do DUAL=$(cat /sys/class/drm/card0-DP-2/status) if [ "$OLD_DUAL" != "$DUAL" ]; then if [ "$DUAL" == "connected" ]; then echo 'Dual monitor setup' xrandr --output $SCREEN_LEFT --auto --rotate normal --pos 0x0 --output $SCREEN_RIGHT --auto --rotate normal --below $SCREEN_LEFT else echo 'Single monitor setup' xrandr --auto fi OLD_DUAL="$DUAL" fi inotifywait -q -e close /sys/class/drm/card0-DP-2/status >/dev/null done
Опрос с помощью xrandr вызвал серьезные проблемы с удобством использования на моем новом ноутбуке ( мышь периодически глохнет).
Например, для упрощения в Xfce установите "arandr", который должен быть доступен в пакетах вашего дистрибутива. Настройте свой дисплей с помощью «arandr», а затем сохраните его, например, как «displayLayout». Arandr должен добавить для вас расширение ".sh", чтобы его можно было напрямую использовать в "function connect ()", как написано в сценарии "hotplug_monitor.sh", упомянутом iyrin выше, например:
function connect(){
/path/to/displayLayout.sh
}
Чтобы использовать механизм отключения, добавьте в в верхней части скрипта чуть ниже "#! / bin / bash", например:
#!/bin/bash
#
PLUGGED_EXTERNAL=`xrandr | awk /"connected [0-9]"/'{print $1}'`
xrandr обнаружит отображение и передаст вывод в awk, который отфильтрует его на основе регулярного выражения "connected", за которым следует цифра, которая по сути является что мы хотим. На мой взгляд, нет необходимости указывать точное разрешение в регулярном выражении, потому что основной дисплей отображается как «подключенный основной», за которым следует номер, то есть разрешение.Затем awk «print $ 1» напечатает только первый столбец, который в данном случае является именем внешнего монитора, и он будет сохранен в переменной PLUGGED_EXTERNAL. Далее вместо фиксированного отображаемого имени "HDMI1" в скрипте можно использовать $ PLUGGED_EXTERNAL так:
function disconnect(){
xrandr --output $PLUGGED_EXTERNAL --off
}
xrandr | grep "$PLUGGED_EXTERNAL connected" &> /dev/null && connect || disconnect