分类目录归档:技术

deb 软件包里都有什么

日常工作学习常常会在 Debian 系操作系统中完成,特别是最近自己开始打包、安装,发现 .deb 安装包甚至可以包含内核,且 Debian 就是通过这种方式来管理内核的,那么 deb 软件包中究竟有那些内容呢?

debDebian软件包 格式,文件扩展名.deb,跟Debian的命名一样,deb也是因Debra Murdock(Debian创始人Ian Murdock的前妻)而得名。处理这些包的经典程序是 dpkg ,经常是通过 apt 来运作。

流行的的 Ubunut,国内的 Deepin、麒麟等操作系统都是使用这一软件包格式进行软件包管理和分发的,今天就来简单探索一下 deb 软件包中都有什么东西。

这里以 dpkg 软件包为例,看一下这其中都包括了那些内容:

$ ar t dpkg_1.19.7_amd64.deb
debian-binary
control.tar.gz
data.tar.xz
$ ar x dpkg_1.19.7_amd64.deb
$ ls
control.tar.gz  data.tar.xz  debian-binary  dpkg_1.19.7_amd64.deb
$ tar tJf data.tar.xz | head -n 16
...
./etc/dpkg/
./etc/dpkg/dpkg.cfg
./etc/dpkg/dpkg.cfg.d/
...
$ tar tJf control.tar.xz
...
./control
...
$ cat debian-binary
2.0

使用 ar (建立,修改档案或从档案中抽取成员的软件工具)可以看到 Debian 包的 ar 存档格式由三个文件组成:

  • debian-binary : 指定软件包格式版本,在 Debian Buster 中它仍然是2.0版本。
  • control.tar.xz : 包含所有可用的 元信息,比如包的 名称版本,以及在(取消)安装之前、期间或之后运行的一些脚本。
  • data.tar.xzdata.tar.bz2data.tar.gz : 包含要从包中提取的所有文件; 这是存储可执行文件、库、文档等的地方。

这就是 deb 软件包中包含的内容,想要更详细的了解其中内容推荐大家阅读 《Debian管理员手册》,必将受益匪浅。

参考文献

Google Adsense 注意事项

最近刚刚通过了 Google Adsense 的审核,加入了其联盟,兴奋之余不忘思考,既然如此艰难的通过了审核,虽然我也不知道为什么之前为什么一直不通过(没有给出具体原因),我也不知道为什么突然就通过了。总之来之不易,一定加倍珍惜,多多输出好的内容来回报社会。

于是在这里记下我在网上搜索的,特别是结合了 Google Adsense 规范内容总结出的一些注意事项,未来需格外小心:

注意事项

  • 不要点击自己的 Google 广告。
  • 不要请求他人点击您的 Google 广告。
  • 仔细选择广告的展示位置。
  • 谨慎选择网站的推广方式。
  • 使用 Google Analytics(分析)。
  • 请勿篡改 AdSense 代码。
  • 不要使用弹出式提示或自动软件安装机制。

参考文献

CDN 中的 「回源HOST」与「源站」

在配置网站 CDN 时总是搞不清其中「回源HOST」与「源站」的区别,因此在这里简单记录。

源站和回源HOST的区别:

  • 源站:源站决定了回源时请求到的具体IP地址
  • 回源HOST:回源HOST决定了回源请求访问到该IP地址上的具体站点。回源HOST即回源域名,当源站服务器上提供多个域名服务时,CDN节点回源时在源站访问的具体站点域名。

例子一:源站是域名

如果源站为www.a.com,回源HOST为www.b.com。那么实际回源是请求到www.a.com解析到的IP地址其对应主机上的www.b.com站点。

例子二:源站是IP地址

源站为1.1.1.1,回源HOST为www.b.com。那么实际回源的是1.1.1.1对应主机上的www.b.com站点。

参考文献

新 Hugo 博客相关记录笔记

