Ubuntuでデスクトップ共有後にタッチパッドが効かなくなる場合

Ubuntu26.04が動作している環境に、リモートデスクトップで接続したあと、直接そのPCを操作するとタッチパッドが動かなくなることがあります。キーボードやUSBマウスは問題ない場合、リモートデスクトップセッションが終了後、タッチパッドドライバー(i2c_hid_acpi)が正しくリリースされていないことが原因の可能性があります。

そこで修正スクリプトを作ってみました。環境依存が大きいので直らないかもしれませんが。
実行するスクリプトがやることは次の通りです。

  • /proc/bus/input/devices からタッチパッドデバイスを検出
  • sysfs経由でi2c HIDデバイスを特定
  • ドライバーの unbind → rebind を実行(デフォルト)

– または --module オプションでカーネルモジュール再読み込み

  • GNOME環境の場合は gsettings でタッチパッド有効化

ホストで実行

mkdir -p /opt/lxd-data/script/
cd /opt/lxd-data/script/
sudo nano fix-touchpad1.sh
sudo bash /opt/lxd-data/script/fix-touchpad1.sh
#!/bin/bash
# fix-touchpad1.sh - Fix touchpad after remote desktop session
# Usage: sudo bash fix-touchpad1.sh [--module]

set -euo pipefail

if [[ $EUID -ne 0 ]]; then
    echo "Error: This script must be run as root (use sudo)" >&2
    exit 1
fi

USE_MODULE=false
if [[ "${1:-}" == "--module" ]]; then
    USE_MODULE=true
fi

echo "=== Touchpad Reset Script ==="
echo ""

# Find touchpad device from /proc/bus/input/devices
TOUCHPAD_NAME=$(cat /proc/bus/input/devices | awk '
    /^N: Name=.*[Tt]ouchpad/ { gsub(/^N: Name="/, ""); gsub(/"$/, ""); print; exit }
')

if [[ -z "$TOUCHPAD_NAME" ]]; then
    echo "Error: No touchpad device found" >&2
    exit 1
fi

TOUCHPAD_SYSFS=$(cat /proc/bus/input/devices | awk '
    /^N: Name=.*[Tt]ouchpad/ { found=1; next }
    found && /^S: Sysfs=/ { gsub(/^S: Sysfs=/, ""); print; exit }
    found && /^$/ { found=0 }
')

if [[ -z "$TOUCHPAD_SYSFS" ]]; then
    echo "Error: Could not find touchpad sysfs path" >&2
    exit 1
fi

echo "Touchpad: $TOUCHPAD_NAME"
echo "Sysfs: $TOUCHPAD_SYSFS"

# Find the i2c HID device name
I2C_DEVICE=""
for dev in /sys/bus/i2c/devices/i2c-*/; do
    devname=$(basename "$dev")
    if [[ "$TOUCHPAD_SYSFS" == "$dev"* ]]; then
        I2C_DEVICE="$devname"
        break
    fi
done

if [[ -z "$I2C_DEVICE" ]]; then
    echo "Error: Could not find i2c device for touchpad" >&2
    exit 1
fi

echo "i2c device: $I2C_DEVICE"

# Find driver name
DRIVER_LINK="/sys/bus/i2c/devices/$I2C_DEVICE/driver"
if [[ ! -L "$DRIVER_LINK" ]]; then
    echo "Error: No driver bound to $I2C_DEVICE" >&2
    exit 1
fi

DRIVER_NAME=$(basename "$(readlink "$DRIVER_LINK")")
echo "Driver: $DRIVER_NAME"
echo ""

if [[ "$USE_MODULE" == true ]]; then
    # Method 2: Reload kernel module
    echo "Reloading kernel module: $DRIVER_NAME"
    modprobe -r "$DRIVER_NAME" 2>/dev/null || true
    sleep 1
    modprobe "$DRIVER_NAME" 2>/dev/null || true
    sleep 1
else
    # Method 1: Unbind/rebind driver (default)
    DRIVER_DIR="/sys/bus/i2c/drivers/$DRIVER_NAME"
    if [[ ! -d "$DRIVER_DIR" ]]; then
        echo "Error: Driver directory $DRIVER_DIR not found" >&2
        echo "Try: sudo bash $0 --module" >&2
        exit 1
    fi

    echo "Unbinding driver..."
    echo "$I2C_DEVICE" > "$DRIVER_DIR/unbind" 2>/dev/null || true
    sleep 1

    echo "Rebinding driver..."
    echo "$I2C_DEVICE" > "$DRIVER_DIR/bind" 2>/dev/null || true
    sleep 1
fi

# Verify
echo ""
echo "Verifying..."
if cat /proc/bus/input/devices | grep -q -i "Touchpad"; then
    echo "Touchpad detected: OK"
else
    echo "Warning: Touchpad not detected after reset" >&2
fi

# Reset GNOME touchpad settings if in graphical session
if command -v gsettings &>/dev/null && [[ -n "${DISPLAY:-}" || -n "${WAYLAND_DISPLAY:-}" ]]; then
    echo ""
    echo "Resetting GNOME touchpad settings..."
    gsettings set org.gnome.desktop.peripherals.touchpad send-events 'enabled' 2>/dev/null && \
        echo "GNOME touchpad enabled: OK" || \
        echo "Warning: Could not set GNOME setting (may need user session)"
fi

echo ""
echo "=== Done ==="
echo "If the touchpad still does not work, try: sudo bash $0 --module"

上記が効かない場合

ドライバーモジュールの再読み込み

sudo bash /opt/lxd-data/script/fix-touchpad1.sh --module

トラブルシューティング

症状対処
“No touchpad device found”cat /proc/bus/input/devices でタッチパッドが検出されているか確認
基本実行で効かない--module オプションを試す
それでも効かないリブートが必要な場合がある
GNOME設定が反映されないグラフィカルセッション(DISPLAY環境変数)が必要

手動での同様処理

bash
# タッチパッドデバイスのi2c IDを確認
cat /proc/bus/input/devices | grep -A5 -i touchpad

# ドライバーの unbind
echo "i2c-DEVICE_NAME" | sudo tee /sys/bus/i2c/drivers/i2c_hid_acpi/unbind

# ドライバーの rebind
echo "i2c-DEVICE_NAME" | sudo tee /sys/bus/i2c/drivers/i2c_hid_acpi/bind

自動実行設定(オプション)

ログイン時に自動実行したい場合:

# systemdサービスとして作成
cat << 'EOF' | sudo tee /etc/systemd/system/fix-touchpad.service
[Unit]
Description=Fix touchpad after remote desktop
After=network.target

[Service]
Type=oneshot
ExecStart=/opt/lxd-data/script/fix-touchpad1.sh

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable fix-touchpad.service

サスペンド後にキーボードやタッチパッドが効かなくなる場合

こちらのほうが多いのかも。使用しているPCによっても変わってきます。

sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT の行を下記のように

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i8042.reset i8042.nomux"

その後grubを更新し、

sudo update-grub

更新したらシステムを再起動します。
また、下記で直ったという情報もあるようです。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.autosuspend=-1"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash atkdb.reset i8042.nomux" 
タイトルとURLをコピーしました