From cbeb4b0b2e31555801bcf107ba0089737360a5a1 Mon Sep 17 00:00:00 2001 From: Anonymous <458892+aieu@users.noreply.github.com> Date: Tue, 26 Sep 2023 17:05:27 +0800 Subject: [PATCH] update post --- CNAME | 2 +- _data/blogroll.json | 8 - .../localizing-sublime-text-3.md | 0 .../nginx-redirect-http-request-to-https.md | 0 ...-ssl-security-for-apache-nginx-lighttpd.md | 0 _posts/2009-09-29-gentoo-installation.md | 2 - _posts/2010-12-13-openssh.md | 39 ++- _posts/2011-06-13-git-usage.md | 10 + _posts/2011-08-09-simple-method-for-mysql.md | 12 +- _posts/2011-08-18-how-to-use-sqlite.md | 2 +- _posts/2011-08-18-sqlite-command.md | 2 +- _posts/2011-09-08-php-sqlite-e-g.md | 2 +- _posts/2011-09-08-php-sqlite-function.md | 2 +- _posts/2012-07-18-gnupg-usage.md | 98 ++++++-- _posts/2013-12-01-try-freebsd-again.md | 2 +- _posts/2014-03-28-find-depend-on-gentoo.md | 40 +-- _posts/2014-05-13-gentoo-reinstall.md | 5 +- ...4-copy-backup-and-mirror-image-on-linux.md | 31 +-- _posts/2014-12-31-centos-7-records.md | 184 +++++--------- _posts/2015-12-25-efi-boot-stub-for-gentoo.md | 17 +- _posts/2015-12-26-bsod-on-boot-0xc0000034.md | 2 +- _posts/2018-01-20-recover-gcc-on-gentoo.md | 10 +- _posts/2020-06-12-zeropi-record.md | 115 +++++---- ...20-committing-changes-to-a-pull-request.md | 48 ++++ _posts/2021-05-25-gentoo-on-wsl2.md | 123 +++++++++ _posts/2021-06-22-migration-to-25519.md | 234 ++++++++++++++++++ _posts/2022-03-08-perfer-ipv4.md | 58 +++++ ...3-02-18-enable-promiscuous-mode-on-nics.md | 66 +++++ about.md | 10 +- 29 files changed, 826 insertions(+), 298 deletions(-) rename _posts/2014-08-09-localizing-sublime-text-3.md => _drafts/localizing-sublime-text-3.md (100%) rename _posts/2015-08-21-nginx-redirect-http-request-to-https.md => _drafts/nginx-redirect-http-request-to-https.md (100%) rename _posts/2015-06-10-strong-ssl-security-for-apache-nginx-lighttpd.md => _drafts/strong-ssl-security-for-apache-nginx-lighttpd.md (100%) create mode 100644 _posts/2020-09-20-committing-changes-to-a-pull-request.md create mode 100644 _posts/2021-05-25-gentoo-on-wsl2.md create mode 100644 _posts/2021-06-22-migration-to-25519.md create mode 100644 _posts/2022-03-08-perfer-ipv4.md create mode 100644 _posts/2023-02-18-enable-promiscuous-mode-on-nics.md diff --git a/CNAME b/CNAME index bf8033263..e302e78ce 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -havee.me \ No newline at end of file +havee.me diff --git a/_data/blogroll.json b/_data/blogroll.json index fdd49e86c..21bdc05f7 100644 --- a/_data/blogroll.json +++ b/_data/blogroll.json @@ -1,16 +1,8 @@ [ - { - "title": "刘静的博客", - "url": "//upliu.net" - }, { "title": "小天地,大世界", "url": "//www.lyblog.net" }, - { - "title": "woodelf@Gentoo", - "url": "//blog.woodelf.org" - }, { "title": "华米兹之家", "url": "//zhaoyuxiang.cn" diff --git a/_posts/2014-08-09-localizing-sublime-text-3.md b/_drafts/localizing-sublime-text-3.md similarity index 100% rename from _posts/2014-08-09-localizing-sublime-text-3.md rename to _drafts/localizing-sublime-text-3.md diff --git a/_posts/2015-08-21-nginx-redirect-http-request-to-https.md b/_drafts/nginx-redirect-http-request-to-https.md similarity index 100% rename from _posts/2015-08-21-nginx-redirect-http-request-to-https.md rename to _drafts/nginx-redirect-http-request-to-https.md diff --git a/_posts/2015-06-10-strong-ssl-security-for-apache-nginx-lighttpd.md b/_drafts/strong-ssl-security-for-apache-nginx-lighttpd.md similarity index 100% rename from _posts/2015-06-10-strong-ssl-security-for-apache-nginx-lighttpd.md rename to _drafts/strong-ssl-security-for-apache-nginx-lighttpd.md diff --git a/_posts/2009-09-29-gentoo-installation.md b/_posts/2009-09-29-gentoo-installation.md index 837f987b0..9a76735a8 100644 --- a/_posts/2009-09-29-gentoo-installation.md +++ b/_posts/2009-09-29-gentoo-installation.md @@ -112,9 +112,7 @@ OK,准备工作完成。 en_US ISO-8859-1 en_US.UTF-8 UTF-8425 zh_CN.GB18030 GB18030 - zh_CN.GBK GBK zh_CN.UTF-8 UTF-8 - zh_CN GB2312 更新环境 diff --git a/_posts/2010-12-13-openssh.md b/_posts/2010-12-13-openssh.md index 3c2fc6c9c..be8df3920 100644 --- a/_posts/2010-12-13-openssh.md +++ b/_posts/2010-12-13-openssh.md @@ -36,24 +36,41 @@ tags: [Openssh, Usage] #### 创建密钥对 +推荐 ed25519,已在 OpenSSH 6.5 中加入支持 + + ssh-keygen -t ed25519 -C "First.Last@somewhere.com" ssh-keygen -t rsa -b 4096 -C "First.Last@somewhere.com" - # 或 ssh-keygen -t ecdsa -b 521 -C "First.Last@somewhere.com" - # 验证公钥指纹 - ssh-keygen -E md5 -lf ~/.ssh/id_rsa.pub - # 从私钥创建公钥 - ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub - # 修改私钥口令 - ssh-keygen -p -f ~/.ssh/id_dsa + + +验证公钥指纹 + + ssh-keygen -E md5 -lf ~/.ssh/your_pubkey + +从私钥创建公钥 + + ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/your_pubkey + +修改私钥口令 + + ssh-keygen -p -f ~/.ssh/your_pubkey #### 重新生成服务器密钥 rm -v /etc/ssh/ssh_host_* + ssh-keygen -A + systemctl restart ssh + +或者手动生成各自需要的服务器密钥 + + ssh-keygen -q -N "" -t ed25519 -f /etc/ssh/ssh_host_ed25519_key ssh-keygen -q -N "" -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key ssh-keygen -q -N "" -t ecdsa -b 521 -f /etc/ssh/ssh_host_ecdsa_key - ssh-keygen -q -N "" -t dsa -b 1024 -f /etc/ssh/ssh_host_dsa_key + ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key systemctl restart ssh - # debian 用户可以用如下方式 + +debian 用户可以用如下方式 + rm -v /etc/ssh/ssh_host_* dpkg-reconfigure openssh-server # debian systemctl restart ssh @@ -68,7 +85,7 @@ tags: [Openssh, Usage] Host hostname IdentityFile ~/.ssh/your-private-key - HostName ip + HostName ip or domain Port port User username @@ -126,8 +143,6 @@ ssh-agent 一般人用不到,不过还是挺有用的,概念不介绍了。 Protocol 2 Compression yes -好了,当你 `ssh host1` 之后,可以登陆同样公钥的第三台机器了。 - #### ProxyCommand 不过,并不是所有的机子的公钥是一致的,但是有不得不使用其中一台作为跳板,那么我们就使用这个参数了 diff --git a/_posts/2011-06-13-git-usage.md b/_posts/2011-06-13-git-usage.md index fb08658cf..ab3c688bb 100644 --- a/_posts/2011-06-13-git-usage.md +++ b/_posts/2011-06-13-git-usage.md @@ -186,6 +186,16 @@ github 回滚 $ git gc --prune=0 $ git reflog expire --expire-unreachable=0 --all +获取最近 10 个 commit 历史 + + $ git clone --depth 10 https://github.com/user/repo.git + +在本地已有项目上保留 10 个历史记录 + + $ git fetch origin --depth 10 + # 如有冲突,则 + $ git reset --merge refs/remotes/origin/master + #### commit 历史操作 永久删除历史文件 diff --git a/_posts/2011-08-09-simple-method-for-mysql.md b/_posts/2011-08-09-simple-method-for-mysql.md index b677c8212..ba7dec70e 100644 --- a/_posts/2011-08-09-simple-method-for-mysql.md +++ b/_posts/2011-08-09-simple-method-for-mysql.md @@ -1,7 +1,7 @@ --- layout: post title: "MySQL 简单操作 (笔记)" -category: SQL +category: Other tags: [MySQL, CLI] --- @@ -244,23 +244,23 @@ or 备份molyx到文件molyx.sql - mysqldump -uroot -p molyx > /your/path/molyx.sql + mysqldump -uusername -ppassword molyx > /your/path/molyx.sql 备份全部数据 - mysqldump -uroot -p --all-databases > /your/path/backup.sql + mysqldump -uroot -ppassword --all-databases > /your/path/backup.sql 备份molyx并压缩 - mysqldump -u root -p molyx | gzip > /your/path/molyx.sql.gz + mysqldump -uusername -ppassword molyx | gzip > /your/path/molyx.sql.gz 将molyx.sql导入到数据库 - mysqlimport -uroot -p < /your/path/molyx.sql + mysql -uusername -ppassword molyx < /your/path/molyx.sql 将压缩文件molyx.sql.gz中数据恢复到molyx库 - gzip < molyx.sql.gz | mysql -uroot -p --database molyx + gzip < molyx.sql.gz | mysql -uusername -ppassword molyx 将文本数据导入数据库: diff --git a/_posts/2011-08-18-how-to-use-sqlite.md b/_posts/2011-08-18-how-to-use-sqlite.md index a3a39d834..d0e61051c 100644 --- a/_posts/2011-08-18-how-to-use-sqlite.md +++ b/_posts/2011-08-18-how-to-use-sqlite.md @@ -1,7 +1,7 @@ --- layout: post title: "SQLite 命令行程序说明" -category: SQL +category: Other tags: [SQLite, CLI, Usage] --- diff --git a/_posts/2011-08-18-sqlite-command.md b/_posts/2011-08-18-sqlite-command.md index 11f922041..79811064d 100644 --- a/_posts/2011-08-18-sqlite-command.md +++ b/_posts/2011-08-18-sqlite-command.md @@ -1,7 +1,7 @@ --- layout: post title: "SQLite 命令" -category: SQL +category: Other tags: [SQLite, CLI, Usage] --- diff --git a/_posts/2011-09-08-php-sqlite-e-g.md b/_posts/2011-09-08-php-sqlite-e-g.md index d0472d424..cbcd7c3c0 100644 --- a/_posts/2011-09-08-php-sqlite-e-g.md +++ b/_posts/2011-09-08-php-sqlite-e-g.md @@ -1,7 +1,7 @@ --- layout: post title: "PHP SQLite 示例" -category: SQL +category: Other tags: [PHP, SQLite, Usage] --- diff --git a/_posts/2011-09-08-php-sqlite-function.md b/_posts/2011-09-08-php-sqlite-function.md index b166f364f..6b2cec130 100644 --- a/_posts/2011-09-08-php-sqlite-function.md +++ b/_posts/2011-09-08-php-sqlite-function.md @@ -1,7 +1,7 @@ --- layout: post title: "PHP SQLite 函数库" -category: SQL +category: Other tags: [PHP, SQLite, Function] --- diff --git a/_posts/2012-07-18-gnupg-usage.md b/_posts/2012-07-18-gnupg-usage.md index 1cf7f8ba6..200ce198e 100644 --- a/_posts/2012-07-18-gnupg-usage.md +++ b/_posts/2012-07-18-gnupg-usage.md @@ -21,7 +21,7 @@ GnuPG 是实现安全通信和数据存储的一系列工具集,可以做加 6. 支持多种加密算法 7. 支持扩展模块 8. 用户标识遵循标准结构 -9. 多语言支持(尚未支持中文) +9. 多语言支持 10. 支持匿名信息接收 11. 支持HKP密钥服务 @@ -34,7 +34,7 @@ GnuPG 是实现安全通信和数据存储的一系列工具集,可以做加 - \[A\]: 用于身份认证 - \[C\]: 主密钥特有,用于认证子密钥 -密钥算法,其中 ECC 算法,需要在生成密钥对命令时添加参数 --expert,顾名思义,专家模式 +密钥算法 - RSA - ElGamal @@ -44,6 +44,8 @@ GnuPG 是实现安全通信和数据存储的一系列工具集,可以做加 - EdDSA - ... +ECC 算法,在版本 2.1.0 ,支持 ed25519 数字签名,在版本 2.1.7 ,支持 curve25519 加密,需要在操作时时添加参数 `--expert`,顾名思义,专家模式 + #### 二、命令 ##### 创建主密钥对 @@ -79,17 +81,17 @@ GnuPG 是实现安全通信和数据存储的一系列工具集,可以做加 ##### 私钥处理 $ gpg --armor --output filename.asc --export-secret-keys KEY_ID # 导出 ID 的主私钥,不加用户标志,则导出所有主私钥 - $ gpg --armor --output filename.asc --export-secret-subkeys SUBKEY_ID # 导出 sub ID 的子密钥私钥 + $ gpg --armor --output filename.asc --export-secret-subkeys SUBKEY_ID! # 导出 sub ID 的子密钥私钥 $ gpg --list-secret-keys|-K # 显示所有私钥 ##### 其他 - $ gpg --import Havee.asc # 导入私钥或公钥 + $ gpg --import filename.asc # 导入私钥或公钥 $ gpg --delete-secret-and-public-key KEY_ID # 删除私钥和公钥 $ gpg --delete-secret-key KEY_ID # 删除私钥 $ gpg --delete-key KEY_ID # 删除公钥 - $ gpg --edit-key Havee # 编辑密钥,要帮助输入 help + $ gpg --edit-key KEY_ID # 编辑密钥,要帮助输入 help gpg> help quit 退出此菜单 save 保存并退出 @@ -140,38 +142,86 @@ GnuPG 是实现安全通信和数据存储的一系列工具集,可以做加 ##### 加密与解密 - $ gpg -e -r Havee.asc filename # 使用 Havee 的公钥文件对 filename 加密,生成二进制 filename.pgp - $ gpg -ea -r Havee filename -o filename.asc # 同上,不过以 ASCII 方式输入结果,并输出 asc 文件 - $ gpg -d filename.pgp -o filename # 对 filename.pgp 解密,保存为 filename + $ gpg -r filename.asc -e filename # 使用公钥文件对 filename 加密,生成二进制 filename.pgp + $ gpg -r KEY_ID -o filename.asc -ea filename # 同上,不过以 ASCII 方式输入结果,并输出 asc 文件 + $ gpg -o filename -d filename.pgp # 对 filename.pgp 解密,保存为 filename ##### 打包方式进行签名与验证 - $ gpg -s filename # 使用默认的用户对 filename 进行打包方式的签名 - $ gpg -u Havee -s filename -o filename.sig # 使用指定的用户 Havee 对 filename 进行签名 - $ gpg --verify filename.gpg # 验证签名 - $ gpg -d filename.gpg -o filename # 解包并验证签名 + $ gpg -s filename # 使用默认的用户对 filename 进行打包方式的签名 + $ gpg -u KEY_ID -s filename # 使用指定的用户 KEY_ID 对 filename 进行签名 + $ gpg --verify filename.gpg # 验证签名 + $ gpg -o filename -d filename.gpg # 解包并验证签名 ##### 分离方式进行签名与验证 $ gpg -sb filename - $ gpg -u Havee -sb filename - $ gpg -u Havee -o filename.sig -sb filename - $ gpg --verify filename.gpg filename + $ gpg -u KEY_ID -sb filename + $ gpg --verify filename.sig filename ##### 签名并加密 - $ gpg -es -r Havee -u Havee -o filename.gpg filename # 使用 Havee 的公钥进行加密,并使用 Havee 的私钥进行签名,生成的二进制文件是 filename.gpg - $ gpg -esa -r Havee -u Havee -o filename.asc filename # 同上,加上以 ASCII 编码 + $ gpg -r KEY_ID -es filename # 使用指定的公钥进行加密并签名,生成的二进制文件是 filename.gpg + $ gpg -r KEY_ID -o filename.asc -esa filename # 同上,加上以 ASCII 编码 -##### mutt 中的使用 +###### 签名加密时常用参数 + + -s, --sign # 签名 + -b, --detach-sign # 分离式签名,文件与签名分开 + -e, --encrypt # 加密 + -d, --decrypt # 解密 + -a, --armor # ascii 编码输出,一般与 -o file 搭配 + -o, --output FILE # 输出文件 + -r, --recipient USER-ID # 以特定的 ID 去加密 + -u, --local-user USER-ID # 以特定的 ID 去签名或解密 + +##### 作为 ssh 公钥 + +如果想将 gpg 作为 ssh 公钥,则在创建子钥的时候,需要创建一个 [A] 用途的专用子钥。 + +编辑 **~/.gnupg/gpg-agent.conf**,加入 + + enable-ssh-support + +编辑你的 **~/.bashrc** 或 **~/.zshrc**,加入如下,并最后重新载入下 **source ~/.bashrc** 或 **source ~/.zshrc**,原本写入 ssh-agent 相关的内容,也可以注释掉了 + + [[ -f /usr/bin/gpg-agent ]] && export GPG_TTY=$(tty) + [[ -n "$SSH_CONNECTION" ]] && export PINENTRY_USER_DATA="USE_CURSES=1" + unset SSH_AGENT_PID + if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then + export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) + fi + +编辑 **~/.ssh/config**,加入 + + Match host * exec "gpg-connect-agent updatestartuptty /bye > /dev/null" + +获取子钥的 keygrip -编辑 `~/.gnupg/gpg.conf`,注销下面两行 + $ gpg --with-keygrip --list-key KEY_ID - ... - keyserver hkp://keys.gnupg.net - ... - keyserver-options auto-key-retrieve - ... +将对应子匙的 keygrip 插入到 **~/.gnupg/sshcontrol** 中 + + $ echo xxxxxxyour-keygripxxxxxx >> ~/.gnupg/sshcontrol + +重启下 gpg-agent + + $ gpg-connect-agent reloadagent /bye + +接下来就可以检查下,ssh 验证列表中,是否存在公钥了 + + $ ssh-add -l + +最后将上面的公钥添加到你的远程服务器,或 github 的 gpg 列表中即可 + +###### 针对 github + +如果有多个项目处于 github 的不同账户中,你可能需要针对不同项目配置不同的密钥 + + gpg --export-ssh-key subkey! > .ssh/repo-1 + git config --local core.sshCommand "ssh -i ~/.ssh/repo-1" # 项目文件夹内执行 + +##### mutt 中的使用 复制 mutt 示例配置文件至 mutt 配置目录 diff --git a/_posts/2013-12-01-try-freebsd-again.md b/_posts/2013-12-01-try-freebsd-again.md index f748d1f7b..a7c470948 100644 --- a/_posts/2013-12-01-try-freebsd-again.md +++ b/_posts/2013-12-01-try-freebsd-again.md @@ -1,7 +1,7 @@ --- layout: post title: "再次尝试 FreeBSD" -category: "BSD" +category: "Other" tags: [freebsd] --- diff --git a/_posts/2014-03-28-find-depend-on-gentoo.md b/_posts/2014-03-28-find-depend-on-gentoo.md index 75d8613cb..b45d21222 100644 --- a/_posts/2014-03-28-find-depend-on-gentoo.md +++ b/_posts/2014-03-28-find-depend-on-gentoo.md @@ -5,43 +5,11 @@ category: Linux tags: [Gentoo, Packager] --- -看到 Maxthon 发布了 Linux 版本,Gentoo 同学速度很快,ebuild 已经提交到 Gentoo-zh 中,不过为了验证依赖是否全部满足,临时写了个脚本去验证。 +- 通过objdump去获取库信息,过滤 +- 再通过 `equery b file` 连网查询,获取软件包名 -几步走: - -1. 下载二进制包,解压 -2. `ldd file`,确定需要的库文件 -3. 取第一结果,排序,去除重复数据 -4. `equery b name.so` 去网络上获取软件包名 - - - -很简单,当然 `equery b name.so` 是在线查询,有时网络环境不好的时候,需要耗费些时间很长,甚至返回空的查询结果。 +以 `/bin/cp` 为例 ```shell -#! /usr/bin/env sh -# -# depend.sh -# -# Depends on app-portage/pfl -# -# use it on Gentoo - -exefile=$1 -tmpfile="/tmp/${exefile}.so.show" - -[[ -f ${tmpfile} ]] && rm -rf ${tmpfile} - -for so in $(ldd ${exefile} | awk '{print $1}' | sort | uniq ); do - [[ ! -f $so ]] && echo $so >> /tmp/${exefile}.so -done - -for so in $(cat /tmp/${exefile}.so); do - echo "$so need:" - equery b $so - echo "" -done >> ${tmpfile} - -rm /tmp/${exefile}.so -cat ${tmpfile} +objdump -p /bin/cp | grep NEEDED | awk '{print $2}' | xargs equery b | sort | uniq ``` diff --git a/_posts/2014-05-13-gentoo-reinstall.md b/_posts/2014-05-13-gentoo-reinstall.md index fc32aaa69..5141bb852 100644 --- a/_posts/2014-05-13-gentoo-reinstall.md +++ b/_posts/2014-05-13-gentoo-reinstall.md @@ -21,7 +21,9 @@ liveusb 点亮机子,下载最新的 stage 与 portage 后,各种 mount 后 mount /dev/sda2 /mnt/gentoo mount -t proc proc /mnt/gentoo/proc mount --rbind /sys /mnt/gentoo/sys + mount --make-rslave /mnt/gentoo/sys mount --rbind /dev /mnt/gentoo/dev + mount --make-rslave /mnt/gentoo/dev chroot /mnt/gentoo /bin/bash env-update && . /etc/profile emerge --sync @@ -40,9 +42,6 @@ liveusb 点亮机子,下载最新的 stage 与 portage 后,各种 mount 后 nano -w /etc/fstab nano -w /etc/hosts passwd root - emerge syslog-ng - rc-update add syslog-ng default - emerge mlocate emerge dhcpcd 然后安装 syslinux diff --git a/_posts/2014-12-14-copy-backup-and-mirror-image-on-linux.md b/_posts/2014-12-14-copy-backup-and-mirror-image-on-linux.md index e4156460f..2838f1489 100644 --- a/_posts/2014-12-14-copy-backup-and-mirror-image-on-linux.md +++ b/_posts/2014-12-14-copy-backup-and-mirror-image-on-linux.md @@ -96,21 +96,22 @@ tags: [CLI] - -i: input 模式,还原备份档 - -o: output 模式,建立备份档 - -p: Pass-through 模式,直接将文件复制到目的目录 - - -t: 查看档案文件,仅使用在 i 模式下 - - -c: 使用旧的 POSIX portable 方式存储,o 模式专用 - - -v: 将存取过程打印到屏幕上 - - -d: 自动建立目录,i & p 模式专用 - - -A: 追加文件到备份档,o 模式专用 - - -B: 存取块大小设置成 5120 byte,o 模式专用 - - -C: 存取块大小,单位是 byte,O 模式专用 - - -L: 若存在软链接档案,则链接档案的属性,而非链接本身,o & p 模式专用 - - -m: 创建文件时,保留以前文件的修改时间,i & p 模式专用 - - -u: 置换所有文件,不论日期时间的新旧与否,皆不予询问而直接覆盖 +- -t: 查看档案文件,仅使用在 i 模式下 +- -a: 重新设置文件的存取时间 +- -c: 使用旧的 POSIX portable 方式存储,o 模式专用 +- -d: 自动建立目录,i & p 模式专用 +- -m: 创建文件时,保留以前文件的修改时间,i & p 模式专用 +- -u: 置换所有文件,不论日期时间的新旧与否,皆不予询问而直接覆盖 +- -v: 将存取过程打印到屏幕上 +- -A: 追加文件到备份档,o 模式专用 +- -B: 存取块大小设置成 5120 byte,o 模式专用 +- -C: 存取块大小,单位是 byte,O 模式专用 +- -L: 若存在软链接档案,则链接档案的属性,而非链接本身,o & p 模式专用 常见的使用场景 - find /path/to/dir | cpio -ocvB > /path/to/name.cpio # o 模式,打包目录成 cpio 档案 - find /. | cpio -ocvB > /path/to/system.cpio # o 模式,备份整个系统 - cpio -ivt < /path/to/name.cpio # i 模式,列出 name.cpio 的文件 - cpio -idmv < /path/to/name.cpio # i 模式,还原 cpio 档案 - find /path/to/dir1 | cpio -pvd > /path/to/dir2 # p 模式,直接复制文件到新目录 + find /path/to/dir -print0 | cpio --null -oacvB > /path/to/name.cpio # o 模式,打包目录成 cpio 档案 + find /. | cpio -oacvB > /path/to/system.cpio # o 模式,备份整个系统 + cpio -ivt < /path/to/name.cpio # i 模式,列出 name.cpio 的文件 + cpio -idmuv < /path/to/name.cpio # i 模式,还原 cpio 档案 + find /path/to/dir -print0 | cpio --null -pvd /path/to/dir1 # p 模式,直接复制文件到新目录 diff --git a/_posts/2014-12-31-centos-7-records.md b/_posts/2014-12-31-centos-7-records.md index 5749e5bbc..ac24f9cb0 100644 --- a/_posts/2014-12-31-centos-7-records.md +++ b/_posts/2014-12-31-centos-7-records.md @@ -184,9 +184,8 @@ tags: [Nginx, PHP, PHP-FPM, SQL, Tips, CentOS] #### zram -swap 频繁交换会极大的影响主机性能,现在一般对小内存主机,使用 zram,不过 CentOS 7 并没有提供管理脚本,自己创建一个,以来 `bc` +swap 频繁交换会极大的影响主机性能,现在一般对小内存主机,使用 zram,不过 CentOS 7 并没有提供管理脚本,自己创建一个 - # yum install bc # touch /etc/init.d/zramswap # chmod +x /etc/init.d/zramswap @@ -194,99 +193,62 @@ swap 频繁交换会极大的影响主机性能,现在一般对小内存主机 ``` #!/bin/bash -### BEGIN INIT INFO -# Provides: zram -# Required-Start: -# Required-Stop: -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Virtual Swap Compressed in RAM -# Description: Virtual Swap Compressed in RAM -### END INIT INFO -start() { - # get the number of CPUs - num_cpus=$(grep -c processor /proc/cpuinfo) - # if something goes wrong, assume we have 1 - [ "$num_cpus" != 0 ] || num_cpus=1 - - # set decremented number of CPUs - decr_num_cpus=$((num_cpus - 1)) - - # get the amount of memory in the machine - mem_total_kb=$(grep MemTotal /proc/meminfo | grep -E --only-matching '[[:digit:]]+') - - #we will only assign 50% of system memory to zram - mem_total_kb=$((mem_total_kb / 2)) +NUM_CPUS=$(nproc) +[ "$NUM_CPUS" != 0 ] || NUM_CPUS=1 +NUM_DEVS=$NUM_CPUS +FACTOR=50 # percentage +TOTALRAM=$(grep MemTotal /proc/meminfo | awk ' { print $2 } ') +DISK_SIZE=$(($TOTALRAM/$NUM_CPUS*$FACTOR/100*1024)) - mem_total=$((mem_total_kb * 1024)) +# show supported compression algorithms: `cat /sys/block/zram*/comp_algorithm` +# select your compression algorithm, lzo is the default +# speed: lz4 > zstd > lzo +# compression: zstd > lzo > lz4 +COMP_ALGORITHMS=lzo - # load dependency modules - modprobe zram num_devices=$num_cpus +#Defaults for vm.overcommit_memory, vm.page-cluster, vm.swappiness +OVERCOMMIT_MEMORY=0 +PAGE_CLUSTER=3 +SWAPPINESS=100 - # initialize the devices - for i in $(seq 0 $decr_num_cpus); do - echo $((mem_total / num_cpus)) > /sys/block/zram$i/disksize - done - # Creating swap filesystems - for i in $(seq 0 $decr_num_cpus); do - mkswap /dev/zram$i - done - - # Switch the swaps on - for i in $(seq 0 $decr_num_cpus); do - swapon -p 100 /dev/zram$i - done +start() { + [ ! -e /sys/module/zram ] && modprobe zram num_devices=$NUM_DEVS || modprobe -r zram && modprobe zram num_devices=$NUM_DEVS + for i in /sys/block/zram*; do + /usr/bin/echo $COMP_ALGORITHMS > ${i}/comp_algorithm; + /usr/bin/echo $DISK_SIZE > ${i}/disksize; + done + + for i in /dev/zram*; do + /usr/sbin/mkswap ${i}; + /usr/sbin/swapon -d -p100 ${i}; + done + + echo 1 > /proc/sys/vm/overcommit_memory + echo 0 > /proc/sys/vm/page-cluster + echo 100 > /proc/sys/vm/swappiness } stop() { - for i in $(grep '^/dev/zram' /proc/swaps | awk '{ print $1 }'); do - swapoff "$i" - done - - if grep -q "^zram " /proc/modules; then - sleep 1 - rmmod zram - fi -} + [ ! -e /sys/module/zram ] && exit 0 + + echo $OVERCOMMIT_MEMORY > /proc/sys/vm/overcommit_memory + echo $PAGE_CLUSTER > /proc/sys/vm/page-cluster + echo $SWAPPINESS > /proc/sys/vm/swappiness -status() { - ls /sys/block/zram* > /dev/null 2>&1 || exit 0 - echo -e "-------\nzram Compression Stats:\n-------" - for i in /sys/block/zram*; do - compr=$(< $i/compr_data_size) - orig=$(< $i/orig_data_size) - ratio=0 - if [ $compr -gt 0 ]; then - ratio=$(echo "scale=2; $orig*100/$compr" | bc -q) - fi - echo -e "/dev/${i/*\/}:\t$ratio% ($orig -> $compr)" - done - echo -e "-------\nSWAP Stats:\n-------" - swapon -s | grep zram - echo -e "-------\nMemory Stats:\n-------" - free -m -l -t + for i in /dev/zram*; do + /usr/sbin/swapoff ${i}; + done + + for i in /sys/block/zram*; do + /usr/bin/echo 1 > ${i}/reset; + done + [ -e /sys/module/zram ] && modprobe -r zram } -case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - stop - sleep 3 - start - ;; - status) - status - ;; - *) - echo "Usage: $0 {start|stop|restart|status}" - RETVAL=1 +case $1 in + (start|stop) "$1" ;; esac ``` @@ -322,56 +284,28 @@ Linux Tovalds 于 2016 年 12 月 11 日发布了 Kernel 4.9 正式版本,带 ##### 安装 -要在 CentOS 上安装最新的内核版本,我们需要增加一个 [ELRepo](http://elrepo.org/tiki/tiki-index.php) 源。 - -首先,让我们添加 ELRepo GPG key: - - rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org - -为 RHEL-6,SL-7,CentOS-7 源: - - rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm - -老版本也可以享受 kernel 4.9,譬如为 RHEL-6,SL-6,CentOS-6 添加 ELRepo 源: - - rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm +现在升级内核,没有那么复杂,也无需安装第三方源,在 CentOS-7.3.1611 之后用自带 repo 的即可,只需一行命令 -为 RHEL-5,SL-5,CentOS-5 添加 ELRepo 源: + # yum --enablerepo=centos-kernel update - rpm -Uvh http://www.elrepo.org/elrepo-release-5-5.el5.elrepo.noarch.rpm +或者编辑文件 `/etc/yum.repos.d/CentOS-x86_64-kernel.repo `,在 `[centos-kernel]` 下 -当然,别忘了 fastestmirror 还是需要的 - - yum install yum-plugin-fastestmirror - -最后,安装 kernel 4.9 - - yum --enablerepo=elrepo-kernel install kernel-ml - -当然,将 kernel-ml 选为第一启动,首先查看系统的内核以及顺序 - - awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg - -看下你当前默认启动项 - - grub2-editenv list - -将 kernel-ml 版本的内核设置为默认启动内核 - - grub2-set-default N + enabled=1 -以后升级内核默认启用 kernel-ml,编辑文件 `/etc/sysconfig/kernel` +再更新系统 - DEFAULTKERNEL=kernel-ml + # yum update -同时编辑文件 `/etc/yum.repo.d/elrepo.repo`,在 `[elrepo-kernel]` 下 +更新完成后重启,通过 `uname -a` 查看内核版本,譬如我的 - enabled=1 + $ uname -a + Linux CentOS 4.9.13-203.el7.x86_64 #1 SMP Wed Mar 08 13:39:54 EST 2017 x86_64 x86_64 x86_64 GNU/Linux -重启后,通过 `uname -a` 查看内核是否切换到 4.9,譬如我的 +一些 grub 操作内核的相关命令,可能用得到 - $ uname -a - Linux box 4.9.0-1.el7.elrepo.x86_64 #1 SMP Sun Dec 11 15:43:54 EST 2016 x86_64 x86_64 x86_64 GNU/Linux + awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg # 查看 grub 中内核版本以及顺序 + grub2-editenv list # 当前默认的启动项 + grub2-set-default N # 设置你需要的内核版本为默认启动内核 ##### 开启 BBR TCP diff --git a/_posts/2015-12-25-efi-boot-stub-for-gentoo.md b/_posts/2015-12-25-efi-boot-stub-for-gentoo.md index a0cc2c35b..88ae5ac5b 100644 --- a/_posts/2015-12-25-efi-boot-stub-for-gentoo.md +++ b/_posts/2015-12-25-efi-boot-stub-for-gentoo.md @@ -75,6 +75,11 @@ tags: [EFI, Gentoo] # ls /boot/EFI BOOT Microsoft +如果新装,你可能需要先格式化下 EFI 分区再挂载 + + # mkfs.fat -v -F 32 -n "ESP" /dev/sda1 + # mount /dev/sda1 /boot + 我们给 Gentoo 也建个文件夹,并将内核拷贝入其中(现在没人还在 32 位系统下了吧?) # mkdir /boot/EFI/Gentoo @@ -88,11 +93,19 @@ tags: [EFI, Gentoo] 通过 `efibootmgr -v` 来确认下,是否添加进去了,详细的用法可以通过 `efibootmgr --help` 来查看。 -PS:在我这里测试,efibootmgr 的调整,貌似只有在 (U)EFI 启动系统后才可以,bios mbr 启动则不生效。 +请确保使用 efibootmgr 操作 (U)EFI 时,已经处于 (U)EFI 启动模式下,且 `/sys/firmware/efi/efivars` 处于可读写状态,可以通过如下来确认: + + # mount | grep efivars + +如果结果返回只读 ro,则尝试重新挂载下: + + # mount -o rw,remount /sys/firmware/efi/efivars + +如果结果返回为空,则你需要一个支持 (U)EFI 启动的 livecd 来辅助。 ##### 2.2 efi shell -当然,你也可以直接在 efi shell 下添加,譬如我要添加 Gentoo Linux 的 (U)EFI 启动项到第四的位置,则在你进入 efi shell 后: +如果你主板内建 efi shell,你也可以直接在 efi shell 下添加,譬如我要添加 Gentoo Linux 的 (U)EFI 启动项到第四的位置,则在你进入 efi shell 后: Shell> bcfg boot dump -v Shell> bcfg boot add 3 fs0:\EFI\Gentoo\gentoo.efi "Gentoo Linux" diff --git a/_posts/2015-12-26-bsod-on-boot-0xc0000034.md b/_posts/2015-12-26-bsod-on-boot-0xc0000034.md index 7d8c9a6f1..e2d60db1e 100644 --- a/_posts/2015-12-26-bsod-on-boot-0xc0000034.md +++ b/_posts/2015-12-26-bsod-on-boot-0xc0000034.md @@ -1,7 +1,7 @@ --- layout: post title: "修复 Windows 10 UEFI 启动" -category: Other +category: Windows tags: [EFI] --- diff --git a/_posts/2018-01-20-recover-gcc-on-gentoo.md b/_posts/2018-01-20-recover-gcc-on-gentoo.md index a092558db..670929d78 100644 --- a/_posts/2018-01-20-recover-gcc-on-gentoo.md +++ b/_posts/2018-01-20-recover-gcc-on-gentoo.md @@ -71,10 +71,12 @@ Gentoo 什么都好,就是一旦完成了 no-multilib,就再也无法简单 挂载必要的目录,否则一些包可能无法顺利编译,譬如 **sys-libs/glibc** - mount -t proc none /mnt/gentoo/proc - mount --rbind /sys /mnt/gentoo/sys - mount --rbind /dev /mnt/gentoo/dev - chroot /mnt/gentoo /bin/bash + mount /dev/sda2 /mnt/gentoo # 你的根目录所在 + mount -t proc /proc /mnt/gentoo/proc + mount -R /sys /mnt/gentoo/sys + mount --make-rslave /mnt/gentoo/sys # 如果想调整 systemd + mount -R /dev /mnt/gentoo/dev + mount --make-rslave /mnt/gentoo/dev # 如果想调整 systemd chroot 之后呢,可以将对应的版本升级到最新版。 diff --git a/_posts/2020-06-12-zeropi-record.md b/_posts/2020-06-12-zeropi-record.md index bea9bb316..dd852ae94 100644 --- a/_posts/2020-06-12-zeropi-record.md +++ b/_posts/2020-06-12-zeropi-record.md @@ -9,23 +9,23 @@ tags: [arm, Linux] 购入 ZeroPi 半年多,吃灰居多,偶尔拿来构建 Docker 镜像,偶尔编译一些小工具,跑一些小测试等等,用处很单一。为防止记忆遗忘,记录一些备查。 -ZeroPi 是友善出的一款单片机,对于没有接触过单片机的同学,它其实是一个比较好的上手玩具。当然,没有显示接口对于接触过 Linux 的同学来说,应该也没有什么问题。 +ZeroPi 是友善出的一款开发板,对于没有接触过开发板的同学,它其实是一个比较好的上手玩具。当然,没有显示接口对于接触过 Linux 的同学来说,应该也没有什么问题。 -Armbian 的安装没有什么难处,网上资料太多,这里只记录一些不是大众化的资料,其他的单片机使用 Armbian 的话也可以参考。 +Armbian 的安装没有什么难处,网上资料太多,这里只记录一些不是大众化的资料,其他的开发板使用 Armbian 的话也可以参考。 #### UART -Debug 的 UART 接驳好后,可以直接用 MacOS/Linux 的 screen 工具进入,针对 ZeroPi 的 UART 波特率为 115200bps。 +用于 Debug Port 的 UART 接驳好后,可以直接用 MacOS/Linux 的 screen 工具进入。UART 波特率为 115200bps。 - screen /dev/tty.usbserial-XXXXXXXX 115200 + $ screen /dev/tty.usbserial-XXXXXXXX 115200 串行端口号可以直接用 tab 补全。 #### 网络 -Armbian 默认是启用 Network Manager 来管理网络,armbian-config 中的网络配置也是使用此工具,不过看了下 ZeroPi 的硬件,本着能省则省的态度,我还是直接使用自带的网络工具去配置了,编辑 `/etc/network/interfaces`。 +Armbian 默认是启用 Network Manager 来管理网络,armbian-config 中的网络配置也是使用此工具,不过看了下 ZeroPi 的硬件,本着能省则省的态度,我还是直接使用自带的网络工具去配置了,编辑文件 `/etc/network/interfaces` source /etc/network/interfaces.d/* # Network is managed by Network manager @@ -34,60 +34,81 @@ Armbian 默认是启用 Network Manager 来管理网络,armbian-config 中的 allow-hotplug eth0 iface eth0 inet dhcp - hwaddress ether 12:23:34:45:56:67 不要自动配置 nameserver - dpkg-reconfigure resolvconf # answer no + # dpkg-reconfigure resolvconf # answer no -编辑 `/etc/resolvconf/resolv.conf.d/head` +编辑文件 `/etc/resolvconf/resolv.conf.d/head` nameserver your-dns 最后更新 nameserver - resolvconf -u + # resolvconf -u -我有一个 N 年前购入的小米无线网卡,所以我增加了无线部分的设置,便于在断开网线的时候,也可以接入网络。 +我有一个 N 年前购入的小米无线网卡,所以我增加了无线部分的设置,便于在断开网线的时候,也可以接入网络。编辑 `/etc/network/interfaces` + ...... iface wlxfc0123456789 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf 其中 `/etc/wpa_supplicant/wpa_supplicant.conf` 的配置可以使用如下命令写入 - wpa_passphrase your-ssid your-password >> \ - /etc/wpa_supplicant/wpa_supplicant.conf + # wpa_passphrase your-ssid your-password >> /etc/wpa_supplicant/wpa_supplicant.conf #### udev 总感觉 led 的颜色怪怪的,后来发现,因为是红色灯常亮,改一下,让蓝色灯常亮,有数据读写的时候红灯闪。这里我使用 udev 来实现。 -led 的接入并被挂载为 `/dev/uleds`: +led 的内核触发控制一般在 `/sys/class/leds`中。 + + $ ls -l /sys/class/leds/ + total 0 + lrwxrwxrwx 1 root root 0 Jan 1 1970 nanopi:blue:status -> ../../devices/platform/leds/leds/nanopi:blue:status + lrwxrwxrwx 1 root root 0 Jan 1 1970 nanopi:green:pwr -> ../../devices/platform/leds/leds/nanopi:green:pwr + +查看下属性的控制参数 - udevadm info -a -p `udevadm info -q path -n /dev/uleds` +绿色 led (颜色定义在设备树,实际红色,这里定义成绿色) + + # udevadm info --path=/sys/class/leds/nanopi\:green\:pwr --query=all --attribute-walk ...... - looking at device '//devices/virtual/misc/uleds': - KERNEL=="uleds" - SUBSYSTEM=="misc" + looking at device '/devices/platform/leds/leds/nanopi:green:pwr': + KERNEL=="nanopi:green:pwr" + SUBSYSTEM=="leds" DRIVER=="" + ATTR{trigger}=="none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock usbport disk-activity disk-read disk-write ide-disk mtd nand-disk heartbeat cpu cpu0 cpu1 cpu2 cpu3 activity [default-on] panic mmc0 rfkill-any rfkill-none 0.2:07:link 0.2:07:1Gbps 0.2:07:100Mbps 0.2:07:10Mbps phy0rx phy0tx phy0assoc phy0radio rfkill0" + ATTR{max_brightness}=="255" + ATTR{brightness}=="0" + ...... + +蓝色 led + + # udevadm info --path=/sys/class/leds/nanopi\:blue\:status --query=all --attribute-walk ...... + looking at device '/devices/platform/leds/leds/nanopi:blue:status': + KERNEL=="nanopi:blue:status" + SUBSYSTEM=="leds" + DRIVER=="" + ATTR{brightness}=="255" + ATTR{max_brightness}=="255" + ATTR{trigger}=="none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock usbport disk-activity disk-read disk-write ide-disk mtd nand-disk heartbeat cpu cpu0 cpu1 cpu2 cpu3 activity default-on panic [mmc0] rfkill-any rfkill-none 0.2:07:link 0.2:07:1Gbps 0.2:07:100Mbps 0.2:07:10Mbps phy0rx phy0tx phy0assoc phy0radio rfkill0" -这里获取到我们的led设备使用 `KERNEL=="uleds"` 与 `SUBSYSTEM=="misc"`,触发的控制一般在 `/sys/class/leds`中。 -创建一个文件 `/etc/udev/rules.d/90-power-leds.rules` 后写入: +参数都呈现了,那么直接创建文件来修改了 `/etc/udev/rules.d/90-power-leds.rulesi` - KERNEL=="uleds", SUBSYSTEM=="misc", PROGRAM="/bin/sh -c '\ - echo mmc0 > /sys/class/leds/nanopi\:green\:pwr/trigger && \ - echo default-on > /sys/class/leds/nanopi\:blue\:status/trigger'" + KERNEL=="nanopi:blue:status", SUBSYSTEM=="leds", ACTION=="add", DRIVER=="", ATTR{trigger}=="default-on" + KERNEL=="nanopi:green:pwr", SUBSYSTEM=="leds", ACTION=="add", DRIVER=="", ATTR{trigger}=="mmc0" 手动测试下是否有错误 - udevadm test /sys/class/leds/nanopi\:blue\:status - udevadm test /sys/class/leds/nanopi\:green\:status + # udevadm test /sys/class/leds/nanopi\:blue\:status + # udevadm test /sys/class/leds/nanopi\:green\:pwr 重载下规则 - udevadm control --reload + # udevadm control --reload #### 蓝牙适配器 @@ -103,25 +124,25 @@ led 的接入并被挂载为 `/dev/uleds`: [bluetooth]# trust 11:22:33:44:55:66 # 键盘设备为可信 [bluetooth]# connect 11:22:33:44:55:66 # 进行连接 -配置的时候,你需要另外一个键盘...... +如果不是双模键盘,你可能需要另外一个键盘 ssh 进去配置...... #### tmpfs 不知为何,Armbian 的某些版本,默认没有将 `/run/user/nums` 挂载为 tmpfs,考虑了下 MicroSD 的速度,一些东西还是尽量放内存吧。 - apt install libpam-systemd # 嗯,装这个包,重启即可 + # apt install libpam-systemd # 嗯,装这个包,重启即可 另外,`/tmp` 默认也没有挂载为 tmpfs,修改下 - ln -sf /usr/share/systemd/tmp.mount /etc/systemd/system/ - systemctl enable tmp.mount - systemctl start tmp.mount + # ln -sf /usr/share/systemd/tmp.mount /etc/systemd/system/ + # systemctl enable tmp.mount + # systemctl start tmp.mount #### iptables -一般单片机内存都小的可怜,firewalld 尽管好用,内存占用也不小,本着能省即省的态度,还是用 iptables 吧 +一般开发板内存都小的可怜,firewalld 尽管好用,内存占用也不小,本着能省即省的态度,还是用 iptables 吧 - apt install iptables + # apt install iptables 写入 iptables 规则到文件 `/etc/iptables.rule` @@ -142,15 +163,15 @@ led 的接入并被挂载为 `/dev/uleds`: 载入规则 - iptables-restore < /etc/iptables.rule + # iptables-restore < /etc/iptables.rule 安装 iptables-persistent 使之开启自启动 - apt install iptables-persistent + # apt install iptables-persistent #### nftables -也可以直接使用 nftable,写入配置 /etc/nftabls.conf +也可以直接使用 nftable,写入配置文件 `/etc/nftables.conf` #!/sbin/nft -f flush ruleset @@ -183,34 +204,24 @@ led 的接入并被挂载为 `/dev/uleds`: 载入规则 - nft -f /etc/nftables.conf + # nft -f /etc/nftables.conf #### swap -单片机基本不是 mmc 就是 tf,读写速度堪忧,在上面挂载 swap 性能极低,虽然 debian 自带了 zram-tools 工具去创建 zram 设备,但是 armbian 也自己维护了一个工具,默认就安装好,查看下 +开发板基本不是 mmc 就是 tf,读写速度堪忧,在上面挂载 swap 性能极低,虽然 debian 自带了 zram-tools 工具去创建 zram 设备,但是 armbian 也自己维护了一个工具,默认就安装好,查看下 - zramctl - free -h + # zramctl + # free -h -本质是内存中动态划出一个空间用做 swap,性能一下子就上去了,如此,可以大胆的如下操作了,顺便将 bbr 也打开吧 +本质是内存中动态划出一个空间用做 swap,性能一下子就上去了,如此,可以大胆的如下操作了,顺便将 bbr 也打开吧 `/etc/sysctl.d/99-custom.conf` - /etc/sysctl.d/custom.conf vm.swappiness = 100 net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr - #载入 - sysctl -p /etc/sysctl.d/custom.conf - -#### docker-compose - -docker 已经是必不可少了,官方文档就有安装步骤,但是并没有提供 docker-compose 的 arm 二进制文件,只能安装 debian 维护的版本,但是这个版本有一个问题,导致 docker login 失败。 -所以还是直接搞一个 arm 的二进制单文件版本吧 +载入 - docker run --rm -v /usr/local/bin:/dist \ - gists/docker-compose-bin:latest - docker rmi gists/docker-compose-bin:latest - docker-compose -v + # sysctl -p /etc/sysctl.d/custom.conf 参考资料: diff --git a/_posts/2020-09-20-committing-changes-to-a-pull-request.md b/_posts/2020-09-20-committing-changes-to-a-pull-request.md new file mode 100644 index 000000000..4611efac1 --- /dev/null +++ b/_posts/2020-09-20-committing-changes-to-a-pull-request.md @@ -0,0 +1,48 @@ +--- +layout: post +title: "在GitHub 上对他人发起的 Pull Request 做一些修改" +category: Linux +tags: [GitHub, CLI] +--- + + +为了保持贡献者的积极性,一般而言,偏向于合并贡献者的 pr,但是,有些 pr 在合并之前,其实需要一些小修改。 + +我们可以直接在 github 的 pr 上,给他们提一些小建议,引导对方去做修改。我们也可以直接对他们的 pr 做修改,同时向贡献者说明情况,获得他们的谅解,尽管这其实是在贡献者发起 pr 时的默认同意选项。 + +这一切的前提是,你是项目主,或拥有项目的 commit 权限。 + + + +假设你已经在本地拥有项目的克隆。那么首先需要在本地将贡献者的 fork 仓库加入远程列表中。 + + git remote add contributor https://github.com/contributor/repo.git + +现在,你有了两个远程地址,**origin** 和 **contributor**。你可以通过 `git remote -v` 来获得已经加入成功的确认。 + +获取贡献者仓库,并切换到贡献者做提交的那个分支,譬如 fix-xxx 到本地的 contributor-fix-xxx 分支 + + git fetch contributor + git checkout -b contributor-fix-xxx contributor/fix-xxx + +或者,获取 pr 到本地分支 contributor-fix-xxx 上,并切换 + + git pull origin pull/number/head:contributor-fix-xxx + git checkout contributor-fix-xxx + +然后,在本地做出你的修改提交后,推送到贡献者仓库的对应分支中 + + git commit -m 'fix xxx' + git push contributor contributor-fix-xxx:fix-xxx + +如此,你做的提交就会出现在 pr 页。 + +注:`:` 在 pull 和 push 时的不同用法 + + git pull origin remote-branch:local-branch + git push origin local-branch:remote-branch + +参考: + +- [Committing changes to a pull request branch created from a fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/committing-changes-to-a-pull-request-branch-created-from-a-fork) +- [How to modify someone else's Github pull request?](https://stackoverflow.com/questions/44030176/how-to-modify-someone-elses-github-pull-request) diff --git a/_posts/2021-05-25-gentoo-on-wsl2.md b/_posts/2021-05-25-gentoo-on-wsl2.md new file mode 100644 index 000000000..96ad65a8b --- /dev/null +++ b/_posts/2021-05-25-gentoo-on-wsl2.md @@ -0,0 +1,123 @@ +--- +layout: post +title: "WSL 2 中安装 Gentoo" +category: Linux +tags: [Gentoo, WSL] +--- + +首先要启用 WSL 2 组件,打开 powershell + + PS C:\Users\yourname> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux + PS C:\Users\yourname> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform + + +重启后将 WSL 2 设置为默认 + + PS C:\Users\yourname> wsl --set-default-version 2 + + + +你可能想限制 Gentoo 使用的内存,cpu 线程等,在 Windows 的用户目录 **%HOMEPATH%** 创建文件 `%HOMEPATH%\.wslconfig` + + [wsl2] + memory=8GB + processors=4 + swap=1G + swapFile=%USERPROFILE%\Apps\Gentoo\swap.vhdx + localhostForwarding=true + EOF + +接下来,去你喜欢的镜像源中下载最新的 stage3 压缩包,由于默认下载的是 tar.xz 压缩包,WSL 2 无法导入,用你熟悉的工具将 tar.xz 解压成 tar 包 + +打开 windows terminal 或其他的 powershell 终端,将下载的 tar 包导入到 WSL 2 中 + + PS C:\Users\yourname> wsl --import Gentoo $HOME\Apps\Gentoo $HOME\Downloads\stage3-amd64-xxx.tar --version 2 + +前一个路径,用于存放虚拟磁盘的文件夹,后一个是你下载的 stage3 的 tar 包的路径,查看导入的结果 + + PS C:\Users\yourname> wsl -l -v + NAME STATE VERSION + * Gentoo Stopped 2 + +随后,即可进入 Gentoo 中 + + PS C:\Users\yourname> wsl -d Gentoo + +安全起见,给你的 root 上一个密码吧 + + # passwd root + +现在同步下你的 portage 树 + + # emerge-webrsync + +创建你的用户 + + # useradd -G wheel,users yourname + # password yourname + +安装一个 sudo,并通过 `visudo` 来启用 wheel 用户组的权限 + + # emerge -av sudo + +之后,启动的时候,就可以使用如下命令进入 Gentoo + + PS C:\Users\yourname> wsl -d Gentoo -u yourname + +打开注册表,编辑 `HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{GUID}`,找到有 Gentoo 键值的 **GUID**,编辑里面的 **DefaultUid**,设置其十进制值为 1000 ( 十六进制为 03e8 ),以便开启 Gentoo 的时候,默认登陆用户为 uid=1000 的用户。 + +你可能想在进入 Gentoo 后自动挂载宿主机的盘符,Gentoo 中创建文件 `/etc/wsl.conf` + + [automount] + enable = true + root = /mnt/ + options = "metadata,umask=22,fmask=133" + mountFsTab = true + [user] + default = yourname + [network] + generateHosts = true + generateResolvConf = true + [interop] + enabled = false + appendWindowsPath = false + +顺便,/tmp 还是用 tmpfs 吧 `/etc/fstab` + + tmpfs /tmp tmpfs rw,nosuid,noatime,nodev,size=512M,mode=1777 0 1 + +最后退出 Gentoo,并在 powershell 中终止 Gentoo 以便 WSL 2 相关配置生效,再重新进入 + + PS C:\Users\yourname> wsl --terminate Gentoo + PS C:\Users\yourname> wsl -d Gentoo + +配置好 Gentoo 后,你可能想导出备份 + + PS C:\Users\yourname> wsl --shutdown + PS C:\Users\yourname> wsl -v -l + NAME STATE VERSION + * Gentoo Stopped 2 + PS C:\Users\yourname> wsl --export Gentoo $HOME\Downloads\Gentoo.tar + +如果后期想压缩 vhdx + + PS C:\Users\yourname> wsl --shutdown + PS C:\Users\yourname> diskpart + DISKPART> select vdisk file="C:\Users\yourname\Apps\Gentoo\ext4.vhdx" + DISKPART> attach vdisk readonly + DISKPART> compact vdisk + DISKPART> detach vdisk + DISKPART> exit + PS C:\Users\yourname> + +想清理 vhdx 空间,需要 windows 专业版才行 + + PS C:\Users\yourname> Optimize-VHD -Path C:\Users\yourname\Apps\Gentoo\ext4.vhdx -Mode Full + +移动 vhdx 位置,需要先注销 + + PS C:\User\yourname> wsl --unregister Gentoo + +参考: + +- diff --git a/_posts/2021-06-22-migration-to-25519.md b/_posts/2021-06-22-migration-to-25519.md new file mode 100644 index 000000000..8e8eb1e63 --- /dev/null +++ b/_posts/2021-06-22-migration-to-25519.md @@ -0,0 +1,234 @@ +--- +layout: post +title: "密钥是时候更换到曲线 25519 " +category: Linux +tags: [25519, openssl, gnupg] +--- + +有关 Curve25519/Ed25519/X25519 介绍的文章已经很多,分别指的椭圆曲线加密/签名/密钥交换算法。由于 NIST 系列的不透明以及来历不明参数,被广泛怀疑。棱镜门后,25519 系列开始逐渐被大众接受。直至当下的部署情况: [Things that use Curve25519](https://ianix.com/pub/curve25519-deployment.html) + +具体介绍就不多说了,以下简单说一下常用场景使用 25519 算法的过程。 + + + +#### TLS 自签证书 + +以下 tls 自签证书,可以被 curl/links 等客户端支持,可以在私有场合使用。 + +Firefox/Chrome 等浏览器还未支持,因为浏览器供应商联合公共信任中心组成的行业联盟规定了 X.509/WebPKI 中的可用 ECC 大部分被限于 NIST 系列。如果是架设公共服务,那么请谨慎使用。 + +ED25519 需要 OpenSSL 1.1.1 以及之后的版本。 + +###### ED25519 key + + $ openssl genpkey -algorithm ED25519 -out server.key + +###### PKCS#10 + + $ openssl req -new -out server.csr -key server.key -subj '/C=US/ST=CA/L=San Francisco/O=Internet Widgits Pty Ltd/OU=IT/CN=Self-signed ECC/emailAddress=admin@domain.com' + +###### Sign csr + + $ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt + +###### 查看 + +``` +$ openssl req -in server.csr -text -noout +Certificate Request: + Data: + Version: 1 (0x0) + Subject: C = US, ST = CA, L = San Francisco, O = Internet Widgits Pty Ltd, OU = IT, CN = Self-signed ECC, emailAddress = admin@domain.com + Subject Public Key Info: + Public Key Algorithm: ED25519 + ED25519 Public-Key: + pub: + 43:b5:f2:51:f0:33:df:7b:47:74:d4:b2:75:ef:77: + 3a:cd:f0:c9:2c:ad:25:64:de:93:85:f5:bd:ad:5b: + 2d:5f + Attributes: + a0:00 + Signature Algorithm: ED25519 + 9a:53:53:fa:b6:d2:ca:a7:e3:db:86:5c:dc:04:78:c1:5c:ba: + de:50:54:48:20:86:36:c3:76:64:0a:01:3e:59:49:8d:51:4c: + 46:ca:52:e9:0e:fa:18:4b:12:4d:63:b2:3d:de:f3:40:30:85: + ec:75:2d:7e:03:b5:02:34:cd:0c +``` + +#### OpenSSH 密钥对 + +``` +$ ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "yourname@domain.com" +Generating public/private ed25519 key pair. +Enter passphrase (empty for no passphrase): +Enter same passphrase again: +Your identification has been saved in /Users/name/.ssh/id_ed25519. +Your public key has been saved in /Users/name/.ssh/id_ed25519.pub. +The key fingerprint is: +SHA256:/IzQ36S2fWk549u16/8CmZEAJ+0Niv3C5QfhB+Tg/us yourname@domain.com +The key's randomart image is: ++--[ED25519 256]--+ +| ++o | +| . =* | +| o.+.* . | +| .+o = = | +| ..S+ o.+ | +| .o*o+= | +| ..B... o.| +| . + O.o| +| .E .++OB| ++----[SHA256]-----+ +``` + +你也可以添加 `-a 100` 参数增加求导函数的次数,注意:该数字越高 = 越慢的密码验证 = 更高的抗暴力密码破解。针对的是密码而非密钥本身。 + +#### GnuPG 密钥对 + +``` +$ gpg --expert --full-gen-key +Please select what kind of key you want: + (1) RSA and RSA (default) + (2) DSA and Elgamal + (3) DSA (sign only) + (4) RSA (sign only) + (7) DSA (set your own capabilities) + (8) RSA (set your own capabilities) + (9) ECC and ECC + (10) ECC (sign only) + (11) ECC (set your own capabilities) + (13) Existing key + (14) Existing key from card +Your selection? 9 +Please select which elliptic curve you want: + (1) Curve 25519 + (3) NIST P-256 + (4) NIST P-384 + (5) NIST P-521 + (6) Brainpool P-256 + (7) Brainpool P-384 + (8) Brainpool P-512 + (9) secp256k1 +Your selection? 1 +Please specify how long the key should be valid. + 0 = key does not expire + = key expires in n days + w = key expires in n weeks + m = key expires in n months + y = key expires in n years +Key is valid for? (0) 2y +Key expires at Tue Jun 22 12:59:57 2023 CST +Is this correct? (y/N) y + +GnuPG needs to construct a user ID to identify your key. + +Real name: Your Name +Email address: yourname@domain.com +Comment: Your Comment +You selected this USER-ID: + "Your Name (Your Comment) " + +Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O +We need to generate a lot of random bytes. It is a good idea to perform +some other action (type on the keyboard, move the mouse, utilize the +disks) during the prime generation; this gives the random number +generator a better chance to gain enough entropy. +We need to generate a lot of random bytes. It is a good idea to perform +some other action (type on the keyboard, move the mouse, utilize the +disks) during the prime generation; this gives the random number +generator a better chance to gain enough entropy. +gpg: key 0x8F75F10ABACF9D18 marked as ultimately trusted +gpg: revocation certificate stored as '/Users/name/.gnupg/openpgp-revocs.d/0C2DDA1BA5738976147F17F18F75F10ABACF9D18.rev' +public and secret key created and signed. + +pub ed25519/0x8F75F10ABACF9D18 2021-06-22 [SC] [expires: 2023-06-22] + Key fingerprint = 0C2D DA1B A573 8976 147F 17F1 8F75 F10A BACF 9D18 + Keygrip = CA2F58C28CC8A23E8A87000482236C9DCB0EB7E7 +uid Your Name (Your Comment) +sub cv25519/0xC63205BDCC95F10A 2021-06-22 [E] [expires: 2023-06-22] + Keygrip = 08852924712C889AA1148A35F258CACCE511E908 +``` + +事实上,gpg 也可以创建用于 ssh 的认证密钥对 + +``` +$ gpg --expert --edit-key 0x8F75F10ABACF9D18 +Secret key is available. + +sec ed25519/0x8F75F10ABACF9D18 + created: 2021-06-22 expires: 2023-06-22 usage: SC + trust: ultimate validity: ultimate +ssb cv25519/0xC63205BDCC95F10A + created: 2021-06-22 expires: 2023-06-22 usage: E +[ultimate] (1). Your Name (Your Comment) + +gpg> addkey +Please select what kind of key you want: + (3) DSA (sign only) + (4) RSA (sign only) + (5) Elgamal (encrypt only) + (6) RSA (encrypt only) + (7) DSA (set your own capabilities) + (8) RSA (set your own capabilities) + (10) ECC (sign only) + (11) ECC (set your own capabilities) + (12) ECC (encrypt only) + (13) Existing key + (14) Existing key from card +Your selection? 11 + +Possible actions for a ECDSA/EdDSA key: Sign Authenticate +Current allowed actions: Sign + + (S) Toggle the sign capability + (A) Toggle the authenticate capability + (Q) Finished + +Your selection? A + +Possible actions for a ECDSA/EdDSA key: Sign Authenticate +Current allowed actions: Sign Authenticate + + (S) Toggle the sign capability + (A) Toggle the authenticate capability + (Q) Finished + +Your selection? Q +Please select which elliptic curve you want: + (1) Curve 25519 + (3) NIST P-256 + (4) NIST P-384 + (5) NIST P-521 + (6) Brainpool P-256 + (7) Brainpool P-384 + (8) Brainpool P-512 + (9) secp256k1 +Your selection? 1 +Please specify how long the key should be valid. + 0 = key does not expire + = key expires in n days + w = key expires in n weeks + m = key expires in n months + y = key expires in n years +Key is valid for? (0) 2y +Key expires at Tue Jun 22 13:14:54 2023 CST +Is this correct? (y/N) y +Really create? (y/N) y +We need to generate a lot of random bytes. It is a good idea to perform +some other action (type on the keyboard, move the mouse, utilize the +disks) during the prime generation; this gives the random number +generator a better chance to gain enough entropy. + +sec ed25519/0x8F75F10ABACF9D18 + created: 2021-06-22 expires: 2023-06-22 usage: SC + trust: ultimate validity: ultimate +ssb cv25519/0xC63205BDCC95F10A + created: 2021-06-22 expires: 2023-06-22 usage: E +ssb ed25519/0x6C1FDAA711647985 + created: 2021-06-22 expires: 2023-06-22 usage: SA +[ultimate] (1). Your Name (Your Comment) + +gpg> quit +Save changes? (y/N) y +``` + +最后按照 [GnuPG 介绍]({% post_url 2012-07-18-gnupg-usage %}) 中 **作为 ssh 公钥** 部分内容,配置下即可完成。 diff --git a/_posts/2022-03-08-perfer-ipv4.md b/_posts/2022-03-08-perfer-ipv4.md new file mode 100644 index 000000000..9d33d500d --- /dev/null +++ b/_posts/2022-03-08-perfer-ipv4.md @@ -0,0 +1,58 @@ +--- +layout: post +title: "双栈网络上优先使用 IPv4" +category: Linux +tags: [IPv4, IPv6] +--- + +随着 IPv6 的普及,对网络特定的需求也得到改变,一些特定的场景下,我需要系统优先访问 IPv4,但是访问 IPv6网络应用也要能正常访问。但是现代操作系统,默认基本都是 IPv6 优先,所以接下来需要做一些特定的设置。 + +#### Linux + +GNU/Linux 比较简单,在系统已经安装 glibc 的前提下,编辑 **/etc/gai.conf** 文件,取消下面行的注释 + + precedence ::ffff:0:0/96 100 + + + +对于使用 musl libc 或其他库的系统,譬如 alpine linux,则目前除了通过内核参数来禁用 ipv6 外,没什么更好的方法。 + +#### Windows 10/11 + +以管理员身份运行终端,首先查看当前系统的优先级。 + +``` +netsh interface ipv6 show prefixpolicies +查询活动状态... + +优先顺序 标签 前缀 +---------- ----- -------------------------------- + 50 0 ::1/128 + 40 1 ::/0 + 35 4 ::ffff:0:0/96 + 30 2 2002::/16 + 5 5 2001::/32 + 3 13 fc00::/7 + 1 11 fec0::/10 + 1 12 3ffe::/16 + 1 3 ::/96 +``` + +在 [IANA IPv6 Special-Purpose Address Registry](https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml) 中我们可以找到这些前缀的分配归属。由此得知 `::/0` 为 IPv6 单播地址,`::ffff:0:0/96` 为 IPv4 地址范围。 + +目前我们的 IPv6 的优先级高于 IPv4,调整其优先顺序即可。 + + netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 45 4 + +恢复的话很简单,输入如下命令后重启系统 + + netsh interface ipv6 reset + +这里还有微软提供的非命令行方法,与注册表方法: + +- [ipv6&ipv4双ip下 win11如何设置ipv4优先](https://answers.microsoft.com/zh-hans/windows/forum/all/ipv6ipv4%E5%8F%8Cip%E4%B8%8B/42766058-c61e-4cb3-97f8-f2045859e497) +- [在 Windows 中为高级用户配置 IPv6 的指南](https://learn.microsoft.com/zh-CN/troubleshoot/windows-server/networking/configure-ipv6-in-windows) + +如此,Windows 系统也将优先 IPv4 了。 + +可以通过 `ping www.taobao.com` 来观察前后的变化。 diff --git a/_posts/2023-02-18-enable-promiscuous-mode-on-nics.md b/_posts/2023-02-18-enable-promiscuous-mode-on-nics.md new file mode 100644 index 000000000..81ad3e49d --- /dev/null +++ b/_posts/2023-02-18-enable-promiscuous-mode-on-nics.md @@ -0,0 +1,66 @@ +--- +layout: post +title: "打开网卡的 promiscuous 模式" +category: Linux +tags: [Network] +--- + +如果需要桥接网络设备,或者尝试 docker 的 macvlan 网络,那么势必要打开网卡的 promiscuous 模式。 + +首先,最近的 linux 发行版都支持用命令行临时打开。 + + sudo ip link set dev eth0 promisc on + +只是绝大多数时候我们需要永久打开 promiscuous 模式。那么我们可能根据自己系统选择合适的方法。 + + + +#### 一. NetworkManager + +如果你的网络管理操作是 **NetworkManager**,那么可以试试 NetworkManager-dispatcher,根据你自己的发行版,自行安装 NetworkManager-dispatcher,随后,创建 `/etc/NetworkManager/dispatcher.d/60-promisc`,根据你自己的网卡名,填入如下内容: + + #! /usr/bin/env bash + case "$2" in + up) + if [[ "$1" = "eth0" ]] || [[ "$1" = "eth1" ]]; then + ip link set dev $1 promisc on + fi + ;; + esac + +随后,添加执行权限 + + sudo chmod +x /etc/NetworkManager/dispatcher.d/60-promisc + +#### 二. systemd + +创建一个 systemd service 在 network-online.target 后开始运行,创建文件 `/etc/systemd/system/nics-promisc.service` + + [Unit] + Description=enable promiscuous mode after network online + After=network-online.target + + [Service] + Type=oneshot + ExecStart=/usr/sbin/ip link set dev eth0 promisc on + ExecStart=/usr/sbin/ip link set dev eth1 promisc on + TimeoutStartSec=0 + RemainAfterExit=yes + + [Install] + WantedBy=default.target + +#### 三. systemd-networkd + +有些朋友使用 systemd-networkd 来管理网络。编辑 `/etc/systemd/network/eth0.network`,根据你自己的设备来 + + [Match] + Name=eth0 + + [Link] + Promiscuous=true + +参考: + +- [Persistent promiscuous mode in Debian 12](https://superuser.com/questions/1804774/persistent-promiscuous-mode-in-debian-12) +- [systemd.network](https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html) diff --git a/about.md b/about.md index 265663383..445192037 100644 --- a/about.md +++ b/about.md @@ -6,6 +6,8 @@ description: "业余爱好的点滴记录,同时作为配置备份的存储地
+- 2023 年 01 月 + - 逐步脱离 MacOS/iOS 生态 - 2016 年 02 月 - 升级 Jekyll 至 v3 以上,一些小修改 - 2015 年 04 月 @@ -14,12 +16,16 @@ description: "业余爱好的点滴记录,同时作为配置备份的存储地 - 放弃 JB,转为 Jekyll - 重新制作了模板 - 适配移动终端 +- 2013 年末 + - 生产环境切换至 OS X - 2013 年 09 月 - 域名切换到 Havee.me - 2009 年 03 月 - 建立博客,准备记录 - -05 年开始初步接触 Linux,06年开始工作环境完全切换到 Linux,13 年末,厌倦了 Linux,遂工作环境切换到 OS X,至今。好吧,其实就是前面七年屌丝生涯。本博客,业余的点滴记录,同时作为配置备份存储地,好记性不如滥笔头。 +- 2006年 + - 生产环境切换至 Linux +- 2005年 + - 接触 Linux 爱好:半桶水叮当响。