分类: RaspBerry Pi 相关

  • 为DietPi系统设置网卡优先级

    为DietPi系统设置网卡优先级

    当你的设备同时带有WiFi和有线网时,你就会希望让系统优先使用有线网,一些系统(比如使用NetworkManager的)会自动完成这件事,但DietPi并没有。

    各种Linux的网络配置方案会各不相同,比如桌面Linux和新一些的服务器Linux会使用较为现代的NetworkManager,Ubuntu搞过一个netplan,树莓派官方系统Raspbian直接用dhcpcd来管理网络,而DietPi使用Debian传统的/etc/network/interface(ifupdown),这篇文章的方法也适用于其他使用/etc/network/interface配置方案的系统。

    首先编辑/etc/network/interface,为接口设置metric值,格式类似metric 100,数字越小表示表示优先级越高,DietPi中修改完类似如下(注意该文件在dietpi-config中调整网络接口设置后会被覆盖):

    root@DietPi:~# cat /etc/network/interfaces
    # Location: /etc/network/interfaces
    # Please modify network settings via: dietpi-config
    # Or create your own drop-ins in: /etc/network/interfaces.d/
    
    # Drop-in configs
    source interfaces.d/*
    
    # Ethernet
    allow-hotplug eth0
    iface eth0 inet dhcp
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1
    #dns-nameservers 192.168.10.2
    metric 100
    
    # WiFi
    allow-hotplug wlan0
    iface wlan0 inet dhcp
    address 192.168.0.100
    netmask 255.255.255.0
    gateway 192.168.0.1
    #dns-nameservers 192.168.10.2
    pre-up iw dev wlan0 set power_save off
    post-down iw dev wlan0 set power_save on
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    metric 600

    此外,经过测试,这里的metric值不会对本地网络路由中的metric生效(下面的后两行),导致在访问内网机器时,(甚至是ssh 内网ip时的回程),仍然可能使用错误的网卡:

    root@DietPi:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         openwrt         0.0.0.0         UG    100    0        0 eth0
    default         openwrt         0.0.0.0         UG    600    0        0 wlan0
    192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
    192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 wlan0

    解决方法是安装ifmetric软件包,但我们不需要用这个命令其手动设置metric,而是ifmetric会在接口启动时自动根据/etc/network/interface中的配置进行设置(软件包提供了/etc/network/if-up.d/ifmetric)。

    随后重启网络服务,可以发现metric被正确设置了:

    root@DietPi:~# route
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         openwrt         0.0.0.0         UG    100    0        0 eth0
    default         openwrt         0.0.0.0         UG    600    0        0 wlan0
    192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
    192.168.10.0    0.0.0.0         255.255.255.0   U     600    0        0 wlan0
  • 适合树莓派/SBC的MLC长寿命sd卡?SanDisk Max Endurance 32G tf卡简单测试

    适合树莓派/SBC的MLC长寿命sd卡?SanDisk Max Endurance 32G tf卡简单测试

    时效性提醒:本文首次编写发布于3 年前。

    自从读研之后好久没更新了,正巧前几天树莓派上用的tf卡(micro SD card)又双叒叕挂了一张,启动后出现写I/O错误,文件系统变为只读(fsck没有效果),这次挂的还是Kingston CANVAS Go! Plus,这卡指标有V30 A2,也不算便宜货了,但还是挂的很突然。

    普通的tf卡本就是用分级最差的一档NAND颗粒制作的,据一些资料说目前流行的tf卡采用的都是QLC模式,毫无疑问寿命很差。同时,市场上也有一些长寿命(Endurance)类型的tf卡,但其中一些仅仅是换个名字,寿命没有本质区别,比如之前买过的banq high endurance系列,同样挂了一两个,而且是突然不认盘的那种。

    不过这次测试的SanDisk Max Endurance系列似乎是更靠谱些的,其给出了在行车记录仪场景下的寿命内可录制时间,写入标准为26Mbps,即3.25MB/s速度写入。32G版本的寿命为15000小时(其他版本根据容量成比例),换算成P/E和TBW如下:

    P/E = 3.25/1024*15000*3600/32 = 5355.8349609375 (cycle)

    TBW = 3.25/1024/1024*15000*3600 = 167.3698425293 (TB)

    可以说达到了TLC企业级固态和一些MLC固态的水平,另外根据外网的逆向工程(链接:https://ripitapart.com/2020/07/16/reverse-engineering-and-analysis-of-sandisk-high-endurance-microsdxc-card/),这个tf卡使用了3D TLC NAND,并工作在MLC模式下(pMLC)。

    类似的产品还有Samsung PRO Endurance,32G版本的寿命为17520小时,还要更长些,但在64G及以下的版本写入速度不佳,不足30MB/s,32G版本的性价比也不高,因此没有选择。如果需要128G或以上容量可以考虑这个。

    同时SanDisk还有一个SanDisk High Endurance的系列,略微便宜,但寿命低很多,32G版本的寿命仅为2500小时,虽然应该也比普通tf卡高不少了,但不如MAX系列一步到位。

    下面简单在树莓派4B上测试一下性能,这张卡标称读100MB/s,写40MB/s,不过在树莓派上受硬件限制,任何tf卡的连续读的上限都只有30MB/s左右(树莓派4B),也是正常现象了,测试是Raspbian自带的sdcard 测试项目,结果如下:

    顺序读4k随机读4k随机写
    30.354 MB/s2461 IOPS911 IOPS

    可以看到,它的随机性能可以达到A1标准,但离A2标准还比较远(卡本身没有给出随机性能的指标),但也可能是树莓派硬件限制了。

    这个性能在树莓派上是能达到这个项目的“通过”标准的(10M/1500/500IOPS),由于其吊打普通tf卡的长寿命的优点,我认为这是最适合树莓派或者其他SBC的tf卡类型,说不定卡都能把板子送走。当然代价则是同等容量下相对便宜tf卡近4倍的价格。

  • 树莓派设置共享有线网络(软路由,NAT)

    时效性提醒:本文首次编写发布于10 年前。

    树莓派一直插着一个小无线网卡用,有线网口也就空了出来,正好树莓派附近有一台台式机,离路由器比较远,故用树莓派设置有线网络共享,也就是在树莓派上设置一个软路由,使那台电脑可以用网线接到树莓派上,然后通过树莓派的无线网卡上网。

     

    因为我把树莓派的图形界面咔嚓掉了,所以一下操作都使用纯命令的方式操作。由于只是使电脑能上网就可以了,所以我简单粗暴的直接都用静态ip。

    首先,先给树莓派的有线网卡设置一个ip,这个随便,只要是私有地址而且跟已有地址不冲突就可以了。我用了10.2.3.0/24这个网段。并把树莓派设置为10.2.3.1,树莓派在这个网段中作为网关。

    树莓派上执行:

    sudo ifconfig eth0 10.2.3.1 netmask 255.255.255.0

    然后在那台电脑上设置,电脑的ip为10.2.3.100,并把网关设置为树莓派的ip。(我的那台电脑也是linux)

    电脑上执行:

    sudo ifconfig etho 10.2.3.100 netmask 255.255.255.0
    sudo route add -net default netmask 255.255.255.0 gw 10.2.3.1

    这样,一个小小的局域网就建立了,但此时电脑仅能在这个小局域网里玩,要想访问外网,还需用在树莓派上设置nat。

    树莓派上执行:

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
    sudo iptables -t nat -A POSTROUTING -s 10.2.3.0/24 -o wlan0 -j SNAT --to 192.168.1.107

    然后再在电脑上设置一下DNS,编辑/etc/resolv.conf即可

    至此,完成。若想不必每次重启后都要执行这些命令,可以把他们分别加入各自的/etc/rc.local中(sudo去掉)

     

  • Raspberry Pi 2 功耗实测

    时效性提醒:本文首次编写发布于11 年前。

    最近入了个USB电流计,于是测测树莓派2带的功耗玩玩。

    测试环境:

    电源:小米2A充电器
    实测电压:5.2V
    树莓派:2代,并超频至1000MHz
    运行服务:lamp和mc spigot 1.8服务器
    系统:Raspbain
    其他外设:散热风扇(温度高时启动),无线网卡

    场景一

    低负载,CPU使用率5%左右,风扇关闭。

    实测电流:0.32A

    (更多…)

  • 使用树莓派+sshfs来“远程“放音乐

    时效性提醒:本文首次编写发布于11 年前。

    家中客厅有台音响,但音乐大多都在屋子里的电脑中,我总不能为了放个音乐而把台式机搬过去吧。。。

    于是,将树莓派放到音响旁边,音频输出脸上音响。然后通过sshfs连接电脑的文件系统,并用mplayer播放电脑上的音频。(注意:你的电脑的系统得是linux等能装ssh服务端的)

    sshfs是一个通过fuse实现的”通过SSH的文件系统”,它在客户端表现的就像一个文件系统一样,而在服务器端只需要能连ssh即可,无需任何修改。

    首先在电脑上安装openssh-server

    sudo apt-get install openssh-server

    之后在树莓派上安装sshfs和用于卸载的fusemount(若不装则只能通过sudo umount卸载):

    sudo apt-get install sshfs fusemount

    然后把自己添加到fuse组:

    sudo usermod -aG fuse pi

    然后新建一个空目录用于挂载(名字随便)

    mkdir remote

    然后就可以在树莓派上挂载电脑上存着音乐的目录了(wusiyu为我的电脑上的用户名,192.168.1.103为电脑的ip,后面一大坨为电脑上音乐的路径,最后的remote/是刚才建的空目录,要按照你的实际情况修改)

    sshfs wusiyu@192.168.1.103:/home/wusiyu/音乐/东方BGM/163/ remote/

    输入密码,然后不出意外的话,树莓派的remote/下已经有电脑上的文件了

    然后用mplayer放就可以了,可以在screen里放,省得一直占着终端。

    screen -dmS music mplayer -loop 0 *
  • 让树莓派根据温度自动控制散热风扇的启停

    时效性提醒:本文首次编写发布于11 年前。

    众所周知,我们一般给Pi装的散热时都是自己插在电源上的,要转就一直转。最近一直在Pi上开个MC的服务器,Pi2的CPU温度在不开风扇时经常飙到50+,而一直开着风扇有太吵,所以就有了这个让树莓派自动控制风扇的东西。

     

    原理

    硬件上用三极管使树莓派能通过gpio来控制风扇的启停。然后在Pi上写一个很简单的Python小程序,实现温度较高时启动风扇,较低时关闭。

    硬件连接

    如图所示

    软件部分

    #!/usr/bin/python2
    #coding:utf8
    
    #自动风扇控制程序,使用wiringPi的gpio命令来操作GPIO
    
    import commands, time
    
    #控制风扇的GPIO
    FAN_GPIO=15
    
    commands.getoutput('sudo gpio mode '+str(FAN_GPIO)+' output')
    
    while True:
    
        # 获取CPU温度
        tmpFile = open( '/sys/class/thermal/thermal_zone0/temp' )
        cpu_temp_raw = tmpFile.read()
        tmpFile.close()
        cpu_temp = round(float(cpu_temp_raw)/1000, 1)
    
        #如果温度大于45`C,就启动风扇
        if cpu_temp>=45.0 :
            commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 0')
    
        #如果温度小于42`C,就关闭风扇
        if cpu_temp<42.0 :
            commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 1')
    
        time.sleep(5)

    温度判断部分使用了双阈值,防止老在临界点徘徊

     

  • 在Linux下使用sshfs来远程“挂载”树莓派的文件系统

    时效性提醒:本文首次编写发布于11 年前。

    sshfs顾名思义,就是通过ssh的fs,他与一般的sftp软件不同,它是一个“文件系统”,也就是与你挂载U盘之类真实的分区表现是一样的,也就是说,你可以使用任意的编辑器直接远程编辑pi上的文件,不需要编辑器具有sftp功能,因为对于编辑器而言,那个文件与在本机硬盘上的文件无异。

    废话少说,在电脑上使用sshfs,我们想要安装ssh-server和ssh-client

    sudo apt-get install openssh-server openssh-client

    然后安装sshfs本身

    sudo apt-get install sshfs

    然后通过如下命令来将pi的/home/pi目录挂载到我们本机的~/pi目录

    sshfs pi@192.168.1.107:/home/pi ~/pi/

    然后就想干啥干啥吧

  • 树莓派+LCD12864播放BadApple

    时效性提醒:本文首次编写发布于11 年前。

    制作流程

    注意:本制作只支持st7920控制器的LCD12864

    1.先把视频的每一帧都提成图片并压缩到适合显示屏大小,可以选择保持比例,我这里的图片压缩完后的大小是85×64;

    2.把每张图片的数据提出来,并转换成每横向8个点用一个数表示,方便直接传给显示屏,最后把数据按一定格式写到一个文本文件里。最后把所有文本文件拼起来。我用python+Image库实现的。

    3.写一个程序依次从刚才拼起来的文件中取出一张张图片的数据并传到显示屏上就可以了。

    源码下载

    主程序: http://ideone.com/4VXxQN
    视频数据文件: http://pan.baidu.com/s/1sjshtgx

  • 树莓派驱动LCD12864显示屏

    时效性提醒:本文首次编写发布于12 年前。

    适用于ST7920控制器的LCD12864显示屏,使用wiringPi GPIO库,C语言编写.

     

    (更多…)

  • 树莓派B+ GPIO详细对照表

    时效性提醒:本文首次编写发布于12 年前。
     +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+
     | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
     +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
     |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
     |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
     |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
     |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
     |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
     |  17 |   0 | GPIO. 0 |   IN | 1 | 11 || 12 | 1 | IN   | GPIO. 1 | 1   | 18  |
     |  27 |   2 | GPIO. 2 |   IN | 1 | 13 || 14 |   |      | 0v      |     |     |
     |  22 |   3 | GPIO. 3 |   IN | 1 | 15 || 16 | 1 | IN   | GPIO. 4 | 4   | 23  |
     |     |     |    3.3v |      |   | 17 || 18 | 1 | IN   | GPIO. 5 | 5   | 24  |
     |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
     |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 1 | IN   | GPIO. 6 | 6   | 25  |
     |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 0 | IN   | CE0     | 10  | 8   |
     |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
     |   0 |  30 |   SDA.0 |   IN | 0 | 27 || 28 | 0 | IN   | SCL.0   | 31  | 1   |
     |   5 |  21 | GPIO.21 |   IN | 0 | 29 || 30 |   |      | 0v      |     |     |
     |   6 |  22 | GPIO.22 |   IN | 0 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
     |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
     |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
     |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
     |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
     +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
     | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
     +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+