baota安装相关

安装

docker run -tid --name baota -p 50080:80 -p 58888:8888 -p 50888:888 --restart always -v /mnt/user/appdata/baota/wwwroot:/www/wwwroot -v /mnt/user/appdata/baota/server/data:/www/server/data -v /mnt/user/appdata/baota/backup:/www/backup -v /mnt/user/appdata/baota/server/panel/vhost:/www/server/panel/vhost btpanel/baota:lnmp

配置

  • 如何查看默认安装的初始地址和账号:
    /etc/init.d/bt default

  • 如何调出bt修改菜单
    bt

网络

如果其他docker有通过自定义网络访问baota,那么记得重装baota后,加入自定义网络:

docker network connect --ip 172.18.0.200 myNetwork baota

虚拟机磁盘格式转换qemu-img

比较常用的工具就是qemu-img

下载

https://qemu.weilnetz.de/w64/

命令

将qcow2转换为vmdk:
qemu-img convert -p -f qcow2 -O vmdk disk1.qcow2 disk1.vmdk

上述命令中各参数对应的说明如下:

-p:表示镜像转换的进度。
-f后面为源镜像格式。
-O(必须是大写)后面的参数由如下3个部分组成:转换出来的镜像格式 + 源镜像文件名称 + 目标文件名称。
转换完成后,目标文件会出现在源镜像文件所在的目录下。

从0开玩lichee zero-1-uboot篇

·## 准备工作
sudo apt-get install gcc-arm-linux-gnueabihf
sudo apt-get install git
sudo apt-get install Python2

uboot

git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current

config SD TF

修改u-boot/include/configs/sun8i.h文件 加入:

#define CONFIG_BOOTCOMMAND   "setenv bootm_boot_mode sec; " \
                            "load mmc 0:1 0x41000000 zImage; "  \
                            "load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb; " \
                            "bootz 0x41000000 - 0x41800000;"

#define CONFIG_BOOTARGS      "console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw  vt.global_cursor_default=0"

config spi flash

git clone -b v3s-spi-experimental https://github.com/Lichee-Pi/u-boot.git

配置Flash支持型号

执行 make ARCH=arm menuconfig 打开uboot菜单配置,进入到 Device Drivers ‣ SPI Flash Support

注意看一下自己flash的厂家名称,例如选上Macronix SPI flash support用来支持测试用的flash:MX25L25645G。

如果使用的是16MB以上的flash,需要勾选flash bank支持选项,否则最多只能读到16MB: CONFIG_SPI_FLASH_BAR

spi 分区

这里 使用 MX25L25645G, 32M SPI flash 作为启动介质,规划分区如下:

分区序号 分区大小 分区作用 地址空间及分区名
mtd0 1MB spl+uboot 0x0000000-0x0100000 : "uboot"
mtd1 64KB dtb文件 0x0100000-0x0110000: "dtb"
mtd2 4MB linux内核 0x0110000-0x0510000 : "kernel"
mtd3 剩余 根文件系统 0x0510000-0x2000000 : "rootfs"
 #define CONFIG_BOOTCOMMAND   "sf probe 0; "                           \
                             "sf read 0x41800000 0x100000 0x10000; "  \
                             "sf read 0x41000000 0x110000 0x400000; " \
                             "bootz 0x41000000 - 0x41800000"

 #define CONFIG_BOOTARGS      "console=ttyS0,115200 earlyprintk panic=5 rootwait " \
                             "mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2"

make

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make LicheePi_Zero_defconfig
ARCH=arm make menuconfig
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make

编译完成后,在当前目录下生成了u-boot-sunxi-with-spl.bin,可以烧录到TF卡8K偏移处启动

注意:对于大于16M的flash,需要在menuconfig中开 CONFIG_SPI_FLASH_BAR

烧录

sd

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

troubleshoot

  1. <command-line>: fatal error: curses.h: No such file or directory
    解决:sudo apt-get install libncurses5-dev libncursesw5-dev

  2. Your dtc is too old, please upgrade to dtc 1.4 or newer
    解决:apt-get install device-tree-compiler

reg :https://licheezero.readthedocs.io/zh/latest/%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/SPI_flash_build.html#uboot

从0开玩lichee zero-0-固件体验

lichee zero介绍

https://licheezero.readthedocs.io/
https://wiki.sipeed.com/soft/Lichee/zh/Zero-Doc/

