Zařízení PCI můžete odebrat přidáním pravidla udev do /etc/udev/rules.d :
ACTION=="add", KERNEL=="0000:00:03.0", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:03.0/remove'"
Nahraďte 0000:00:03.0
s adresou zařízení pci, které chcete odstranit
Žádná z odpovědí nevyřešila můj podobný problém, ale přivedly mě na cestu k jeho vyřešení!
Moje chyba syslog:
[ 334.940158] hub 1-0:1.0: unable to enumerate USB device on port 7
Toto je interní USB hub-port pro bluetooth možnost, kterou nemám.
unbind to pci device právě vyústilo v to, že se rozbočovač znovu objevil jako další rozbočovač (v mém případě 5) a dále zahltil syslog.
Náhodou jsem si všiml unbind struktury pod /sys/bus/usb/drivers/hub
. Pomocí výše uvedených příkladů jsem právě přidal následující do rc.local:
echo "1-0:1.0" > /sys/bus/usb/drivers/hub/unbind
Výsledkem je ticho syslog! Nyní přidám kshurigův příklad skriptu pro správu napájení a měl bych být zlatý.
Nedávno jsem narazil na tento problém při konfiguraci mého xen boxu s více zařízeními USB. Chtěl jsem, aby jeden používal Dom-0 a druhý využíval VM, takže jsem potřeboval, aby bylo zařízení dostupné pro xen-pciback. Ovladač usb byl však v mém jádře kompatibilní, takže jsem nemohl ovladač jen tak zakázat. Mým řešením bylo vytvořit vlastní skript initramfs, který odpojí konkrétní port pci velmi brzy v procesu zavádění.
Toto je Ubuntu 2016.04, ale mělo by fungovat v dřívějších verzích.
Jedná se o tři soubory. Pojmenoval jsem je pro svůj konkrétní případ použití, ale ymmv:
První soubor s názvem /etc/unbindpci
soubor, což je jednoduchý csv s číslem zařízení pci a ovladačem (zde nakonfigurujte podle potřeby):
0000:08:00.0,xhci_hcd
0000:03:00.0,radeon
Druhý soubor /etc/initramfs-tools/hooks/xenfiles
, který zkopíruje výše uvedenou konfiguraci do initramfs.
#! /bin/bash
if [ -f /etc/unbindpci ]; then
cp -pP /etc/unbindpci $DESTDIR/etc/unbindpci
fi
Třetí soubor je to, co funguje při startu, umístil jsem ho do /etc/initramfs-tools/scripts/init-top/unbind-early-pci
:
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac
# This only executes if in a xen Dom-0.
# Edit if that's not your use case!
if [ -f /sys/hypervisor/uuid -a -f /etc/unbindpci ]; then
if [ $(cat /sys/hypervisor/uuid) = "00000000-0000-0000-0000-000000000000" ]; then
echo "Unbinding pci ports..."
IFS=,
while read addr driver; do
if [ -f /sys/bus/pci/drivers/$driver/unbind ]; then
echo "Unbinding $addr, device $driver"
echo $addr > /sys/bus/pci/drivers/$driver/unbind
fi
done < /etc/unbindpci
fi
fi
Nakonec spusťte update-initramfs -k all -u
a restartujte.
Do konfiguračního souboru bych mohl zahrnout podporu pro komentáře a je zde spousta věcí, které je třeba vyčistit, ale pro mě to funguje.