2021年10月21日,基于以下原因,我打算重建自己的博客,这次直接使用顶级域名:

  • blog.frytea.com 内容太过庞杂,不成体系,很难重新做规整;
  • blog.frytea.com 目前采用的付费主题虽然各方面做的都比较均衡,但是在google网站扫描过程中还是发现许多加载缓慢的因素,无法优化;
  • blog.frytae.com 作为我的主站申请 google adsense 多次没有通过,原因未知;
  • blog.frytea.com 目前主题由于其定位,无法作为一个个人网站的索引,目前是分成两套体系分别进行。

新网站目标

  • 内容成体系、有结构、有深度
  • 可作为个人引导页,引导到我的各种其他站点
  • SEO 友好
  • 包含各种宣传自己的页面:产品集、个人简历等;
  • 分专题来撰写文章:技术探索、奇思妙想、人生复盘;最终希望每一部分都能作为一本书进行。

新网站参考

网站定制开发参考

Homebrew 安装策略(M1芯片 Macbook)

换了 m1 芯片的 Macbook 之后第一个感受到的就是使用 homebrew 的不一样,由于不同的芯片架构,其安装方法也有不同,在这简单记录。

Arm Mac 安装步骤

# arm homebrew 同时设为国内源
/bin/zsh -c "$(curl -fsSL https://gitee.com/huwei1024/HomebrewCN/raw/master/Homebrew.sh)"

# 可在 .bashrc 追加下列内容实现 intel 和 arm 共存
alias abrew='arch -arm64 /opt/homebrew/bin/brew'
alias ibrew='arch -x86_64 /usr/local/bin/brew'

安装更新国内 homebrew 镜像源

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

说明

根据官方规划,ARM 版 Homebrew 必须安装在 /opt/homebrew 路径下,而非此前的 /usr/local/Homebrew

参考文献

pve-kernal 编译安装步骤

以 pve-release-6.x ,基于 debian buster 为例:

  • Step1: 配置国内 PVE 镜像源
# 配置 pve 软件包国内镜像源
$ echo "deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian buster pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
$ wget https://enterprise.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-6.x.gpg
  • Setp2:安装依赖包

Install build dependencies (i got these from the pve-kernel/debian/control file):

apt install asciidoc-base automake bc bison cpio debhelper dh-python file flex gcc git kmod libdw-dev libelf-dev libiberty-dev libnuma-dev libpve-common-perl libslang2-dev libssl-dev libtool lintian lz4 perl-modules python-minimal rsync sed sphinx-common tar xmlto zlib1g-dev
  • Step3:获取 pve-kernel 源码

Clone proxmox-kernel

git clone https://git.proxmox.com/git/pve-kernel.git
  • Step4:初始化子项目

initialize the submodules

make submodule

If that fails Fabian told me that you have cd in each submodule and do “git fetch –tags”

  • Step5:编译
make

It will build with ALL cores

会自动编译,不需要设置多线程,它会自动调用多线程编译。编译完当前目录的 .deb 包就是内核包,直接使用 dpkg -i 安装即可。

Q&A

  • dwarves_1.20 too old
echo 'deb http://ftp.de.debian.org/debian sid main' > /etc/apt/sources.list
sudo apt-get update
sudo install dwarves
  • 磁盘空间不足,扩容
# 查看当前磁盘的分区形式,确定新磁盘的盘符
$ fdisk -l
# 开始分区(以 /dev/vda 为例)
$ fdisk /dev/vda
# 键入 n 继续,保持默认即可
# 键入 p 查看分区
# 键入 w 将分区写入分区表
# 将分区表同步到系统
$ partprobe
# 设置新分区的格式(以 /dev/xvda6 为例)
$ mkfs -t ext4 /dev/xvda6
# 将新分区挂载 (以 /opt 为例)
$ mount /dev/xvda6 /opt
# 查看挂载结果
$ df -TH

参考文献

Tmux 使用笔记