固件测试

因为购买时sd和板子是分开购买的,不像其他的开发板,到手就用,这个要自己烧录才能体验到板子的基本功能。 ### 固件下载 可以参考上面的这个https://wiki.sipeed.com/soft/Lichee/zh/Zero-Doc/System_Development/download_onekey.html

可能采坑的地方是对于新手,这个文档没有说清楚,下载的细节。需要解压后下载dd文件,如果你是直接下载,就会发现板子没有反应,不知所措。

这里我自己使用的是:lichee_zero-mindb_alpha.dd:

file

串口日志

按照官方指导,连接uart0,就能看到系统的开机日志:
file

账号密码

网上文档说的是root licheepi,实际验证不对。
经多方验证,有以下几种密码组合:

  1. root toortoor
  2. root licheepi
  3. root 空

从0开玩树莓派-1-开机配置

注意:如果你使用的是带HDMI的桌面版,一定要选择一个电流足够的适配器,否则会导致异常重启。

设置 root 密码

sudo passwd root

屏幕翻转

  • 带ui的新系统
    如果你的屏幕是180度倒置的,需要设置下屏幕:

    1. preferences->screen configuration
    2. 选择HDMI屏幕,右键->Orientation->inverted
  • 命令行的老系统
    1. sudo nano /boot/config.txt
    2. display_hdmi_rotate=2

开启sshd

  • 方法1:通过界面UI
    如果烧录是没有配置sshd,我们可以在进入系统以后启动:

    sudo systemctl enable ssh
    sudo systemctl start ssh
  • 方法2:通过SD
    当没有屏幕时,我们可以通过在sd boot盘的跟目录下创建SSH空文件,来启用默认的sshd配置。用户名pi,密码respberry

安装pyenv

系统默认python3,有时候你需要运行的项目是python2的,我们需要pyenv

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/libexec:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init --path)"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec $SHELL -l

从0开玩树莓派-0-安装和环境

Raspberry Pi 1 Model B+

file

On the other hand, the BCM2835 uses a single core and thread 32-bit microprocessor. Once again, it features a clock speed of 700 Mhz. However, it has a turbo capability to boost clock frequencies up to 1 GHz. Unfortunately, this feature is absent from the BCM2711.
The BCM2835 is an SoC that Broadcom Semiconductors developed.  As we have briefly mentioned in the introduction, SoC packages such as the BCM2835 make devices such as the Raspberry Pi Zero possible. Additionally, The Raspberry Pi Foundation features the BCM2835 in the Raspberry Pi A, A+, B, B+, and the Raspberry Pi Zero W. Moreover, you can find it in rare models such as the Raspberry Pi Compute Module 1.

Since it’s an older chip package, you’re unlikely to find it in newer microcontrollers or single-board computers. However, its capabilities and peripherals are still worth exploring.
  • Core Processor Architecture: ARM
  • Processor Speed: 700 MHz
  • Core Processor Sub-Architecture: ARM1176JZF-S processor
  • RAM: 512MB
  • SODIMM Board Size: 6.5x3.0 cm
  • Edge Connector Pins: 200
  • On-Board Flash Memory: 4GB eMMC
  • GPU: VideoCore IV GPU running at 250MHz

安装系统

准备大于8G的SD

Raspberry Pi Imager

根据前面的介绍,我们知道我们的板子是32架构,所以我们要选择32bit的系统:

file

说明:

  • 一定要选好的sd卡和读卡器,否则可能浪费很多时间。
  • 右下角的设置是可以预设一些参数的,对于无屏场景,很有用

经过耐心的等待,就会提示校验成功,可以拿下sd插入设备了。

参考

https://www.ourpcb.com/bcm2835.html

七牛的镜像存储配置说明

关于镜像存储功能简单总结:自动回源,切换无拷贝工作量,且只回源一次,在某些源不稳定的架构中,非常有用。

主要做以下几步:

空间管理

在对象存储-》空间管理里面,创建一个空间。

加速域名

加速域名其实就是你想镜像的内容入口。

  1. 需要去你的域名运营商解析处,配置cname,让域名能被重定向七牛的域名
  2. 如果原始资源是https,一定要配置https,否则无法访问

镜像回源

这里主要就是回源地址,这里非常有用的是支持端口,你懂的,内网资源呵呵呵。

file

做好以上设置,功能就基本可用了,至于其他高级数据,再按需开启。

