Проверьте опции монтирования, а именно, смонтировано ли это noexec.
Если это - проблема, например, на/tmp, сделать
sudo mount -o remount,exec /tmp
Я думаю, что можно сделать это с этими командами:
отключить
echo 0 > /sys/bus/pci/slots/$NUMBER/power
включить
echo 1 > /sys/bus/pci/slots/$NUMBER/power
Где $NUMBER
количество разъема PCI.
lspci -vv
может помочь определить устройство. Это очень хорошо не документируется...
Я столкнулся с этим потоком на U&L, подобной проблеме: существуют некоторые ответы на тот вопрос, в которых говорится, что можно сбросить с этой командой:
echo "1" > /sys/bus/pci/devices/$NUMBER/reset
Однако я прочитал бы ответы там! Существуют условия вокруг выполнения его этот путь! Конкретно я прочитал бы этот ответ!
Существует команда Unix, setpci
, это может дать Вам метод для сброса устройства в шине PCI.
Я не видел определенных примеров с этой командой, таким образом, необходимо будет погуглить для примеров и просмотреть страницу справочника. Я шагал бы слегка с этой командой, пока Вы не уверены в, он - использование. Из того, что я читал об этом, это управляет аппаратными средствами непосредственно и таким образом, всегда существуют риски в выполнении его самостоятельно по сравнению с использованием инструмента, который выставляет этот тип функциональности!
remove
и повторное сканирование
будет разрешить ядру циклически включать устройство PCI без перезагрузки
:
echo "1" > /sys/bus/pci/devices/DDDD\:BB\:DD.F//remove
sleep 1
echo "1" > /sys/bus/pci/rescan
где DDDD.BB.DD.F = Домен: Шина: Функция устройства
Сбросы в PCI Express немного сложны. Существует два основных типа сброса -обычный сброс и сброс уровня -. Существует также два типа обычных сбросов: фундаментальные сбросы и неосновные сбросы -. Все подробности см. в спецификации PCI Express.
«Холодный сброс» — это фундаментальный сброс, который происходит после подачи питания на устройство PCIe. Похоже, не существует стандартного способа запуска холодного сброса, за исключением выключения и повторного включения системы. На моих машинах каталог /sys/bus/pci/slots
пуст.
«Теплый сброс» — это основной сброс, который запускается без отключения питания от устройства. Похоже, не существует стандартного способа запуска теплого сброса.
«Горячий» сброс — это обычный сброс, который запускается по каналу PCI Express. Горячий сброс запускается либо при переводе канала в режим электрического бездействия, либо при отправке упорядоченных наборов TS1 и TS2 с установленным битом горячего сброса. Программное обеспечение может инициировать горячий сброс, установив, а затем очистив бит сброса вторичной шины в регистре управления мостом в пространстве конфигурации PCI порта моста выше по течению от устройства.
«Сброс уровня функции -» (FLR )— это сброс, который влияет только на одну функцию устройства PCI Express. Он не должен сбрасывать все устройство PCIe. Реализация сброса уровня функции -не требуется спецификацией PCIe. Сброс уровня функции -инициируется установкой бита сброса уровня инициации функции -в регистре управления устройством функции в структуре возможностей PCI Express в пространстве конфигурации PCI.
Linux предоставляет функцию сброса уровня -в виде /sys/bus/pci/devices/$dev/reset
.Запись 1 в этот файл инициирует сброс уровня функции -соответствующей функции. Обратите внимание, что это влияет только на эту конкретную функцию устройства, а не на все устройство, и устройства не обязаны реализовывать сброс уровня функции -в соответствии со спецификацией PCIe.
Я не знаю ни одного «хорошего» метода запуска горячей перезагрузки (для этого нет записи в sysfs ). Однако для этого можно использовать setpci :
.#!/bin/bash
dev=$1
if [ -z "$dev" ]; then
echo "Error: no device specified"
exit 1
fi
if [ ! -e "/sys/bus/pci/devices/$dev" ]; then
dev="0000:$dev"
fi
if [ ! -e "/sys/bus/pci/devices/$dev" ]; then
echo "Error: device $dev not found"
exit 1
fi
port=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$dev")))
if [ ! -e "/sys/bus/pci/devices/$port" ]; then
echo "Error: device $port not found"
exit 1
fi
echo "Removing $dev..."
echo 1 > "/sys/bus/pci/devices/$dev/remove"
echo "Performing hot reset of port $port..."
bc=$(setpci -s $port BRIDGE_CONTROL)
echo "Bridge control:" $bc
setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $(("0x$bc" | 0x40)))
sleep 0.01
setpci -s $port BRIDGE_CONTROL=$bc
sleep 0.5
echo "Rescanning bus..."
echo 1 > "/sys/bus/pci/devices/$port/rescan"
Перед запуском этого скрипта убедитесь, что все подключенные драйверы выгружены. Этот сценарий попытается удалить устройство PCIe, затем даст команду восходящему порту коммутатора выполнить горячий сброс, а затем попытается повторно просканировать шину PCIe. Этот сценарий также тестировался только на устройствах с одной функцией, поэтому для устройств с несколькими функциями может потребоваться его доработка.
Создание ответа, опубликованного alex.forencich
Мне пришлось внести несколько изменений, чтобы это заработало в CentOS 7, отчасти потому, что я работаю не с правами root. Эта версия отображает выполняемые команды.
#!/bin/bash
# e.g. $./pcie_hot_reset.sh 04:00.0
DEV=$1
if [ -z "$DEV" ]; then
echo "Error: no device specified"
exit 1
fi
if [ ! -e "/sys/bus/pci/devices/$DEV" ]; then
DEV="0000:$DEV"
fi
if [ ! -e "/sys/bus/pci/devices/$DEV" ]; then
echo "Error: device $DEV not found"
exit 1
fi
PORT=$(basename $(dirname $(readlink "/sys/bus/pci/devices/$DEV")))
if [ ! -e "/sys/bus/pci/devices/$PORT" ]; then
echo "Error: device $PORT not found"
exit 1
fi
echo -e "\nRemoving $DEV"
CMD="echo 1 | sudo tee /sys/bus/pci/devices/$DEV/remove"
printf "> $CMD\n"
eval $CMD
echo -e "\nPerforming hot reset of port $PORT"
CMD="setpci -s $PORT BRIDGE_CONTROL"
printf "> $CMD\n"
BR_CTRL=$(eval $CMD)
echo "Bridge control: $BR_CTRL"
CMD="sudo setpci -s $PORT BRIDGE_CONTROL=$(printf "%04x" $((0x${BR_CTRL} | 0x40)))"
printf "> $CMD\n"
eval $CMD
sleep 0.01
CMD="sudo setpci -s $PORT BRIDGE_CONTROL=$BR_CTRL"
printf "> $CMD\n"
eval $CMD
sleep 0.5
echo -e "\nRescanning bus"
CMD="echo 1 | sudo tee /sys/bus/pci/devices/$PORT/rescan"
printf "> $CMD\n"
eval $CMD
Пример вывода:
$./pcie_hot_reset.sh 04:00.0
Removing 0000:04:00.0
> echo 1 | sudo tee /sys/bus/pci/devices/0000:04:00.0/remove
1
Performing hot reset of port 0000:00:03.0
> setpci -s 0000:00:03.0 BRIDGE_CONTROL
Bridge control: 0010
> sudo setpci -s 0000:00:03.0 BRIDGE_CONTROL=0050
> sudo setpci -s 0000:00:03.0 BRIDGE_CONTROL=0010
Rescanning bus
> echo 1 | sudo tee /sys/bus/pci/devices/0000:00:03.0/rescan
1
/sys/bus/pci/devices/$NUMBER/
. Но ничто, кажется, не гарантирует установку 0 или 1 – zachd1_618 28.04.2013, 02:30echo "1" > ...
. – zachd1_618 28.04.2013, 03:06