Webcam Drivers on Linux: Getting an Undetected Camera Recognized
Most webcams work on Linux without a separate driver. Learn how Linux webcam support works and how to check, load and test an undetected camera.
Do you need to install a webcam driver on Linux?
For most USB webcams, no. The Linux kernel includes the uvcvideo driver, which supports cameras that follow the USB Video Class (UVC) standard. Most current external webcams and many built-in laptop cameras follow this standard. When such a camera is not recognized, the cause is usually something other than a missing driver. The camera may not be detected on the USB bus, the module may not be loaded, another application may be holding the device, a privacy switch or firmware setting may disable it, or the application may lack camera permission. Driver downloads from camera manufacturers are usually built for Windows or macOS and do not apply to Linux.
There are two main exceptions. Some recent laptops connect the camera through a MIPI interface and an image processing unit, such as Intel IPU6, instead of USB. These cameras need platform-specific drivers and often libcamera, and support depends on the kernel version and the distribution. Some older USB webcams do not use UVC. They may rely on the gspca driver family in the kernel, or they may have no support at all.
How Linux webcam support works
A camera reaches an application through a chain of components. First the hardware connects, usually over USB. Then a kernel driver such as uvcvideo binds to it and exposes it through the Video4Linux2 (V4L2) interface as a device node like /dev/video0. Applications read from that node directly or through a layer such as PipeWire. A failure at any step can make the camera look undetected, so check each step in order.
A single UVC camera often creates more than one video node. One of these nodes may carry metadata rather than images. An application that opens the wrong node can show nothing even though the driver is working. The node numbering can also change between boots or when other video devices are present.
Several details depend on your system rather than on Linux in general. These include the kernel version, which packages your distribution installs by default, and how sandboxed applications (Flatpak or Snap) request camera access. PipeWire's camera handling is another variable. Check your distribution's documentation for these details instead of assuming they match another system.
Getting an undetected camera recognized, step by step
- Rule out physical blocks: a lens shutter, a privacy switch, a camera toggle on a function key, or a camera option disabled in BIOS/UEFI settings. For an external webcam, connect it directly to a computer port rather than a hub, and try another port or cable.
- Run lsusb before and after plugging the camera in. If no new device appears, the problem is below the driver level: hardware, cable, port, power or a firmware setting.
- Right after connecting the camera, read the kernel log with sudo dmesg or journalctl -k. Look for uvcvideo messages or USB errors.
- Check whether the driver is loaded with lsmod | grep uvcvideo. If nothing is listed, load it with sudo modprobe uvcvideo and check the log again.
- List video devices with v4l2-ctl --list-devices (from the v4l-utils package) or ls /dev/video*.
- Test outside your usual application with a simple viewer such as Cheese or guvcview, or run ffplay /dev/video0, adjusting the number to match your device.
- Check access with ls -l /dev/video0. Many desktop distributions grant the logged-in user access automatically. On other setups, the user may need to be a member of the video group.
If the camera works in a test viewer but not in a browser or video call app, the driver is not the problem. Check the selected camera inside that application, and check that the application or browser has camera permission. Also close other programs that might be using the device, because a camera is often available to only one program at a time. Running fuser /dev/video0 or lsof /dev/video* shows which process has the device open. Virtual camera software such as v4l2loopback adds extra video nodes, and an application may select one of those by mistake.
Resolution, frame rate and lighting
Run v4l2-ctl -d /dev/video0 --list-formats-ext to see which formats, resolutions and frame rates the camera reports. On USB 2.0 connections, high resolutions at high frame rates are often offered only in compressed MJPEG format. Uncompressed formats such as YUYV are usually limited to lower combinations. An application that requests an uncompressed format can therefore receive a lower resolution or frame rate than you expect.
Lighting also affects frame rate. Many webcams use automatic exposure, which can lengthen the exposure time in dim rooms and lower the delivered frame rate. Adding light to your face often helps more than changing any driver setting. Run v4l2-ctl -d /dev/video0 --list-ctrls to see the available controls. Control names and ranges vary between camera models and kernel versions.
Limits and related questions
Sometimes lsusb shows the camera, but no driver binds to it and no video node appears. In that case, search for the camera's USB ID together with your distribution name to find out whether the model is supported. A newer kernel may add support that your current kernel lacks. Be cautious with out-of-tree driver modules from unverified sources. Such modules must be rebuilt after kernel updates, and when Secure Boot enforces module signing, unsigned modules will not load.
Laptops with MIPI cameras are the most common case where installing extra software is actually necessary. Check your laptop vendor's and your distribution's hardware support notes. Even when support is installed, the camera may work only through libcamera or PipeWire. In that case it may not appear as a simple video node that every application can open.
The kernel driver only makes the camera available to applications. Whether an application records, stores or transmits video is a property of that application, not of the driver. Verify each application's behavior in its documentation and settings rather than assuming it.