最后需要说明的是,镜像服务是一种cdn服务,是收流量费的,在方便和钱之前,还是要实际斟酌调试的。

查询so的依赖

ldd a.so可以检查a的依赖,但是因为ldd要链接a.so,所以在本机环境正常,但是当是交叉编译的目标时,就不行了。

这时候可以用objdump来检查了:
objdump -x a.so |grep NEEDED

在ffmpeg项目中新增lib以及如何在so中调用so

我们知道在ffmpeg已经有了很多lib,比如avcode avdevice avutil等。

如果我们要现有的makefile框架中新增加一个lib叫做a.so,该如何修改?

本文基于ffmpeg4.3.4,如果验证版本有变,请自行调整。

  1. a自身的makefile可以参考现有的来修改:
    NAME    = a
    DESC    = FFmpeg new demo library
    HEADERS = a.h version.h
    OBJS    = a.o
  2. Makefile:
    FFLIBS := avutil a
  3. configure:
    # this list should be kept in linking order
    LIBRARY_LIST="
    avdevice
    avfilter
    swscale
    postproc
    avformat
    avcodec
    swresample
    avresample
    avutil
    a
    "
  4. ffbuild/common.mk
    ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample a

至此,只要a配置正确的makefile就应该能正确编译了。

扩展:如何 so 中调用so

上面介绍了如何扩展lib,假如ffmpeg原有的lib 叫 x.so, 我们二次开发了一个基于x.so的 a.so, 那么如何让a.so能正确调用到x.so?

configure:

# libraries, in any order
avenc_deps="ava"

说明上面的av是沿用ffmpeg默认命令习惯

附带make配置脚本

x86-64

TOOLS_DIR=toolchain/bin
./configure --enable-shared \
--disable-static \
--disable-x86asm \
--enable-cross-compile \
--strip=$TOOLS_DIR/llvm-strip \
--extra-cflags="-I$(pwd)/install/include" \
--extra-ldflags="-L$(pwd)/install/libs" \
--prefix=$(pwd)/install \
--target-os=linux \

arm

TOOLS_DIR=ndk-toolchain/bin
./configure --enable-shared \
--disable-static \
--disable-x86asm \
--enable-cross-compile \
--cc=$TOOLS_DIR/armv7a-linux-androideabi26-clang \
--cxx=$TOOLS_DIR/armv7a-linux-androideabi26-clang++ \
--strip=$TOOLS_DIR/llvm-strip \
--extra-cflags="-I$(pwd)/install/include" \
--extra-ldflags="-L$(pwd)/install/libs" \
--arch=arm \
--prefix=$(pwd)/install \
--target-os=android \

几个有用plmn

当我们想定制入网优先级,或者在多漫游网络中想选择较为理想信号强度的时候,就可能用到xPLMNs。

需要说明的是,部分plmn是在sim中的,能不能定制修改,跟开卡的套餐和运营商发卡的限制有关,需要实际测试。

所有的细节都在3GPP的标准中有详细说明,可以自行查阅。

PLMN 关系图

file

PLMN

file

OPLMN

file

HPLMN

file

FPLMN

file

UPLMN

我们经常看到uplmn用户自定义plmn,优先级高于oplmn,参考概述图,我们并没有看到uplmn的说明。

参考以下的内容:

The OPLMN is formally known as the ‘OPLMNwAcT’, and the UPLMN as the ‘PLMNwAcT’. The ‘wAcT’ in each case is short for ‘with Access Technology’

所以,uplmn 实际就是 PLMNwAcT=0x6F60=28512

参考ref:

  1. https://www.etsi.org/deliver/etsi_ts/131100_131199/131102/15.05.00_60/ts_131102v150500p.pdf
  2. https://www.twilio.com/docs/iot/supersim/how-and-why-to-set-super-sims-uplmn-table#super-sim-uplmn-codec

更换 xr 电池和屏幕

刚开始只想更换电池,因为电池掉到80%以下了,基本一天两三充。但是拆机过程中把屏幕不小心搞废了,正好以前手机也摔过,屏幕有印痕黑块,所以很痛快就想一起换了。

准备

  1. 尖镊子,越细越尖越好
  2. 第三方电池,找相关行业朋友推荐的马拉松,比官方的容量大。
  3. 第三方屏幕总成,我选的品胜。

拆屏幕

