usbip을 실행하는 호스트를 갖고 싶습니다.
[Unit]
Description=USB-IP Binding
After=network-online.target
[Service]
ExecStartPre=/usr/sbin/usbipd -D
ExecStart=/usr/sbin/usbip bind --busid 1-1.5
ExecStop=/usr/sbin/usbip unbind --busid 1-1.5
Restart=on-failure
[Install]
WantedBy=default.target
오류 없이 올바르게 시작되는 것 같지만 클라이언트로 이동하여 서버를 나열하면 usbip 실행이 표시되지 않습니다.
USBIP를 통해 모든 USB 장치를 공유하는 스크립트를 아는 사람이 있나요?
당신의 도움을 주셔서 감사합니다.
답변1
기반으로댓글에 OP가 게시한 링크, 문제는 여기에 있는 것 같습니다.
ExecStartPre=/usr/sbin/usbipd -D
ExecStart=/usr/sbin/usbip bind --busid 1-1.5
systemd 서비스에 대한 옵션을 지정 하지 않으면 Type=
서비스가 다음과 같이 가정됩니다 Type=simple
. 이 경우 ExecStart=
모든 것이 잘 진행되면 systemd는 이 옵션으로 시작된 프로세스가 영원히 실행될 것이라고 가정합니다.하지만 이 명령은 프로세스에게 서비스를 인계하고 종료하라고 usbip bind
지시할 뿐입니다 .usbipd
그런 다음 systemd는 "아, 서비스가 충돌했습니다!"라고 생각하고 서비스도 충돌했기 때문에 Restart=on-failure
서비스를 계속해서 다시 시작합니다.
작동하게 하려면 게시한 링크에서 제안한 대로 Type=forking
실제 usbipd
프로세스를 한 ExecStart=
줄로 지정하고 usbip bind
만들 수 있습니다. 그러나 이 솔루션은 새로운 systemd 사용자들 사이에서 흔히 발생하는 실수로 인해 어려움을 겪습니다. 즉, systemd가 쉽게 이 작업을 수행할 수 있는 반면 자신이 데몬이 되어야 한다고 ExecStartPost=
가정합니다 .usbipd
-D
가장 좋은 해결책은 명령줄에서 옵션을 제거 usbipd
하고 생략하는 것 입니다 Type=forking
(또는 Type=simple
명시적으로 사용하는 것). 이런 방식으로 systemd는 데몬 프로세스를 처리하고 PID 파일이나 임의의 명령을 사용하지 않고도 서비스 프로세스를 모니터링하고 중지할 수 있습니다 killall usbipd
ExecPost=
.
그래서 내 제안은 다음과 같습니다.
[Unit]
Description=USB-IP Binding
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/sbin/usbipd
ExecStartPost=/usr/sbin/usbip bind --busid 1-1.5
ExecStop=/usr/sbin/usbip unbind --busid 1-1.5
[Install]
WantedBy=multi-user.target
이러한 설정을 사용하면 systemd는 프로세스가 영원히 실행될 것으로 예상 usbipd
하고 프로세스가 예기치 않게 종료되면 실제로 서비스를 실패한 것으로 표시합니다. Restart=on-failure
이 경우 systemd가 자동으로 서비스를 다시 시작하도록 하려면 , 를 추가할 수 있습니다.
서비스를 종료할 때 이 ExecStop
명령은 USB 장치에서 완전히 바인딩을 해제하라는 메시지를 표시합니다. usbipd
성공적으로 완료되면 systemd는 서버 프로세스가 여전히 실행 중임을 확인하고 명시적인 명령 없이 이를 종료합니다.
을 사용할 때마다 After=network-online.target
항상 을 사용해야 합니다 Wants=network-online.target
. 그렇지 않으면 예상대로 작동하지 않을 수 있습니다. 바라보다네트워크가 온라인 상태가 된 후 서비스 실행systemd 문서에서는 systemd의 특수 대상을 다루는 매뉴얼 페이지에도 언급되어 있습니다 systemd.special(7)
.
답변2
내가 취한 접근 방식은 이를 데몬용 서비스와 바인딩 템플릿용 서비스로 나누는 것이었습니다.
따라서 데몬의 경우 - /etc/systemd/system/usbipd.service
[Unit]
Description=usbip host daemon
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Restart=always
ExecStartPre=/usr/sbin/modprobe usbip-core
ExecStartPre=/usr/sbin/modprobe usbip-host
ExecStart=/usr/sbin/usbipd
ExecStopPost=/usr/sbin/rmmod usbip-host
ExecStopPost=/usr/sbin/rmmod usbip-core
[Install]
WantedBy=multi-user.target
그리고 바인딩된 템플릿 - /etc/systemd/system/[이메일 보호됨]
[Unit]
Description=Bind USB device to usbipd
After=network-online.target usbipd.service
Wants=network-online.target usbipd.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/usbip bind --busid %i
ExecStop=/usr/sbin/usbip unbind --busid %i
[Install]
WantedBy=multi-user.target
데몬을 활성화하고 시작합니다.
systemctl enable usbipd
systemctl start usbuipd
그런 다음 바인딩을 추가합니다.
systemctl enable [email protected]
systemctl start [email protected]
1-1.2.3을 공유하려는 USB 장치의 바인딩 ID로 바꿉니다. 공유할 장치 수에 관계없이 사용할 수 있으며 각 장치를 개별적으로 바인딩 및 바인딩 해제한 다음 컴퓨터가 시작될 때 바인딩하거나 바인딩하지 않을 수 있습니다.
바인딩 ID를 찾으려면 다음 명령을 사용하십시오.
usbip list -l
약 10분 내에 원격 컴퓨터를 통해 연결이 없으면 usbip 바인딩이 만료되는 것 같습니다. 별로 도움이 되지 않습니다!
아직 systemd를 사용하지 않고 클라이언트 측 첨부 파일을 처리하는 방법을 결정하지 않았습니다. usbip에 지능이 더 있었다면 정말 도움이 됐을 텐데...