Tmux 是一个终端复用器(terminal multiplexer),用起来就离不开。网上有很多 Tmux 使用指南,但是用下来发现还是自己整理一遍才能真正的记住,于是有了这篇文章,本文意在整理 tmux 最常用操作,详细的操作指南请移步 「tmux(1) manual page」。

基本概念

tmux采用C/S模型构建,输入tmux命令就相当于开启了一个服务器,此时将 新建一个会话(session),会话中默认新建一个窗口(window),窗口中默认新建一个面板 (pane)

  • 一个 tmux session 可以包含多个 windowwindow 默认充满 session
  • 一个 window 又可以包含多个 pane ,且都处于同一界面下。

常用操作

以下按照 Ctrl 和 Alt 的简写记录,周知。 C -> Ctrl A -> Alt

  • 新建和断开
tmux               # 新建一个无名称的会话
tmux new -s demo   # 新建一个名称为demo的会话
tmux detach        # 断开当前会话,会话在后台运行

tmux a             # 默认进入第一个会话
tmux a -t <>       # 进入之前的会话

tmux kill-session -t demo # 关闭demo会话
tmux ls                   # 查看所有会话

C-b d    # 断开当前会话
C-b C-Z  # 挂起当前会话

C-b c    # 新建 window
C-b &    # 关闭当前窗口(关闭前需输入y or n确认)

C-b "    # 下侧新建面板
C-b %    # 右侧新建面板
C-b x    # 关闭当前面板(关闭前需输入y or n确认)
  • 切换会话
C-b 0~9  # 切换到指定 window
C-b p    # 切换到上一 window
C-b n    # 切换到下一 window
C-b f    # 快速定位到 window(输入关键字匹配窗口名称)

C-b s    # 显示 session 列表,用于选择并切换
C-b w    # 显示 windows 列表,用于且切换窗口
C-b q    # 显示 pane 编号,在编号消失前输入对应的数字可切换面板

C-b ←↑→↓ # 移动光标切换 pane
C-b ;    # 切换到上一 pane
C-b o    # 切换到下一 pane
  • 调整布局
C-b !          # 将当前 pane 拆分为一个独立 window
C-b z          # 最大化当前面板,重复一次恢复正常(v1.8版本新增)
C-b {          # 向前置换当前面板
C-b }          # 向后置换当前面板
C-b C-o        # 顺时针旋转当前窗口中的所有面板
C-b A-o        # 逆时针旋转当前窗口中的所有面板
C-b space      # 在自带的面板布局中循环切换
C-b A + ←↑→↓   # 以5个单元格为单位调整当前面板边缘
C-b C + ←↑→↓   # 以1个单元格为单位调整当前面板边缘(Mac下被系统快捷键覆盖)

参考文献

正则表达式元字符

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

下面列出 iBM 帮助文档列出的 perl 正则表达式元字符