这个是整个更换中最难的部分,估计也是很多人容易搞砸的地方。

刚开始没搞明白拆屏幕的细节,也没有网上的抬屏工具,基本是凭经验用风枪和刀片弄的,结果硬生生把屏幕从中间拆开了(有点虎):

file

file

移除固定螺丝

移除以上部位的固定螺丝后,就可以把屏幕和电池拆卸下来了。

需要注意的是拆卸电池要小心,不要用金属戳,避免电池短路自燃

移植喇叭和传感器

新买的屏幕总成是没有喇叭部分的,需要移植旧屏幕上的部分,注意的是记得要把胶托移过来,这样支撑和音腔效果才能好:

file

安装新新电池测试

拆除成功后,先装屏幕,然后再装电池,测试系统开机正常。如果不能开机或者功能不正常,逐个检查fpc座子。

加装固定螺丝

测试通过后,开始加装盖板和螺丝。

file

贴胶膜装屏幕

最后一步就是贴胶膜,主要是防水:
file

红色的一圈就是胶膜,贴好后,撕掉塑料,然后把屏幕装进去,轻轻的一圈压好,再锁底部的两个螺丝。

最后效果

file

电池和屏幕都正常。

其他注意事项:

  1. 旧屏幕不要扔,因为要移植喇叭和传感器部件。
  2. 底壳的旧胶要清理干净,这样收尾贴胶膜很好帖,也容易做到防水
  3. 废旧的屏幕不要着急扔,当你发现螺丝不够用的时候,就能从上面移螺丝用。
  4. 使用第三方电池后,xr是不能显示电池容量的。有介意的,请去官方更换。

电信GPON TEWA-700G使用自有路由器上网

GPon是之际可以ppoe拨号的,为了使用自己路由器的一些功能,所以想用自己的拨号,实质上也是有差异的比如NAT的支持效果等。

很早就改成自己路由器了,最近因为想改家庭网络配置又改成gpon了,然后发现效果不好又想改回去,就死活也配置不成功了,浪费了一上午,所以记录下,避免下次再吃瘪。

file

这里重要的几个点:

  1. ppoe
  2. 桥接
  3. vlan
  4. 41

需要说明的是,配置好了后,经过验证是不需要vlan绑定的。

linode美国机房选择

Facility Hostname Test Download
US East(美国东部,纽瓦克) speedtest.newark.linode.com 100MB-newark.bin
US Southeast(美国东南,亚特兰大) speedtest.atlanta.linode.com 100MB-atlanta.bin
US Central(美国中部,达拉斯) speedtest.dallas.linode.com 100MB-dallas.bin
US West(美国西部,费利蒙) speedtest.fremont.linode.com 100MB-fremont.bin
EU Central(欧洲中部,法兰克福) speedtest.frankfurt.linode.com 100MB-frankfurt.bin
EU West(欧洲西部,伦敦) speedtest.london.linode.com 100MB-london.bin
AP South(亚太南部,新加坡) speedtest.singapore.linode.com 100MB-singapore.bin
AP Northeast(亚太东北,东京) speedtest.tokyo2.linode.com 100MB-tokyo2.bin

build FFmpeg in android

以下的内容其实也适用于在安卓下编译其他工具。

  1. ndk下载:https://developer.android.google.cn/ndk/downloads

  2. ffmpeg下载:https://github.com/FFFmpeg/FFFmpeg

  3. 编写配置脚本:

TOOLS_DIR=ndk路径/toolchains/llvm/prebuilt/linux-x86_64/bin
./configure --enable-shared \
--disable-static \
--disable-x86asm \
--enable-cross-compile \
--cc=$TOOLS_DIR/aarch64-linux-android30-clang \
--cxx=$TOOLS_DIR/aarch64-linux-android30-clang++ \
--strip=$TOOLS_DIR/llvm-strip \
--extra-cflags="-I$(pwd)/include" \
--extra-ldflags="-L$(pwd)/libs" \
--arch=arm64 \
--prefix=$(pwd)/install/aarch64 \
--target-os=android

请注意arch要更新成实际的:arch=arm64 or arch=arm

  1. 执行完以上脚本后,开始编译 :make -j16

如果想让程序在当前目录寻找依赖的.so文件(LDFLAGS = -Wl,--hash-style=sysv,-Bsymbolic,-rpath=./):

make -j16 -Wl,--hash-style=sysv,-Bsymbolic,-rpath=./

