Fix a Webcam Not Working on Linux
Check that the camera exists, then test it outside the browser. Most failures are a privacy switch, another app holding the camera, or a missing browser permission:
lsusb | grep -iE 'camera|webcam|video'
sudo apt install v4l-utils # dnf / pacman / zypper: v4l-utils
v4l2-ctl --list-devices
sudo fuser -v /dev/video*
No device at all on a 2022-or-newer Intel laptop? You probably have an IPU6 MIPI camera; jump to Intel IPU6 cameras.
Identify your case
| What you see | Most likely cause |
|---|---|
No camera in lsusb and no /dev/video* | Hardware kill switch, Fn key, BIOS setting, or an IPU6/MIPI camera |
/dev/video0 exists but apps show "No camera found" | Sandboxed app (snap/Flatpak) without permission, or app only uses PipeWire |
| Camera works in one app, "device busy" in another | Another process holds the camera |
| Black or green image | Wrong format/resolution, privacy shutter, or a raw MIPI node opened directly |
Many /dev/video nodes but no picture anywhere | IPU6 camera without libcamera support |
| Stopped working after an update | Kernel regression or a module that no longer loads |
Diagnose step by step
Step 1: Check physical switches and the BIOS
Many laptops have a sliding shutter, a camera key (often F8, F10 or a key with a crossed-out camera), or a BIOS option such as Camera: Disabled. On some models the hotkey removes the camera from the USB bus completely, so it looks exactly like a driver problem. Toggle the key, then run lsusb again.
Step 2: Is the camera detected?
lsusb
v4l2-ctl --list-devices
ls -l /dev/video*
Example output for a working USB camera:
Integrated Camera: Integrated C (usb-0000:00:14.0-8):
/dev/video0
/dev/video1
/dev/media0
Two nodes per camera is normal: one delivers the picture, the other carries metadata. If lsusb lists the camera but there is no /dev/video*, the driver did not bind. If you see a long list of nodes named Intel IPU6 ISYS Capture, you have a MIPI camera.
Step 3: Check the uvcvideo driver
Almost every USB webcam uses the generic UVC driver.
lsmod | grep uvcvideo
sudo dmesg | grep -iE 'uvc|video|camera' | tail -20
If the module is not loaded, load it and watch for errors:
sudo modprobe uvcvideo
sudo dmesg | tail
Messages like Failed to query (GET_DEF) UVC control are usually harmless. Failed to resubmit video URB or the camera repeatedly disconnecting points to USB power management or a bad cable. Disabling USB autosuspend for testing helps confirm that:
sudo modprobe -r uvcvideo
sudo modprobe uvcvideo
echo -1 | sudo tee /sys/module/usbcore/parameters/autosuspend
That setting lasts until reboot. If it fixes the problem, make it permanent with the usbcore.autosuspend=-1 kernel parameter.
Step 4: Test outside the browser
Use a simple local app to separate driver problems from application problems:
# GNOME's camera app (Snapshot) or any V4L2 viewer
snapshot
# or a raw test with ffmpeg / mpv
mpv av://v4l2:/dev/video0
ffplay /dev/video0
If the local app works, the driver is fine. If it says the device is busy, find the process holding it:
sudo fuser -v /dev/video*
Close that program (often a background video-call client or a browser tab). Supported formats and resolutions are listed by:
v4l2-ctl -d /dev/video0 --list-formats-ext
Step 5: Check permissions on the device
ls -l /dev/video0
getfacl /dev/video0
Example output:
crw-rw----+ 1 root video 81, 0 Oct 16 09:02 /dev/video0
# file: dev/video0
user::rw-
user:youss:rw-
group::rw-
The + and the user:youss:rw- line show that logind granted your logged-in session access. If your user is missing, you are probably connected over SSH or VNC, or another seat owns the device. As a workaround in those cases, add yourself to the video group and log in again:
sudo usermod -aG video $USER
Fix: black, green or distorted image
- Black image with a working light: a physical shutter is closed, or the app opened the metadata node instead of the capture node. Select the other
/dev/videodevice in the app. - Green or striped image: the app requests a pixel format the camera does not deliver correctly. Choose MJPEG instead of YUYV in the app, or test with
ffplay -f v4l2 -input_format mjpeg -video_size 1280x720 /dev/video0. - Very dark or overexposed: list and change camera controls with
v4l2-ctl -d /dev/video0 --list-ctrls, for examplev4l2-ctl -d /dev/video0 --set-ctrl=auto_exposure=3. Control names vary between cameras; GUI tools such asguvcviewor Cameractrls show them all. - Infrared camera instead of the normal one: laptops with Windows Hello have a second, infrared camera that shows a grey, grainy picture. Pick the other device in the app.
Fix: browser and sandboxed apps
Snap (Firefox and Chromium on Ubuntu)
snap connections firefox | grep camera
sudo snap connect firefox:camera
Then check the site permission in the address bar's lock icon.
Flatpak
Flatpak apps either use the PipeWire camera portal or need device access. Check what the app has, and grant device access for a single app if it does not support the portal:
flatpak info --show-permissions org.mozilla.firefox
flatpak override --user --device=all org.mozilla.firefox
Firefox and PipeWire cameras
Firefox can use cameras through PipeWire, which is required for IPU6 cameras. In about:config, set media.webrtc.camera.allow-pipewire to true and restart Firefox. Chromium-based browsers have a similar "PipeWire Camera support" flag in chrome://flags.
Video-call apps
Zoom, Teams (in the browser) and Slack each keep their own camera selection. If the camera works in Snapshot but a call shows the wrong camera or none, open the app's video settings and pick the device by name. Desktop clients installed as Flatpak need the same permissions as the browser above. If a call app grabs the camera and then crashes, the device can stay busy until you kill the leftover process found with fuser.
Fix: Intel IPU6 and MIPI cameras
Many Dell XPS, Lenovo ThinkPad X1, HP and other laptops with Intel 12th-generation (Alder Lake) and newer CPUs use MIPI cameras wired to the Image Processing Unit instead of USB. They do not appear in lsusb, and opening /dev/video* directly gives nothing usable, because the raw sensor data must be processed by software first.
Confirm you have one:
lspci | grep -iE 'ipu|imaging|multimedia'
sudo dmesg | grep -iE 'ipu6|ipu7|ov[0-9]+|hi556'
Support needs three pieces: the IPU6 input driver in the kernel (mainline since Linux 6.10, so current distro kernels have it), a driver for your specific sensor, and libcamera with its software image processing, exposed to apps through PipeWire.
# Ubuntu / Debian: libcamera tools and the PipeWire plugin
sudo apt install libcamera-tools libspa-0.2-libcamera
# Fedora
sudo dnf install libcamera-tools pipewire-plugin-libcamera
# Arch
sudo pacman -S libcamera libcamera-tools pipewire-libcamera
# list cameras libcamera can use
cam -l
If cam -l lists the sensor, use an app that talks to PipeWire (GNOME Snapshot, Firefox with the setting above, OBS with the PipeWire source). Image quality with the software ISP is usable but not as good as on Windows. Some Ubuntu OEM installs instead use Intel's proprietary camera HAL; on those, sudo ubuntu-drivers install may offer the matching packages.
Lunar Lake and later laptops use IPU7, whose support is still being merged. If your sensor is not detected even on the latest kernel, check your distro's bug tracker for your model before spending more time on it.
Distro notes
- Ubuntu 26.04 / 24.04: the snap browsers need the
camerainterface connected. Ubuntu has shipped IPU6 support for certified Dell and Lenovo models longest, so checkubuntu-drivers listfirst. - Fedora 44: has good libcamera and IPU6 support through the mainline driver and software ISP. Firefox from the Fedora repo is not sandboxed.
- Arch Linux: install
v4l-utilsfor diagnostics. AUR IPU6 packages from older guides are usually not needed on current kernels; try the mainline stack first. - Linux Mint: Firefox is a .deb, so there are no snap permissions. Mint 22.3 is based on Ubuntu 24.04; use the HWE kernel for newer laptops.
- openSUSE:
sudo zypper install v4l-utils libcamera-tools; Tumbleweed gets new kernel and libcamera releases first.
Last resort
- If the camera stopped working after a kernel update, boot the previous kernel from the GRUB menu. If that works, report the regression.
- If a third-party kernel module (for example a virtual camera such as
v4l2loopback) refuses to load with Secure Boot enabled, follow signing modules with MOK. - Try a live USB of the newest Fedora or Ubuntu. If the camera works there, update your kernel; if it does not, your hardware may not be supported yet.
- A cheap external USB webcam is a dependable fallback; any UVC camera works with no setup.
Microphone works but no sound in calls? That is a separate problem, see fixing no sound on Linux.
Frequently asked questions
How do I check if Linux detects my webcam?
Install v4l-utils and run v4l2-ctl --list-devices. A USB webcam should also appear in lsusb. If neither shows it, the camera is switched off, disabled in the BIOS, or it is a MIPI camera that needs a different stack.
Why does my new laptop's camera not work on Linux?
Many Intel laptops from 2022 onward use MIPI cameras connected to the Intel IPU6 (or IPU7) instead of USB. They need the IPU6 kernel driver plus libcamera, and apps must access them through PipeWire. Support depends on the sensor and on how recent your kernel and libcamera are.
Do I need to be in the video group to use the webcam?
Usually not. On systemd-based desktops the logged-in user gets access to /dev/video* automatically through ACLs. Adding yourself to video only matters for remote sessions or unusual setups.
The camera works in one app but not in the browser. Why?
Only one program can usually open a V4L2 camera at a time, and snap or Flatpak browsers need camera permission. Close other camera apps, then check snap connections firefox or the Flatpak permissions.
Spotted a mistake or a command that no longer works? Send a correction — pages are re-checked when reports come in.