元字符 描述
\ 将下一个字符标记为特殊字符或字面值。例如, n 匹配字符 n ,而 \n 匹配 换行符。序列 \ 匹配 \,而 ( 匹配 ( 。
^ 匹配输入的开始部分。
$ 匹配输入的结束部分。
* 零次 或 更多次 匹配前面的字符。例如, zo* 匹配 z 或 zoo 。
+ 一次 或 更多次 匹配前面的字符。例如, zo+ 匹配 zoo ,但是 不匹配 z 。
? 零次 或 一次 匹配前面的字符。例如, a?ve? 匹配 never 中的 ve 。
. 匹配任何 单个字符,但换行符除外。
(pattern) 匹配模式并记住匹配项。通过使用以下代码,匹配的子串可以检索自生成的匹配项集合: Item [0]…[n] 。要匹配圆括号字符 ( ) ,请使用 ( 或 ) 。
x\|y 匹配 x 或 y 。 例如, z|wood 匹配 z 或 wood 。 (z|w)oo 匹配 zoo 或 wood 。
{n} n 是一个非负整数。精确匹配 n 次。例如, o{2} 不匹配 Bob 中的 o,但是匹配 foooood 中的 前两个 o 。
{n,} 在此表达式中, n 是一个非负整数。至少 n 次匹配前面的字符。例如, o{2,} 不匹配 Bob 中的 o ,但是匹配 foooood 中的所有 o 。 o{1,} 表达式等效于 o+ , o{0,} 等效于 o* 。
{n,m} m 和 n 变量是非负整数。至少 n 次且至多 m 次匹配前面的字符。例如, o{1,3} 匹配 fooooood 中的 前三个 o 。 o{0,1} 表达式等效于 o? 。
[xyz] 一个字符集。匹配任意一个包含的字符。例如, [abc] 匹配 plain 中的 a 。
[^xyz] 一个否定字符集。匹配任何未包含的字符。例如, [^abc] 匹配 plain 中的 p 。
[a-z] 字符范围。匹配指定范围中的任何字符。例如, [a-z] 匹配英语字母中的任何小写的字母字符。
[^m-z] 一个否定字符范围。匹配未在指定范围中的任何字符。例如, [m-z] 匹配未在范围 m 到 z 之间的任何字符。
\A 仅匹配字符串的开头。
\b 匹配 某个单词 边界,即,某个单词和空格之间的位置。例如, er\b 匹配 never 中的 er ,但是不匹配 verb 中的 er 。
\B 匹配 非单词 边界。 ea*r\B 表达式匹配 never early 中的 ear 。
\d 匹配数字字符。
\D 匹配非数字字符。
\f 匹配换页字符。
\n 匹配换行符。
\r 匹配回车字符。
\s 匹配任何空格,包括空白、制表符、换页字符等等。
\S 匹配任何 非空格 字符。
\t 匹配 跳进 字符。
\v 匹配 垂直跳进字符。
\w 匹配任何 单词字符,包括下划线。此表达式等效于 [A-Za-z0-9_] 。
\W 匹配任何 非单词字符。此表达式等效于 [^A-Za-z0-9__] 。
\z 仅匹配字符串的结尾。
\Z 仅匹配字符串的结尾,或者结尾的换行符之前。

参考文献

Cloud-init 概述及 PVE 下创建步骤说明

Cloud-init 是一个程序,它在启动时在客户机上运行,是用于 跨平台云实例初始化 的行业标准多分发方法。它支持所有主要的 公共云提供商、私有云基础设施的供应系统和裸机安装

云实例将由磁盘映像和实例数据初始化:

  • 云元数据
  • 用户数据(可选)
  • 供应商数据(可选)

Cloud-init 将识别在引导期间运行的云,从云中读取任何提供的 元数据,并相应地初始化系统。这可能涉及到设置网络、存储设备、配置 SSH 访问密钥和其他各种系统配置。之后,cloud-init 还将解析和处理传递给实例的任何可选用户或供应商数据。

Proxmox VE Cloud-Init 支持

Proxmox VE 支持 Cloud-init ,使用 Cloud-Init,就可以在管理程序端配置网络设备和 ssh 密钥。当 VM 第一次启动时,VM 中的 Cloud-Init 软件将应用这些设置。

Step 1: 准备 Cloud-Init 模板

许多发行版本已经提供了即时可用的 Cloud-Init 映像(作为 .qcow2 文件) ,所以你也可以直接下载和导入这样的镜像。在下面的例子中,我们将使用 Ubuntu https://cloud-images.Ubuntu.com 中心提供的云映像。

# 下载镜像
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

# 创建新的虚拟机
qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0

# 将下载好的磁盘镜像导入 local-lvm 存储
qm importdisk 9000 bionic-server-cloudimg-amd64.img local-lvm

# 最后将新的磁盘加载到虚拟机上作为 scsi 设备
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-1

Ubuntu Cloud-Init 映像需要 SCSI 驱动器的 virtio-SCSI-pci 控制器类型。

注:经过实测,除了 importdisk 步骤外,其余步骤均可在 PVE 的 web 面板上完成,建议终端操作并观察 web 变化后,再尝试纯 web 界面操作。

添加 Cloud-Init CD-ROM 驱动器

下一步是配置 CD-ROM 驱动器,用于将 Cloud-Init 数据传递给 VM。

qm set 9000 --ide2 local-lvm:cloudinit

要能够直接从 Cloud-Init 映像引导,需要将引导磁盘参数设置为 scsi0 ,并将 BIOS 限制为仅从磁盘引导。这将加速引导,因为 VM BIOS 会跳过可引导 CD-ROM 的测试。

qm set 9000 --boot c --bootdisk scsi0

还要配置一个串行控制台并将其用作显示器。许多 Cloud-Init 映像都依赖于此,因为这是 OpenStack 映像的一个需求。

qm set 9000 --serial0 socket --vga serial0

在最后一个步骤中,将 VM 转换为模板会很有帮助。然后,您可以从这个模板快速创建链接克隆。从 VM 模板进行部署要比创建完整的克隆(副本)快得多。

qm template 9000

Step 2: 部署 Cloud-Init 模板

您可以通过克隆轻松地部署这样的模板:

qm clone 9000 123 --name ubuntu2

然后配置用于身份验证的 SSH 公钥,并配置 IP 设置(可选):

qm set 123 --sshkey ~/.ssh/id_rsa.pub
qm set 123 --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1

此外还可以配置 DNS 域等,更多配置项请查看 PVE 官网 Cloud-Init Support

之后启动虚拟机,即可验证之前的配置是否生效。

参考文献

一个 Notion 一站式记账复盘看板系统 | BJ-PFD 正式发布

今天发生了不少事情,孟晚舟历经千余天终于归国,探访了某通信城,再次回味某一本哈利波特,后被堵在 Apple Store 外面,滑了两下 Pixel 3,汇总了下旧红包,继续设计另一个 full-stack 作品,以及继续努力工作。

而这篇文章,我就是想说,我的个人开发项目 BJ-PFD 携完整文档来跟大家见面啦!

https://imagehost-cdn.frytea.com/images/2021/09/25/2021-09-25-11.26.4728c378eb1d0358d7.png

前阵子用 Notion 制作了一整套 Bullet Journal 模版,记账、查账、复盘、回忆在这里都能搞定啦,自从发现了这个好物我几乎每天都会用它进行复盘和记账,每月结束时我也可以很方便的进行每月的复盘总结。我的生活就在这不知不觉间变得更有价值,幸福感和价值感也越来越强。

https://imagehost-cdn.frytea.com/images/2021/09/25/2021-09-25-11.27.49d4699c755bdaca81.png

做了这套系统后,最主要解决我个人的就是财务问题了。刚毕业时待遇不高,为了避免产生财务危机,每一笔支出都要有设计有目的的流出。等到有一些积累了,就需要分门别类的去让自己的财产发挥更大的价值,结合目标管理、愿望清单等功能,可以避免许多不必要的消费,让来之不易的血汗钱用在刀刃上。

https://imagehost-cdn.frytea.com/images/2021/09/25/2021-09-25-11.30.51645af1df2e1e64f0.png

除了这些,这套「系统」还提供了许多日常可以用到的小功能,都是从个人实用主义出发,目的是提升个人价值感和幸福感

https://imagehost-cdn.frytea.com/images/2021/09/25/2021-09-25-11.32.0200b9925db1a895ce.png

还有更多内容,可以去文档中慢慢探索哟,在「文档」页,可以看「快速预览」查看整个项目效果,可以看「快速入门」快速的将这个模版私有化,更详细的内容等你有兴趣了慢慢探索。

要问文档在哪里找呢?

https://imagehost-cdn.frytea.com/images/2021/09/25/2021-09-25-11.34.09213ecdeefee0efb9.png

项目主页有一个大大的按钮,点一下就可以了。

希望这个项目也能带给你一些启发和收获,希望对你有用。最后附上项目链接,欢迎访问。

? BJ-PFD 项目入口:https://bjpfd.frytea.com

系列文章