c99较c89的主要新增特性

  • // 注释

  • func预定义标识符

  • 中使用布尔类型

  • 指定的结构体初始值设定项
    -空的宏参数

  • 中使用扩展的整数类型

  • 灵活的数组成员 (zero size arrays)

  • 内联函数

  • 整数常量类型规则

  • 将声明和代码混合

  • long long 类型和库函数

  • snprintf() 函数家族

  • 枚举声明中支持尾随逗号

  • 可变参数宏

  • 长度可变的数组

docker支持IPV6

这两天因为某个需求,一直在研究这个问题。

网上都看了,什么ipv6 subnet daemon.json 之类的,都是一通抄,还是没有能说明白关键联系的,很多都是抄的碎片化信息。

因为说不清楚关联,所以就没法在实际环境中结合实际灵活解决问题。

docker的版本

docker的版本问题。初步结论是:docker engine 的版本大于等于20.10.2 。参见:https://zhuanlan.zhihu.com/p/342633966

经过验证,如果版本不对,在配置daemon.json时,就会报错,令人莫名, 实际是版本的ipv6支持问题,不支持新字段。

注意:系统默认的docker版本是跟这个系统的代码版本库走的,所以想要最新的docker版本,首先要确认自己的系统,否则要手动安装。

daemon.json

这个也是网上看到最多的:

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00::/80",
  "experimental": true,
  "ip6tables": true
}

在跳过了docker版本的坑,这里就可以配置了。这里核心的是那个fixed-cidr-v6, 很多人看不懂这个,不知道这个要怎么改,这个就要自己实际弄懂ipv6的子网了,要根据自己的外网IPV6地址,配置实际的子网段。参见 https://docs.docker.com/engine/daemon/ipv6/

检查对应docker的网络配置

docker inspect xxx

检查 Networks 字段,下面对应就是network的对象,如下例子就是 bridge:

"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "xxx",
                    "EndpointID": "xxx",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "fd17::1",
                    "GlobalIPv6Address": "fd17::242:ac11:2",
                    "GlobalIPv6PrefixLen": 64,
                    "MacAddress": "xxx",
                    "DriverOpts": null
                }
            }

然后我们继续检查 bridge对ipv6的支持情况:

docker network inspect bridge

我们检查EnableIPv6字段:

"Name": "bridge",
        "Id": "xxx",
        "Created": "xxx",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,

如果是true,则证明此bridge网络已经支持ipv6

测试docker获取ipv6能力

docker run --rm -it busybox ping -6 -c4 ipv6-test.com
docker run --rm -it busybox ifconfig

正常返回,就说明系统的docker ipv6能力正常

frq实现私密访问

目标:通过密码从国内代理流量到国外(ssh)

frp server

略,通用配置

目标服务器(海外)sshd server

frpc.ini

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh]
type = stcp
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

国内服务器

frpc.ini

[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh_visitor]
type = stcp
role = visitor
server_name = secret_ssh
sk = abcdefg
bind_addr = 127.0.0.1
bind_port = 6000

server_name sk 可以简单理解成frpc远端的账号密码。

从国内访问海外ssh

ssh -oPort=6000 x.x.x.x(国内的ip)

ssh秘钥登陆,禁用密码

为了防止网络嗅探,一般拿到vps第一个就是关密码,开秘钥登陆

编辑 /etc/ssh/sshd_config 文件,注意是sshd_config,不要眼花看成成ssh_config

#开秘钥:
RSAAuthentication yes
PubkeyAuthentication yes
PubkeyAcceptedKeyTypes +ssh-rsa

#关密码:
PasswordAuthentication no

篇日志完后记得重启
systemctl restart ssh

所选的用户秘钥未在远程主机注册

首先网上大部分抄的内容都是围绕pubkey配置不对的内容,参考价值不大。

已经排查:

  1. authorized_keys 内容 --- ok
  2. authorized_keys 权限 600 or 644 --- ok

还是失败,对等其他主机配置的,都是可以的,同样的客户端配置操作。

