Gnome 的 Fractional Scaling

背景 最近发现部分软件(包括 Google Chrome,Firefox 和 Visual Studio Code)在 125% 的 Fractional Scaling 模式下会很卡。找到了一些临时解决方法,但是很不优雅,也很麻烦。所以深入研究了一下 Fractional Scaling 的工作方式。 临时解决方法 根据关键字,找到了 Chrome menus too slow after enabling fractional scaling in Ubuntu 20.04。按它的方法,关闭 Google Chrome 的硬件加速,发现卡顿问题确实解决了。 类似地,也可以[关闭 VSCode 的硬件加速](Chrome menus too slow after enabling fractional scaling in Ubuntu 20.04),在 Firefox 里也可以找到相应的设置。这样操作确实可以解决问题。但是,对于每一个出问题的应用都这样搞一遍,还是挺麻烦的。 另一个思路是,不使用 Fractional Scaling,而只是把字体变大。但毕竟和我们想要的效果不大一样。 一些发现 在物理机进行了一些实验以后,发现一个现象:125% 的时候卡顿,而其他比例(100%,150%,175%,200%)都不卡顿。 网上一顿搜到,找到了 xrandr 工具。下面是观察到的一些现象(GNOME 设置分辨率一直是 1920x1080): 放缩比例 xrandr 显示的分辨率 xrandr 显示的 transform 100% 1920x1080 diag(1.0, 1.0, 1.0) 125% 3072x1728 diag(1.

Read More

常用交换机命令

背景 最近接触了 Cisco,DELL,Huawei,H3C,Ruijie 的网络设备,发现配置方式各有不同,故记录一下各个厂家的命令。 Huawei 测试型号:S5320 保存配置 <HUAWEI>save The current configuration will be written to flash:/vrpcfg.zip. Are you sure to continue?[Y/N]y Now saving the current configuration to the slot 0.... Save the configuration successfully. 进入配置模式 <HUAWEI> system-view 查看当前配置 [HUAWEI] display current-configuration 查看 LLDP 邻居 [HUAWEI]display lldp neighbor brief 查看 CDP 邻居 [HUAWEI]display cdp neighbor brief 启用 LLDP [HUAWEI]lldp enable 启用 CDP [HUAWEI-XGigabitEthernet0/0/1]lldp compliance cdp txrx 启用只读 SNMPv1 community [HUAWEI]snmp-agent sys-info version all Warning: This command may cause confliction in netconf status.

Read More

用 k3s 部署 k8s

背景 最近需要部署一个 k8s 集群,觉得之前配置 kubeadm 太繁琐了,想要找一个简单的。比较了一下 k0s 和 k3s,最后选择了 k3s。 配置 k3s 的好处就是配置十分简单:https://rancher.com/docs/k3s/latest/en/quick-start/。不需要装 docker,也不需要装 kubeadm。 在第一个 node 上跑:curl -sfL https://get.k3s.io | sh - 在第一个 node 上获取 token:cat /var/lib/rancher/k3s/server/node-token 在其他 node 上跑:curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh - 然后就搞定了。从第一个 node 的 /etc/rancher/k3s/k3s.yaml获取 kubectl 配置。

Read More

通过 rook 在 k8s 上部署 ceph 集群

背景 为了方便集群的使用,想在 k8s 集群里部署一个 ceph 集群。 Ceph 介绍 Ceph 有这些组成部分: mon:monitor mgr:manager osd:storage mds(optional):用于 CephFS radosgw(optional:用于 Ceph Object Storage 配置 我们采用的是 rook 来部署 ceph 集群。 参考文档:https://rook.github.io/docs/rook/v1.5/ceph-examples.html 首先,克隆 rook 的仓库。建议选择一个 release 版本。 接着,运行下面的命令: sudo apt install -y lvm2 # required kubectl apply -f rook/cluster/examples/kubernetes/ceph/crds.yaml kubectl apply -f rook/cluster/examples/kubernetes/ceph/common.yaml kubectl apply -f rook/cluster/examples/kubernetes/ceph/operator.yaml # debugging only kubectl apply -f rook/cluster/examples/kubernetes/ceph/toolbox.yaml kubectl apply -f rook/cluster/examples/kubernetes/ceph/direct-mount.yaml # CephFS kubectl apply -f rook/cluster/examples/kubernetes/ceph/filesystem.yaml kubectl apply -f rook/cluster/examples/kubernetes/ceph/csi/cephfs/storageclass.

Read More

PCB 笔记

记录一下在学习画板子过程中学到的心得。 工具 目前使用过 KiCad 和 lceda: KiCad: 开源软件,跨平台。 lceda:在线编辑,不需要安装,和 lcsc 有深度集成。 项目 jiegec/HT42B534USB2UART 采用的是 KiCad 5 编写的。目前正在做的另一个项目采用 lceda 流程 选择所需要使用的芯片,查找芯片的 datasheet。 寻找采用了芯片的一些设计,特别是看 schematic。 按照 datasheet 里面推荐的电路,或者是其他人的设计,画自己需要的 schematic。 设置好各个元件的 footprint,然后转到 PCB 设计。 在 PCB 里面布线,生成 Gerber 等文件。 把 Gerber 给到生产商(比如 jlc),交付生产。 如果是自己焊接,则需要购买元件,比如从 lcsc 购买。 收到 PCB 和元件后,自己按照 BOM 和 schematic 焊接各个元件。 笔记 对于一些连接很多元件的信号,比如 GND,可以留作铺铜解决。也就是说,先不管 GND,把其他所有的信号都接好以后,再在顶层铺铜;如果还是有没有连接上的 GND,可以通过过孔(Via)走到底层,在底层再铺一层铜。 对于外部供电的 VCC 和 GND,在 KiCad 中需要用 PWR_FLAG 标记一下。 在 KiCad 中设计 PCB 前,要把生产商的工艺参数设置好,不然画了也要重画。 lceda 在选择元件的时候,可以直接从 lcsc 里选择,这样可以保证封装和商品可以对得上,不需要手动进行匹配。 如果要用 jlc 的 SMT 贴片,先在 SMT 元件列表 里搜索所需要的元件;推荐用基本库,如果用其他库,则要加钱;选好元件以后,用元件编号去 lceda 里搜索并添加到 schematic。 对于涉及模拟信号的设计,比如音频,需要特别注意模拟信号的电和地都是单独的:AVCC 和 AGND。所以要特别注意 datasheet 里面不同的地的表示方法。最后,再用磁珠把 VCC 和 AVCC、GND 和 AGND 分别连接起来就可以了。可以参考 DE2 板子中第 19 页的音频部分设计 和 Staying well grounded。 在 schematic 里经常会出现在电源附近的电容,那么,在 PCB 中,也尽量把这些电容放在对应的电源的旁边。 耳机插座里面,一般分三种组成部件:Tip,Ring,Sleeve。只有两段的是 TS,三段的是 TRS,四段的是 TRRS。TS 是单声道,T 是声音,S 是地。TRS 是双声道,T 是左声道(或者单声道),R 是右声道,S 是地。TRRS 则是双声道加录音。一般来说,LINE IN 是双声道,MIC IN 是单声道,它们的阻抗也不同;LINE OUT 和 HEADPHONE OUT 都是双声道,但 HEADPHONE OUT 经过了额外的放大器。 遇到一个 SPI 协议没有 SPI_MISO 引脚的芯片,可能说明它是 write-only 的。 手焊的基本元件,一般用 0603 加一些 Padding 的封装;SMT 的话,则建议用 0402 封装。 I2C 的信号线一般需要加一个几 K 欧姆的上拉电阻到 VCC。 未完待续。

Read More

iDRAC 各版本

iDRAC 版本 目前接触到的 iDRAC 版本有:7 8 9。一些常见的服务器型号和 iDRAC 版本对应关系: 7: PowerEdge R320, PowerEdge R720 8: PowerEdge R730xd,PowerEdge R630,PowerEdge R730,PowerEdge C4130 9: PowerEdge R7425 基本上,如果是 PowerEdge R 什么的,就看第二位数字,就可以推断出版本号了。 下面列举了一下可能会用到的版本。 iDRAC 7 iDRAC 7 在 2020 年 2 月停止更新了,最新版本是 2.65.65.65。 升级路线参考:Reddit。 1.66.65 下载页面,2014 年 12 月版本。 2.10.10.10 下载页面,2015 年 4 月版本。 2.65.65.65 下载页面,2020 年 3 月版本,添加了 HSTS。 iDRAC 8 2.10.10.10 下载页面,2015 年 3 月版本。 2.30.30.30: 下载页面,2016 年 2 月版本,添加了 HTML5 virtual console 支持。 2.

Read More

使用 SSSD 的 LDAP 认证

前言 最近在研究替换一个老的用户系统,于是顺便学习了一下 LDAP,还有 SSSD。LDAP 是一个目录协议,顺带的,因为用户信息也可以存在里面,所以也就成了一个常见的用户认证协议。SSSD 就是一个 daemon,把系统的 NSS PAM 的机制和 LDAP 连接起来。 配置 其实很简单,安装 sssd 并且配置即可: $ sudo apt install sssd $ sudo vim /etc/sssd/sssd.conf # file content: [sssd] config_file_version = 2 services = nss,pam domains = LDAP [domain/LDAP] cache_credentials = true enumerate = true entry_cache_timeout = 10 ldap_network_timeout = 2 id_provider = ldap auth_provider = ldap chpass_provider = ldap ldap_uri = ldap://127.0.0.1/ ldap_chpass_uri = ldap://127.0.0.1/ ldap_search_base = dc=example,dc=com ldap_default_bind_dn = cn=localhost,ou=machines,dc=example,dc=com ldap_default_authtok = REDACTED $ sudo systemctl enable --now sssd 一些字段需要按照实际情况编写,请参考sssd.

Read More

在 Big Sur(M1) 上解决 LaTeX 找不到楷体字体的问题

背景 最近在尝试移植 MiKTeX 到 Apple Silicon 上,添加了一些 patch 以后就可以工作了,但遇到了新的问题,即找不到 KaiTi ~/Library/Application Support/MiKTeX/texmfs/install/tex/latex/ctex/fontset/ctex-fontset-macnew.def:99: Package fontspec Error: The font "Kaiti SC" cannot be found. 用 miktex-fc-list 命令找了一下,确实没有找到: $ /Applications/MiKTeX\ Console.app/Contents/bin/miktex-fc-list | grep Kaiti # Nothing 上网搜了一下,找到了一个解决方案:字体在目录 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Support/FontSubsets/Kaiti.ttc 里,所以手动安装一下,就可以让 LaTeX 找到了。但我觉得,与其安装多一份在文件系统里,不如让 LaTeX 去找它。 解决方法 按照上面的线索,找到了 Kaiti.ttc 所在的路径: $ fd Kaiti.ttc /System/Library/PrivateFrameworks/FontServices.framework/Versions/A/Resources/Fonts/Subsets/Kaiti.ttc 可以看到,和上面的路径又不大一样。研究了一下 fontconfig,发现可以用 miktex-fc-conflist 找到配置文件的目录: $ /Applications/MiKTeX\ Console.app/Contents/bin/miktex-fc-conflist + ~/Library/Application Support/MiKTeX/texmfs/config/fontconfig/config/localfonts2.conf: No description + ~/Library/Application Support/MiKTeX/texmfs/config/fontconfig/config/localfonts.conf: No description ... 看了下第一个文件(localfonts.conf): <?xml version="1.0" encoding="UTF-8"?> <!

Read More

COMMON 符号

背景 在编译一个程序的时候,遇到了 undefined symbol 的问题。具体情况是这样的: 一开始的时候,直接把所有的源代码编译成 .o,再一次性链接,这样不会报错 后来,把一些代码编译成静态库,即把其中一部分源代码编译成 .o 后,用 ar 合并到一个 .a 中,再和其余的 .o 链接在一起,这时候就报错了: Undefined symbols for architecture arm64: "_abcd", referenced from: ... 如果换台机器,编译(使用的是 gcc 10.2.0)就没有问题。 而如果去找这个符号存在的 .o 里,是可以找到的: $ objdump -t /path/to/abcd.o 0000000000000028 *COM* 00000008 _abcd 在合成的静态库 .a 里,也是存在的(一个定义 + 若干个引用): $ objdump -t /path/to/libabc.a | grep abcd 0000000000000028 *COM* 00000008 _abcd 0000000000000000 *UND* _abcd 0000000000000000 *UND* _abcd 0000000000000000 *UND* _abcd 0000000000000000 *UND* _abcd 0000000000000000 *UND* _abcd 于是觉得很奇怪,就上网搜了一下,找到了一篇 StackOverflow 讲了这个问题。解决方案很简单,就是:

Read More

Skid Buffer

Skid buffer Skid buffer 指的就是,对于 valid + ready 的握手信号,用空间(更多的逻辑)来换取时间(更好的时序)的一个硬件模块。 简单来说,背景就是,为了解决 valid 和 ready 信号在数据流水线上一路经过组合逻辑导致的时序问题,在中途加上一些寄存器来阻隔。当然了,代价就是延迟和面积,不过吞吐量还是需要保持的。 由于需求的不同,Skid buffer 也有不同的实现。目前,找到了四个实现,实现上有所不同,特性也不大一样。 统一约定 由于我在 SpinalHDL 语言中重新实现了下面的这些 Skid buffer,所以按照 SpinalHDL 的 Stream 定义接口: class SkidBufferCommon[T <: Data]( gen: => T ) extends Component { val io = new Bundle { val s = slave(Stream(gen)) val m = master(Stream(gen)) } } 在这里,io.s 表示从上游取的数据,io.m 表示传递给下游的数据。 输出信号共有:io.s.ready、io.m.valid 和 io.m.payload。 ZipCPU 版本 第一个版本来自 ZipCPU: 博客地址:Building a Skid Buffer for AXI processing 代码地址:skidbuffer.

Read More