ESP32开发板一次故障解决
之前用来测试板子好坏的一个helloworld代码刷不上去了,提示“A fatal error occurred: MD5 of file does not match data in flash!”的错误,错误如下图:
网上有说需要做修复的,也有说不好用的。后来发现,这是一块做成arduino形状的开发板,上面有一个扩展盾板,把这个盾板拿掉,就一起恢复正常了,看来以后刷机得先去掉盾板了。
之前用来测试板子好坏的一个helloworld代码刷不上去了,提示“A fatal error occurred: MD5 of file does not match data in flash!”的错误,错误如下图:
网上有说需要做修复的,也有说不好用的。后来发现,这是一块做成arduino形状的开发板,上面有一个扩展盾板,把这个盾板拿掉,就一起恢复正常了,看来以后刷机得先去掉盾板了。
这两天在看matplotlib的文档,发现在文档中最简单的显示其版本的基本例子都不跑不通,显示如下错误:
ModuleNotFoundError: No module named ‘matplotlib.pyplot’; ‘matplotlib’ is not a package
我开始以为是python3.10导致不兼容,后来又换了3.9还是一样的问题。切换了几次都是一样的不行,后来发现例子和显示版本的错误信息不一样,于是用两个错误信息去搜索,终于找到这个兄弟的blog:https://blog.csdn.net/wwangfabei1989/article/details/79082110,根据其描述,错误原因是因为python脚本的名字是matplotlib.py,导致引用包的时候找不到相应名字的包,按照其描述修改文件名字问题得到解决。
从这可以看到,python的模块名和包名还是很容易混淆的。
引用1:https://gist.github.com/XSystem252/d274cd0af836a72ff42d590d59647928
引用2:https://archlinuxarm.org/forum/viewtopic.php?t=14672#p64313
应用1是一个大神做的笔记,应用2是ArchLinuxARM2020年底时候对于USB硬盘启动做的讨论,这个帖子在ArchLinuxARM论坛被置顶了。应用1整理了引用2 中关于USB硬盘启动的方法外,还在USB硬盘上使用btrfs文件系统,还做了全盘加密。我这里没有这么多的需求,所以对原文做了一个简化。
另外因为我的树莓派4B是2019年买的,也就是说其eeprom比较早,需要升级,我也把怎么更新这部分内容,做了描述。
大约在2019年12月份的时候,搞过一次使用usb硬盘做roofs,原理比较简单,就是从tf卡的vfat分区启动,然后挂载usb硬盘的分区作为rootfs,然后配置cmdline.txt文件就好了。
但是最近这个树莓派滚挂了,原因也很简单,当时使用的是三方LTS的aarch64的内容,后来ArchLinuxARM接管了这个内核,再后来ArchLinuxARM牛B大了,不用LTS的内容,开始为树莓派4B提供与ArchLinux相同的滚动最新内核,并且在树莓派4B的bootloader与内核之间加了一层uboot,然后我的这个树莓派4b就滚挂了。
今天某东新买的tf读卡器到了,就花了一下午的时间把这个研究了一下,终于搞定记录一下。
树莓派4B最新的eeprom更新了bootloader,可以通过raspi-config来做启动顺序的设定。可以设定tf卡启动失败,再使用usb硬盘启动,也可以设定usb硬盘启动失败,再使用tf卡启动。这样一来,我们就可以直接从USB硬盘启动,不再像我2019年时候还是用tf卡的vfat分区做启动。
另外,今天发现最新ArchLinuxARM在启动的时候没法挂载usb硬盘,但是启动以后可以挂载,这样就需要定制一下内核的img,保证在内核加载的时候,相应usb的驱动能被加载。
在开始前,我们需要准备一张tf卡,这个卡要先用来升级树莓派4B,后面再用来定制ArchLinuxARM。
我准备直接用2019年时候的那个tf卡,这个卡是16G。我先在我的manjaro xfce里面安装了一个叫rpi-imager的包,他是树莓派基金会官方出的tf卡制作工具的linux版,现在这个工具很牛B了,除了可以刷Raspberry Pi OS(Raspbian),还能直接刷manjaro arm和libreelec。在这个tf卡上刷一个Raspberry Pi OS Lite版,因为我们不需要桌面环境,ssh远程访问就好了。
制作好tf卡以后,加载vfat分区,在里面的根目录下创建一个名为ssh的空文件。linux下可以用下面的命令快速创建。
touch ssh
将tf卡插回树莓派4b,然后加电启动。在路由器找一个名叫raspberrypi的主机的IP,然后使用如下命令远程登录,默认密码是raspberry。
ssh pi@192.168.1.xxx
登录后按顺序执行下面的三行命令
sudo apt update sudo apt full-upgrade sudo rpi-eeprom-update -d -a
这三行命令的第一行是更新本地安装包数据库,第二句是根据最新的本地安装包数据库,更新所有的安装包。我执行完这两行以后,第三行已经不用执行了,从显示的信息看,已经从2019年而eeprom更新到了2021年4月份的版本了。这个2021四月份的版本是稳定版本,如果想换成其他正式发布的版本,好像还可以更新到最新的2021年11月版本。但这与我的目标没有关系了,我也就没有往下升级。
这时树莓派4B的eeprom更新就已经搞完了。我们使用halt命令关机,当树莓派4B的电源灯灭掉的时候,我们先断电,再拔出tf。
我们把tf通过读卡器接回manjaro,现在我们可以针对这两个卡进行操作了。因为之前的创建Raspberry Pi OS的时候,tf上面已经有两个分区了,我们现在跳过分区的步骤,开始重新格式化这两个分区。重新格式化vfat是因为ArchLinuxARM使用了uboot,重新格式化ext4是因为ArchLinuxARM的根文件系统与Raspberry Pi OS完全不同。
sudo mkfs.vfat /dev/sdc1 sudo mkfs.ext4 /dev/sdc2 mkdir boot mkdir root sudo mount /dev/sdc1 boot sudo mount /dev/sdc2 root sudo bsdtar -xpf ArchLinuxARM-2021.11-rpi-aarch64-rootfs.tar.gz -C root sudo mv root/boot/* boot sudo sed -i 's/mmcblk0/mmcblk1/g' root/etc/fstab sudo umount boot root
最后一行是因为我们安装的是aarch64版本,这个版本貌似mmcblk不是从0开始排的,是从1开始排的。如果是armv7版本的话,是不需要这一行的。使用aarch64版本的好处就是速度快,很多64位的软件可以用,但是坏处是发热量大,我树莓派4B上就安装了一个大散热片。
这样我们就完成了tf的准备,这时可以拔出读卡器,将tf插回树莓派4B。加电前,需要先把USB线断开,这是因为默认的内核img里面usb的驱动,启动时连接USB,在启动以后看不到usb,反而是启动完成再连接usb线能看到usb设备。
我的usb设备不是普通的usb硬盘,而是针对树莓派4b设计的同伴科技的x825笔记本硬盘扩展板,我在上面加了一个本子上拆下来而1T本盘。同伴科技还出来其他的usb硬盘扩展板,你可直接使用m2的ssd,或者3.5寸的台式机硬盘,甚至还能接两个硬盘。
安装准备
在树莓派4b启动以后,我们再去路由上找一个名叫alarm设备的IP。我们使用下面的命令登录。
ssh alarm@192.168.1.xxx
下面我们开始准备向USB硬盘上写的系统:
重启后我仍然用ssh登录在切到root帐号。
后续的设置,已经和普通的Archlinux没有什么区别了,设置一下ntp自动更新时间,设置一下当前的时区,设置一下locale,设置一下hostname等等。当然为了winbios名字解析,也可以安装一个samba。
年初买了一本书《直播系统开发:基于Nginx与Nginx-rtmp-module》,最近翻出来研究一下。
这本书里面的nginx和nginx-rtmp-module都是从头编译,不符合Arch人的逻辑,所以按照书里的思路,再Archlinux上重新搞一下。另外,研究了一下怎么从摄像头提取视频和音频。
首先是nginx的安装了配置。直接使用pacman –S nginx来安装nginx,然后用aur安装nginx-mod-rtmp。安装完成以后,需要编辑/etc/nginx/nginx.conf,在其第一行加入
load_module "/usr/lib/nginx/modules/ngx_rtmp_module.so";
然后加入在http段前面加入
rtmp { access_log off; server { listen 1935; application mylive { live on; } } }
然后重启nginx。
这里面和书中的配置文件,主要不同在加了access_log off。我怀疑nginx-mod-rtmp的PKGBUILD文件关于access_log的默认配置有问题,导致不明确配置access_log的时候,会报/etc/nginx目录下没有权限生成access_log文件,并启动失败。好在我是在测试,直接关闭access_log就好了。这时nginx端就准备好了。
下面首先要下载一个windows下的ffmpeg的二进制包,然后先用下面命令获取ffmpeg可用的摄像头设备名称。
ffmpeg -list_devices true -f dshow -i dummy
然后会出现如下图的内容。途中上面的红框里面是摄像头的内设备名称,下面是音频输入设备名称。这两个名称可以直接使用。
获取两个设备名以后,再用如下命令启动视频流上传:
ffmpeg -f dshow -i video="Integrated Camera" -f dshow -i audio="麦克风阵列 (Conexant SmartAudio HD)" -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://nginx:1935/mylive/6
这里面nginx是我的虚机的名字,如果你没有配置winbind的话,可以改用ip。如果你设备名称不一样,可以自己替换。成功后,会看到PC上摄像头的工作灯点亮,命令行中中一直有信息更新。
然后打开VLC,如下图中,选择菜单中的“媒体->打开网络串流”。
在弹出的对话框中,填入刚才ffmpeg发送视频流的url。
VLC中大约会延迟3到5秒,等几秒以后,VLC就会开始工作。下图是我同事围观的时候,拍了一张照片。
和书中的例子相比,花了一下午的时间,才搞定。第一个坑是,网上很多人都是把mod-rtmp和nginx编译到一起了,找了半天才找到nginx怎么加载so形式的mod。第二个坑是上面access_log的问题。第三个坑是原书例子是使用的是一个flv文件,为了找flv视频,我找了好一会,后来又研究怎么抓本机的摄像头。
就这么多,希望对看到的朋友有帮助。
其实还有第四个坑,刚发布的时候,发现搬家以后的blog无法上传图片了,由搞了半天
最近在折腾dotnet 6的webapi,结果发现tinyint(1)在从数据库表创建数据对象实体的时候,没有被转换成Bool类型。百度没找到答案,在github的问题清单里面有人提到过这个问题,发现这个问题好像和MySqlConnector有关。
解决方案出人意料,在数据库连接字符串里面,加上“TreatTinyAsBoolean=true”就好了。主要有两个场景,一个是从表创建对象实体时命令行的连接字符串,一个是创建好实体以后的数据库连接字符串。
原文推荐使用Dockers镜像,但是我觉得没意思,于是在虚机里面找了一个干净的Archlinux来搞,需要提前给arch里面安装:base-devel,python,python-pip,cython,wget,libglvnd。
在第2步安装PaddlePaddle的时候,如果提示版本找不到的话,可以考虑去掉版本,安装最新版。
在第3步从github获取PaddleOCR的代码,在github连不上的时候,可以改用gitee,延迟几天无所谓,反正同步过来的应该都是可用版。
在第4步安装requirements.txt的时候,建议加上 -i https://mirror.baidu.com/pypi/simple 。百度的这个pypi的镜像网站,比清华的那个快,而且稳定。另外,建议加上环境变量MAKEFLAGS开启make的多job支持,在安装scikit-image的时候,还需要编译一些内容,不开多job支持,还是挺慢的。
使用快速使用文档中的命令行,测试通过。
最近把蜗牛星际矿渣不知道为啥不知道同时4块12T,于是把系统换成了OMV5,但是用脚本装完了omv5-extras插件以后,系统信息->性能统计 里面的图片全成空的了。由于OMV用的少,5的资料也少,不知道从什么地方下手解决。
最近没事就搜一搜,查一下,最后在omv-extras的github的问题反馈里看到有人也反应这个问题。按照其中的解决办法,能解决问题。看描述应该omv-extras的安装脚本关闭了collectd服务,解决办法也简单,用systemctl打开并启动collectd服务就好了
关了内核的audit信息,还是有电压之类的信息在不停的输出,找了raspberry pi官方的文档,说修改config.txt文件的告警级别,但是实测不太管用,于是准备彻底关闭内核信息的输出。
查了一下,把cmdline.txt里面的console=tty1删掉了,内核信息就不输出控制台了。如果想看,可以保留输出到串口,连接串口查看。
以前没研究linux写屏,这些输出还无所谓,最近决定研究一下怎么关闭这个输出。
alarm的论坛有人回复了两种方法,一种直接关掉audit,一直是关掉输出。
关掉audit可以在/boot/cmdline.txt最后面加audit=0
关掉输出可以systemctl mask systemd-journald-audit.socket
2010年,在香港租了个虚拟主机,装上了wordpress,把blog从blogengine.net上迁了过来,之前是朋友托管的windows服务器。但是他生意黄摊了,我也得把blog挪出来。再早一年之前,blog是在自己家的windows sharepoint上面。再往前,blog还能追溯到aspcool的服务器,但是这已经是20年以前了。aspcool的站长现在在做比特币算力出租。
兜兜转转,看看服务器上的第一篇,居然是盼着在freebsd上跑mono,那时候dotnet还遥遥领先java,结果20年后这个目标还没有实现。看来这个是真的有点难。
这篇算是新服务器的hello world
最早以前用gitlab,但是太耗资源了。换了gogs,发现总不更新。最后换了gitea。
之前放在托管服务器上的是使用docker部署的gitea 1.6.1版,好长时间没升级了,这次升级了一下,升级到了当前最新的1.12.3版。
按照gitea官方文档,原来的docker容器删掉换新的docker容器就好了,但是前提是容器的/data必须映射到了宿主。也就是说,docker容器删掉,数据不会丢失。
我升级的时候也没有一步到位,先是升级到1.8.3,再升级到1.12.3。避免跨度太大,扯到……docker。
现在升级完看上去都正常。另外,升级前记得备份映射到宿主的/data。
办公室的网络需要授权才能访问互联网,server有不需要授权的网段,但是archlinux的iso启动的时候默认是dhcp获取的ip,这就需要将ip改为不需要授权的网段。研究了archlinux的wiki,找到了修改方法。
archlinux的iso是用的是systemd-networkd这个服务来设置iso启动的网络设置,这就需要修改/etc/systemd/network/20-ethernet.network。
首先,去掉DHCP相关设置:删除[DHCP]段,删除[Network]的DHCP=yes
然后,加静态IP设置,在[Network]段加上:
Address=192.168.1.2/24
Gateway=192.168.1.1
DNS=114.114.114.114
最后,用systemctl restart systemd-networkd重启网络服务。
前两天安装的transmission服务,下载的内容只能通过sftp拿回来。后来发现sftp服务传输效率不高,在需要安全的情景下也还能忍,但是在家里内网的情况下,千兆带宽只跑20%,cpu负载就满了,还是专门配置一个明文的ftp好。
网上看了一下,vsftpd用的最多,而且看archlinux的wiki,这个貌似也是最简单。我就选这个了。其实我要求不高,不用开匿名,不用单独账号列表,使用系统账号就好,能把下载的内容删除,这么多就好。过程如下:
1. pacman –S vsftpd
2.编辑/etc/vsftpd.conf
3.去掉write_enable=YES前面的注释
4.去掉local_enable=YES前面的注释
5.使用systemctl启用并启动vsftpd
这就可以打完收工了。
现在Linux主机的最佳实践是硬件时钟设置为UTC时间,然后设置自己的时区。但是如果是一台之前没有安装过Linux的主机,就会有一个问题,怎么精确设定时间。当然,如果联网的条件下,NTP是最简单的办法。以前这么做都是通过ntpd包带的ntpclient来实现。现在多了一个选择:systemd-timesyncd。
启用过程很简单,现在修改/etc/systemd/timesyncd.conf,去掉NTP=前面的注释,然后在后面填上time.windows.com这个服务器。然后使用timedatectl set-ntp true起作用这个服务。
之后可以用timedatectl status开查看当前系统的时间状况。也可以用timedatectl timesync-status来查看时间同步的情况。
Transmission的RPC接口很好用,Transmission-Remote-GUI就是玩pt的利器,但是RPC验证不开启的话,会有一些诡异的行为没有文档描述。比如:
以上行为在Transmission 3.0和TRGUI的5.18上会出现。
前两天终于咬牙跺脚收了同伴科技的X825,这是因为树莓派4终于支持了USB3.0,能基本把硬盘的性能跑出来了。顺便研究了一下,现在树莓派4上面的64位Linux,基本上可以确定现在树莓派4可以当做小型服务器来耍了。
首先,树莓派4是aarch64架构的arm处理器,4G内存,千兆网络,USB3.0接口,基本可用了。其次,Docker Hub上的服务器应用也开始支持aarch64了,甚至像mariadb、mongodb和openjdk的docker官方镜像只支持arm的aarch64架构。
网上查了一段时间,对比了树莓派爱好者基地的64位debian和第三方出的64为archlinuxarm,觉得还是喜欢archlinux,于是写写怎么在树莓派4上跑64位的archlinuxarm。
感觉archlinuxarm网站论坛里面的讨论,找到了一个三方出的树莓派4的64为archlinuxarm的rootfs,地址是https://olegtown.pw/Public/ArchLinuxArm/RPi4/rootfs/ ,挑一个最新的,按照archlinuxarm官方树莓派4的安装教程 https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-4#installation 来安装就好了。安装好以后,连接有线网络,可以在路由器的dhcp设备列表里面找到设备的ip,这时候远程登录就好了。
安装好以后需要做一些官方教程里面没有的额外设置,首先要用nano来编辑/etc/resolv.conf,添加一行nameserver 8.8.8.8。这是因为这个rootfs没有安装vi包,其次没有设置dns服务器。如果我们需要改成静态ip,需要修改/etc/systemd/network/eth.network。
如果需要使用netbios访问树莓派4,可以参考我之前写的http://just4fun.cn/?p=1017
如果需要使用文件做交换内存,可以参考我之前写的http://just4fun.cn/?p=972
这个时候可以开始配置X825上面的硬盘作为rootfs。我是专门从狗东买了一个容量最小的tf卡,按照前面的介绍安装好archlinuxarm,分区并格式化/dev/sda1,然后直接修改/boot/cmdlin.txt就好了。但是在树莓派爱好者基地的64位debian貌似这么做不好用,可能是因为它用了树莓派上面UFEI导致的,没有深入研究。
硬盘接好启动以后,用fdisk先给硬盘创建一个分区,把格式化好ext4的分区mount在/mnt/newdrive,然后执行命令rsync -avx / /media/newdrive把tf卡的rootfs同步到硬盘上。这个步骤在树莓派爱好者基地的64位debian上也不好用。之后修改cmdline就好了。
重启之后,使用df -h看看根fs是不是挂在sda1上。
另,这个三方的roofs可以用pacman更新archlinuxarm官方的aarch64软件包,但是因为官方没有aarch64的树莓派内核,所以需要自己从https://olegtown.pw/Public/ArchLinuxArm/RPi4/kernel/ 和https://olegtown.pw/Public/ArchLinuxArm/RPi4/firmware/ 下载最新的内核和firmware。此外这个网站还提供了5.4的内核,但是因为树莓派官方的内核只有4.19的代码,所以我没敢尝试。
按照Archlinux的新闻稿,在2019年10月6日更新了Base安装包组,这里面只留下了必要的软件包,https://www.archlinux.org/news/base-group-replaced-by-mandatory-base-package-manual-intervention-required/
但是根据我的试验,不只其新闻稿中说的kernel、kernel-firmware和editor被移走,netctl、dhcpcd也被挪走了。而wiki的Install Guide却没有提及,这导致在安装完成后,实际是没有办法连接网络的,或者我不知道怎么连接网络了。经过试验需要把如下的安装根文件系统的语句
pacstrap /mnt base
替换为
pacstrap /mnt base linux linux-firmware netctl dhcpcd vi
其目的是补全base中移走的内容,保证安装完毕重启以后,系统能连接网络,继续后面的软件包的安装。
这个需求的背景是,博主使用树莓派作为开发服务器,使用windows环境内做客户端完成开发。树莓派在连接不同的网络的时候,动态获取的IP每一次都变化,在代码中动态调整比较烦人。如果能支持NetBIOS的话,那么就可以直接通过主机名,在不同的网络环境中都使用名字来访问树莓派。
一般的Linux的桌面环境这么做都不存在什么问题,但是像ArchLinux这样的极简系统就需要自己配置NetBIOS服务在局域网内广播主机名。一般Linux环境都有现成的Samba可用,而Samba服务端就内置了NetBIOS/WINS服务端,这样我们安装好Samba,启动相应服务就好了。
在ArchLinux当中,可以通过如下步骤解决:
1.安装Samba包
pacman –S samba
2.从https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD获取最新版的smb.conf放在/etc/samba目录下。
3.启动winbind服务
systemctl enable winbind
systemctl enable nmb
这样,即使不启用Samba服务,我们先在也可以使用NetBIOS和WINS协议找到这个树莓派了。这个办法在Archlinux的PC和树莓派上都适用。
最近因为收了两个星级蜗牛的小NAS机器,计划一个上开源的NAS系统,一个上黑QNAP体会一下NAS+HTPC,所以对开源的NAS系统做了一个对比评测。
先后在vbox里面安装了,FreeNAS,OMV,Openfiler,RockStor,EasyNas,还有国产的U-NAS:
1.FreeNAS是基于FreeBSD,内部界面最酷,支持中文,但是内部功能也相对高冷。貌似没有插件系统。
2.OMV是基于Debian的系统,功能基本全面,插件也足够丰富,最不满意的是没有内置文件浏览器,这个稍有点尴尬。
3.Openfiler是基于rPath这样一个Linux系统,功能和FreeNAS差不多。
4.RockStor是貌似基于CentOS,没有中文界面,只有最近本的功能。
5.EasyNas是基于OpenSUSE,也是没有中文界面,只有最基本的功能。
6.U-NAS比较惊艳,基于Debian,3.16的Linux内核,界面也是Synology和QNAP模仿桌面的界面,和类似App商店的插件安装模式,难得的是还有开源的Web上Office、Note的插件,Transmissions也定制过,更好支持多用户,而且页面也集成了transmission-web-ui,使用上舒服不少。
因为家里Synology已经有了一个ds-716,一个ds-216,所以Synology已经用的比较熟悉了。所以又在小NAS机器上跑了一个黑QNAP,感受了一下。
综合排名,从好用程度来讲,Synology适合普通家用和SOHO一族。QNAP对应功能也都有,但是感觉比Synology差一些,但是HTPC功能还是不错,但是推荐不用内置的HD_Player,直接用KODI。字幕和解码都比小米盒子之类要强大。小米盒子使用usb 3.0的有线网卡以后,相对QNAP的HTPC功能来讲,主要还是差在字幕和解码上,当然也可能找到更好的安卓App换到小米盒子上。
开源的NAS系统还是OMV更好,可以自己装X来跑KODI,单纯对比功能已经基本上和商业产品差不多了,但是界面有点丑。U-NAS界面和功能都不必OMV差,但是暂时还没有文档描述怎么上KODI,但是因为其基于Debian,估计也能上。其他那几个开源的NAS,我觉得还是算了。
首先使用wifi-menu连接过一些wifi,这样在/etc/netctl下会有一些链接文件。然后安装wpa-actiond包,再开启netctl-auto@wlan0服务。
1. pacman –S wpa-actiond
2.systemctl enable netctl-auto@wlan0
这样重启以后,就会从已有的连接文件中,选取信号最强的那个wifi自动连接。
近期评论