解决思路:

  1. 查看sshd日志:cat /var/log/secure,发现有用信息:
    userauth_pubkey: signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
  2. 根据上面的提示
    sshd -T | grep pubkeyacceptedalgorithms
    pubkeyacceptedalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256

    可以看到没有 ssh-rsa

  3. 配置 vi /etc/ssh/sshd_config 添加:
    PubkeyAuthentication yes
    PubkeyAcceptedKeyTypes +ssh-rsa

    然后重启:systemctl restart ssh

  4. 重启后再次查询:
    sshd -T | grep pubkeyacceptedalgorithms
    pubkeyacceptedalgorithms ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa

    在尾部已经发现ssh-rsa了

  5. 在客户端重新尝试,可以正常登陆了

总结:因为ubuntu是最新的版本,因为安全原因,默认把 ssh-rsa禁用了。所以根据此思路,如果我们有时间,我们还可以从升级客户端的配置来场景解决

参考感谢:https://www.ezeelogin.com/kb/article/userauth_pubkey-signature-algorithm-ssh-rsa-not-in-pubkeyacceptedalgorithms-518.html

acme中有关zerossl的失败

在某些自动化脚本中,需要安装ssl证书时,可能会出现如下的提示:
[Sat Oct 15 10:28:50 AM UTC 2022] Using CA: https://acme.zerossl.com/v2/DV90 [Sat Oct 15 10:28:50 AM UTC 2022] Create account key ok. [Sat Oct 15 10:28:50 AM UTC 2022] No EAB credentials found for ZeroSSL, let's get one [Sat Oct 15 10:28:50 AM UTC 2022] acme.sh is using ZeroSSL as default CA now. [Sat Oct 15 10:28:50 AM UTC 2022] Please update your account with an email address first. [Sat Oct 15 10:28:50 AM UTC 2022] acme.sh --register-account -m my@example.com [Sat Oct 15 10:28:50 AM UTC 2022] See: https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA [Sat Oct 15 10:28:50 AM UTC 2022] Please add '--debug' or '--log' to check more details. [Sat Oct 15 10:28:50 AM UTC 2022] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh 2022-10-15 10:28:50 - 申请证书失败,请尝试手动申请证书.

看很多网上搜索说什么指令 letsencrypt之类的解决方法。

其实log已经提示方案了:

apt install socat
curl  https://get.acme.sh | sh
acme.sh --register-account -m my@example.com

脚本失败后,可以先单独安装acme,执行如上操作,测试可以单独成功,比如
sudo ~/.acme.sh/acme.sh --issue -d mydomain.com --standalone -k ec-256
确认可以成功后,在重新执行脚本,基本就能解决问题。

git conflict

git conflict 是日常协作中必不可少的。

在gitlab的web页面上,有三种处理conflict的视图,其中line的文本方式最灵活。

这种方式中:

其中<<<<<<< HEAD 到 ======= 中间的内容是local提交的。

======= 到 >>>>>>> commit-id 是远程仓库中的内容。

示例:

<<<<<<< HEAD

新提交的代码xxx

=======

远程仓库的代码xxx

>>>>>>> commit-id 

of_get_gpio说明

/**

  • of_get_gpio() - Get a GPIO number to use with GPIO API
  • @np: device node to get GPIO from
  • @index: index of the GPIO
  • Returns GPIO number to use with Linux generic GPIO API, or one of the errno
  • value on the error condition.
    /
    static inline int of_get_gpio(const struct device_node
    np, int index)
    {
    return of_get_gpio_flags(np, index, NULL);
    }

    这个index 表示gpios节点的索引位置,gpios支持多个节点,每个节点由<gpio_chip gpio_num default_level>
    eg:
    gpios = <&ap_gpio 145 0 &ap_gpio 144 0>;

安卓默认网络设置

网络制式定义,不局限于安卓。

ro.telephony.default_network

可选值:

/* NETWORK_MODE_* See ril.h RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE */
int NETWORK_MODE_WCDMA_PREF     = 0; /* GSM/WCDMA (WCDMA preferred) */
int NETWORK_MODE_GSM_ONLY       = 1; /* GSM only */
int NETWORK_MODE_WCDMA_ONLY     = 2; /* WCDMA only */
int NETWORK_MODE_GSM_UMTS       = 3; /* GSM/WCDMA (auto mode, according to PRL)
                                        AVAILABLE Application Settings menu*/
int NETWORK_MODE_CDMA           = 4; /* CDMA and EvDo (auto mode, according to PRL)
                                        AVAILABLE Application Settings menu*/
