参考自:【linux】linux下摄像头设置固定的设备名-udev_linux 摄像头的设备文件名-CSDN博客
UDEV规则
在Linux系统中,UDEV(Userspace DEV)是一个用于管理设备节点和/dev目录下设备文件的动态设备管理器。当你连接USB摄像头或其他USB设备时,UDEV会自动识别并处理这些设备。然而,在某些情况下,你可能需要为USB摄像头配置特定的UDEV规则以满足特定的需求,比如设置权限、创建符号链接等。本文将介绍如何为USB摄像头配置UDEV规则。
希望对UEDV进一步了解的朋友可以看这篇:Linux的UDEV机制-CSDN博客
1. 识别USB摄像头
在配置UDEV规则之前,首先需要识别你的USB摄像头的设备ID。你可以使用lsusb
命令来列出所有连接的USB设备及其ID。查看外设的设备号,主设备号:辅助设备号
执行如下命令
lsusb
在输出中,你会看到类似于以下的行:
这里的1e45:8022
就是设备ID,你需要记下它以便在后续的UDEV规则中使用。
idVendor: 1e45
idProduct: 8022
2. 配置 udev规则:
UDEV规则文件通常存储在/etc/udev/rules.d/
目录下。你需要以root用户或具有sudo权限的用户身份创建一个新的规则文件。规则文件的命名通常遵循xx-your-rule.rules
的格式,其中xx
是一个数字,用于确定规则文件的加载顺序。
sudo nano /etc/udev/rules.d/99-usb-camera.rules |
进入指定路径
cd /etc/udev/rules.d/
新建video.rules
sudo vi video.rules
添加如下内容:
KERNEL=="video*", ATTRS{idVendor}=="1e45", ATTRS{idProduct}=="8022",MODE="0777",SYMLINK+="mycamera"
注意:
把ATTRS{idVendor}=="1e45", ATTRS{idProduct}=="8022", 替换成自己的设备ID
3. 重新加载UDEV规则
在编写完规则文件后,你需要重新加载UDEV规则以使更改生效。这可以通过重启系统或使用udevadm
命令来完成。但是,更简单的方法是使用udevadm control --reload-rules
命令重新加载规则文件。
udevadm control --reload-rules
然后,你需要触发UDEV事件以重新处理已连接的设备。你可以使用udevadm trigger
命令来实现这一点。
sudo udevadm trigger
4. 测试配置
现在,你可以断开并重新连接USB摄像头,或者重新启动系统来测试配置是否生效。你可以使用v4l2-ctl
、ffmpeg
等工具来检查摄像头是否可以被正确识别并访问。
例如,使用v4l2-ctl --list-devices
命令列出所有可用的视频设备:
v4l2-ctl --list-devices
验证 那哪个设备号 是可行的可行:
sudo fswebcam -d /dev/video1 --no-banner -r 1280x720 -S 5 ./image.jpg
注意video1 根据自己的实际情况编写/修改
配置mjpg-steam开机自启
固定好设备号后,我们就能配置mjpg-steam的开机自启了
安装配置 mjpg-streamer
下载 mjpg-streamer
orangepi@orangepi:~ $ git clone https://gitee.com/leeboby/mjpg-streamer
sudo apt-get install -y cmake libjpeg8-dev
编译安装 mjpg-streamer
cd mjpg-streamer/mjpg-streamer-experimental
2)编译
make -j4
3)安装
sudo make install
vi ./start.sh
配置开机自启服务
cd 命令进入home目录
cd
创建shell脚本
vim mjpg.sh
编辑 rc.local
vim /etc/rc.local
#!/bin/sh -e
/home/orangepi/mjpg.sh &cd /home/orangepi/mjpg-streamer/mjpg-streamer-experimental
./start.sh
exit 0
配置好后 :wq 保存退出
重启
sudo reboot
开机,可以看到服务已经打开
服务重启大全(一定要看)
如果前面的步骤都是对的但还是无法实现开机自启和固定摄像头设备怎么办呢,下面给出的是本文的关键,依次执行如下七条命令,大概率能帮你解决这类问题
// 每次修改后记得重启以下服务:
设置开机自启命令
sudo systemctl start rc-local.service 启动服务
sudo systemctl enable rc-local.service 开机自动启动
sudo systemctl daemon-reload 更新服务
sudo systemctl restart rc-local.service 重启服务
sudo systemctl status rc-local.service 查看当前服务状态
//每次固定 摄像头设备号的
sudo udevadm control --reload-rules
sudo udevadm trigger
rc.loacl补充
rc.local
是一个在 Unix 和 Unix-like 系统中常见的初始化脚本,特别是在基于 SysVinit 的系统(如较旧的 Linux 发行版)中。当系统完成其启动过程(即所有系统级的初始化脚本都已运行)并准备将控制权交给用户时,rc.local
脚本会被执行。这为用户提供了一个在系统完全启动后运行自定义命令或启动服务的机会。
rc.local
脚本通常位于 /etc/
目录下,并且是一个可执行文件。在某些系统中,它可能是一个链接到另一个目录(如 /etc/init.d/
)的符号链接。
rc.local
的内容通常类似于以下形式:
bash复制代码
#!/bin/sh -e | |
# | |
# rc.local | |
# | |
# This script is executed at the end of each multiuser runlevel. | |
# Make sure that the script will "exit 0" on success or any other | |
# value on error. | |
# | |
# In order to enable or disable this script just change the execution | |
# bits. | |
# | |
# By default this script does nothing. | |
# 启动自定义服务或运行命令 | |
/path/to/your/custom/command & | |
exit 0 |
请注意以下几点:
- 脚本的第一行(
#!/bin/sh -e
)指定了用于解释脚本的 shell(在这种情况下是/bin/sh
)以及选项-e
,这表示如果任何命令失败(返回非零状态),则整个脚本将立即退出。 - 脚本中包含了一些注释,解释了其用途和如何启用/禁用它。
- 在注释之后,你可以添加你自己的命令或启动服务的命令。
- 脚本最后以
exit 0
结束,表示成功执行。
然而,需要注意的是,现代的 Linux 发行版(如 Ubuntu 16.04+ 和 Debian 8+)已经逐渐淘汰了 SysVinit,转而使用更现代的初始化系统,如 systemd。在 systemd 中,rc.local
并不被直接支持,但你可以通过安装一个特殊的软件包(如 systemd-rc-local-generator
)或使用 systemd 的服务单元文件来模拟其功能。
如果你在使用基于 systemd 的系统,并希望在系统启动时运行自定义命令,你应该考虑创建一个 systemd 服务单元文件并将其放置在 /etc/systemd/system/
或 /lib/systemd/system/
目录中。
nano补充
在Linux系统中,nano
是一个简单易用的文本编辑器,特别适合初学者和需要快速编辑文本文件的用户。它提供了基本的文本编辑功能,如打开文件、保存文件、复制、粘贴、查找和替换等,但不像vim
或emacs
那样具有复杂的快捷键和模式。
如果你在使用nano
来编辑UDEV规则文件,你可以按照以下步骤操作:
-
打开终端(Terminal)。
-
使用
sudo
命令以root用户权限打开nano
编辑器来编辑UDEV规则文件。例如,如果你想编辑99-usb-camera.rules
文件,可以运行:
sudo nano /etc/udev/rules.d/99-usb-camera.rules |
-
在
nano
编辑器中,你可以使用以下基本快捷键:Ctrl + O
保存文件。Ctrl + X
退出编辑器。Ctrl + K
剪切文本(剪切的文本会被复制到缓冲区)。Ctrl + U
粘贴文本(粘贴之前剪切或复制的文本)。Ctrl + W
查找文本。Alt + W
查找下一个匹配的文本。- 使用箭头键(↑、↓、←、→)来移动光标。
- 使用Backspace键删除字符,或使用
Ctrl + K
删除整行。
-
在编辑器中输入你的UDEV规则,例如:
bash复制代码
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666" |
-
使用
Ctrl + O
保存文件,然后使用Ctrl + X
退出nano
编辑器。 -
接下来,你可以使用
udevadm
命令来重新加载UDEV规则并触发设备事件,如之前所述。
请注意,在编辑系统文件时,特别是使用sudo
权限时,要小心不要误删除或修改重要的内容。如果你不确定某个步骤,请先在网上搜索或咨询有经验的用户。