Tìm theo phân loại

Fix lỗi thường gặp trên OpenWRT

  • Phan Nhan
  • đọc trong 5 phút
  • ngày 4 tháng 01 năm 2024
SHARE

Nếu các bạn chưa biết thì OpenWRT là hệ điều hành mã nguồn mở dựa trên Linux được thiết kế cho các thiết bị như router, switch, wifi access point, ... Nhờ việc là mã nguồn mở mà có rất nhiều add-on được viết cho OpenWRT để chạy thêm nhiều tính năng của Linux như Docker, KVM-Qemu, VLAN, proxy, ...

Do được viết dựa trên core musl của Linux nên sẽ có nhiều thành phần bị cắt giảm tối đa với mục đích đủ duong lượng trên các thiết bị cấu hình thấp, sẽ có một vài lỗi vặt xảy ra hoặc do không tương thích. Trong bài viết này mình sẽ tổng hợp một vài lỗi mà mình gặp phải trên thiết bị của mình nhé.

Thiết bị

Hiện tại thì mình đang sử dụng máy tính mini dùng chip Intel Celeron J4125, máy có 4 cổng mạng 2.5G dựa trên chịp Realtek RTL8125B. Bạn có thể xem review sơ qua của mình ở đây.

Bản OpenWRT của mình là do các pháp sư trung hoa build dựa trên OpenWRT 21 mới nhất.



Docker

Dù mình đã sửa file /etc/docker/daemon.json để chuyển data của Docker sang phân vùng mới, thì khi tải image về, docker vẫn tải về phân vùng hệ thống (200MB) nên báo lỗi hết ổ cứng. Để Fix thì mọi người dùng symlink link cái folder tạm của docker sang phân vùng mới là được. ln -s /mount/cua/phan/vung/moi/docker_temp /var/lib/docker

Samba

Nếu gặp vấn đề với samba4 ko kết nối được, thì vào system -> startup để disable vào stop server ksmbd, sau đó restart service samba4.

Crontab

Crontab của openwrt khá ngu, dùng @hourly @daily không chạy được đâu, mọi người dùng kiểu cũ nhé: 0 * * * *

DNS

Khi trỏ domain vào đây thì mọi người nhớ chỉnh cả A record vào ipv4, AAAA record vào ipv6, sau đó vào Network -> DHCP & DDNS để whitelist domain đó hoặc tắt hẳn Rebind protection đi, như thế các thiết bị trong LAN sẽ vào được domain như bình thường.

Grub

Grub có mội lỗi nếu cắm USB hoặc SSD thứ 2 thì ko boot được, mọi người tạm tháo usb ra để vào, sau đó sửa file /boot/grub/grub.cfg. Sửa set root='(hd0,gpt1)' thành set root='(hd1,gpt1)' rồi cắm usb/ssd vào reboot bình thường.

KVM/qEMU

OpenWRT không chỉ cho cài container trên Docker, mà còn có thể chạy máy ảo KVM/qEMU luôn, passthrough usb, ssd, gpu bình thường.

Đầu tiên bạn cần cài đặt các gói tin cần thiết sau:

opkg install kmod-tun qemu-bridge-helper qemu-x86_64-softmmu kmod-kvm-intel

Tạo 1 ổ cứng cho máy ảo, ở đây mình tạo 8Gb làm ví dụ:

qemu-img create -f qcow2 debian.qcow2 8G

Chạy thử máy ảo với file cài iso:

qemu-system-x86_64 -m 512 -nic user -boot d -cdrom ./iso/debian-11.1.0-amd64-netinst.iso -hda debian.qcow2

Để có thể dùng VNC lúc cài đặt, bạn cần mở port đên OpenWRT từ máy tính của bạn, ví dụ OpenWRT mình chạy ở 192.168.2.1 thì mình sẽ gõ lệnh này từ máy tính, sau đó dùng VNC đến localhost:5900

ssh -nfNT -L 5900:127.0.0.1:5901 [email protected]

Sau khi cài đặt xong, nếu bạn muốn giữ MAC address không bị đổi thì dùng lệnh này:

qemu-system-x86_64 -boot d -smp 2 -m 1G -enable-kvm \
	-cdrom ./iso/debian-11.1.0-amd64-netinst.iso \
	-hda debian.qcow2 \
	-device virtio-net-pci,mac=aa:88:04:fd:20:ba,netdev=br0 \
  -netdev bridge,br=br-lan,id=br0

Nếu bạn muốn máy ảo khởi động cùng máy như một service của OpenWRT, bạn cần tạo file service cho thiết bị. Ví dụ ở đây mình đặt tên service là qemu chẳng hạn.

nano /etc/init.d/qemu

Điền vào file như sau:

#!/bin/sh /etc/rc.common
 
START=99
STOP=1
 
qemu_pidfile="/var/run/qemu-debian.pid"
 
start() {
qemu-system-x86_64 -enable-kvm -cpu host -smp 2 -m 1G \
	-hda /nas/VM/debian.qcow2 \
	-device virtio-net-pci,mac=aa:88:04:fd:20:ba,netdev=br0 \
	-netdev bridge,br=br-lan,id=br0 \
	-qmp tcp:127.0.0.1:4444,server,nowait \
	-daemonize &> /var/log/qemu-debian.log
 
/usr/bin/pgrep qemu-system-x86_64 > $qemu_pidfile
echo "QEMU: Started VM with PID $(cat $qemu_pidfile)."
}
 
stop() {
echo "QEMU: Sending 'system_powerdown' to VM with PID $(cat $qemu_pidfile)."
nc localhost 4444 <<QMP 
{ "execute": "qmp_capabilities" } 
{ "execute": "system_powerdown" } 
QMP

if [ -e $qemu_pidfile ]; then
	if [ -e /proc/$(cat $qemu_pidfile) ]; then
		echo "QEMU: Waiting for VM shutdown."
		while [ -e /proc/$(cat $qemu_pidfile) ]; do sleep 1s; done
		echo "QEMU: VM Process $(cat $qemu_pidfile) finished."
	else
		echo "QEMU: Error: No VM with PID $(cat $qemu_pidfile) running."
	fi
 
	rm -f $qemu_pidfile
else
	echo "QEMU: Error: $qemu_pidfile doesn't exist."
fi
}
chmod +x /etc/init.d/qemu

Chú ý nếu bạn có nhiều VM cùng chạy thì nhớ đổi port 4444 thành các port khác nhau cho mỗi VM.

Giờ chỉ cần lưu lại là bạn có thể điều khiển trong System => Startup trên Website của OpenWRT.