int NETWORK_MODE_CDMA_NO_EVDO   = 5; /* CDMA only */
int NETWORK_MODE_EVDO_NO_CDMA   = 6; /* EvDo only */
int NETWORK_MODE_GLOBAL         = 7; /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)
                                        AVAILABLE Application Settings menu*/
int NETWORK_MODE_LTE_CDMA_EVDO  = 8; /* LTE, CDMA and EvDo */
int NETWORK_MODE_LTE_GSM_WCDMA  = 9; /* LTE, GSM/WCDMA */
int NETWORK_MODE_LTE_CMDA_EVDO_GSM_WCDMA = 10; /* LTE, CDMA, EvDo, GSM/WCDMA */
int NETWORK_MODE_LTE_ONLY       = 11; /* LTE Only mode. */
int NETWORK_MODE_LTE_WCDMA      = 12; /* LTE/WCDMA */
int NETWORK_MODE_TD_SCDMA_ONLY            = 13; /* TD-SCDMA only */
int NETWORK_MODE_TD_SCDMA_WCDMA           = 14; /* TD-SCDMA and WCDMA */
int NETWORK_MODE_TD_SCDMA_LTE             = 15; /* TD-SCDMA and LTE */
int NETWORK_MODE_TD_SCDMA_GSM             = 16; /* TD-SCDMA and GSM */
int NETWORK_MODE_TD_SCDMA_GSM_LTE         = 17; /* TD-SCDMA,GSM and LTE */
int NETWORK_MODE_TD_SCDMA_GSM_WCDMA       = 18; /* TD-SCDMA, GSM/WCDMA */
int NETWORK_MODE_TD_SCDMA_WCDMA_LTE       = 19; /* TD-SCDMA, WCDMA and LTE */
int NETWORK_MODE_TD_SCDMA_GSM_WCDMA_LTE   = 20; /* TD-SCDMA, GSM/WCDMA and LTE */
int NETWORK_MODE_TD_SCDMA_CDMA_EVDO_GSM_WCDMA  = 21; /*TD-SCDMA,EvDo,CDMA,GSM/WCDMA*/
int NETWORK_MODE_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA = 22; /* TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo */

嵌入式x509证书过期及更新

嵌入式中,我们可以通过x509证书来实现tcp+tls或者https,那么如何处理过期的问题呢?

这个过程对终端都是类似的行为,下载,更新,但是根据服务器实现的技术不同,可以分为以下两种:

  • 单通道滚动:整个更新过程,服务器保持同一套ip端口, 新旧证书互斥关系,只有一个工作,当旧证书还剩5-10天时,通过旧证书下载新证书,然后本地替换后,访问原有的ip端口,这种方式要求在临界时间区时,服务器同一套ip端口能支持两套证书工作。服务器实现难度高,终端侧简洁优雅。
  • 双通道交替:下载新证书后,按照约定访问新的ip和端口,所有业务走新ip端口,服务器维护两条通道和两套证书。这种服务器实现简单,终端侧流程稍麻烦。

adb调节音量

当没屏幕时,通过adb调节音量就有用了:

set:
adb shell media volume --show --stream 0 --set 15
get:
adb shell media volume --stream 0 --get

stream 类型参考

AUDIO_STREAM_VOICE_CALL = 0,
AUDIO_STREAM_SYSTEM = 1,
AUDIO_STREAM_RING = 2,
AUDIO_STREAM_MUSIC = 3,
AUDIO_STREAM_ALARM = 4,
AUDIO_STREAM_NOTIFICATION = 5,
AUDIO_STREAM_BLUETOOTH_SCO = 6,
AUDIO_STREAM_ENFORCED_AUDIBLE = 7,
AUDIO_STREAM_DTMF = 8,
AUDIO_STREAM_TTS = 9,
AUDIO_STREAM_ACCESSIBILITY = 10

unraid的数据安全

当unraid作为我们的家庭数据中心时,安全就成了最大的问题,我们不希望重要的数据,因为意外被泄露

措施

  • 磁盘更换加密文件系统,比如xfs-encrypted。需要停止阵列后更换文件系统,注意更换后会触发格式化,所以更换前先迁移数据。
  • 访问unraid的客户端保护好密码,比如家庭电脑平板。
  • 增加parity磁盘。
  • 检查路由器安全,比如mac绑定,访问ip白名单等。
  • 是在预算可以的,可以再搞个异地备份,不过一般人用不着,费钱。
  • 配置ups,避免磁盘断电损坏。