OpenWRT软件包批量升级

翻出来个10年前的路由器,上电连进去,竟然是刷了OpenWRT系统的。

看到几十个需要升级的包,顿时头大。有点懒癌的我,还是命令行升级吧:

for pkg in `opkg list-upgradable | awk '{print $1}'`; do
    opkg upgrade $pkg
done

Linux 查看CPU温度

有点傻眼了,我竟然从来没想过这个问题。话说,托管在IDC机房的服务器需要关注硬件温度么?

安装温度传感器工具

apt install lm-sensors

探测温度传感器

yes | sensors-detect

查看硬件温度

sensors

NFS 服务端配置

1、上云是好事情,但也不能荒废自身武艺、今天回顾下Debian系的文件共享服务器创建过程~

# 安装服务端
apt install -y nfs-kernel-server
# 共享路径 允许的主机(共享参数)
echo "/var/www 10.1.1.0/24(rw,sync,no_subtree_check)" > /etc/exports
# 更新列表
exportfs -r
# 重启服务
/etc/init.d/nfs-kernel-server restart

2、在其他机器上挂载即可,关于其他选项请参阅下表

参数 说明
ro 只读
rw 读写
root_squash 当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的匿名用户
no_root_squash 当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的 root 管理员
all_squash 无论 NFS 客户端使用什么账户访问,均映射为 NFS 服务器的匿名用户
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据

3、同网段客户端挂载方式

# 安装客户端
apt install -y --no-install-recommends nfs-common
# 挂载到指定路径
mkdir -p /mnt/nfs2
mount 10.1.1.2:/var/www /mnt/nfs2

4、强制卸载挂载点

fuser -km /app/nfs/   先使用这条命令
umount /app/nfs/      在umount 就可以了

LVM常用管理命令及qcow2互转操作

  • PV: 物理卷,是物理的磁盘分区
  • VG: 卷组,LVM中的物理的磁盘分区,(PV必须加入VG,可以将VG理解为一个仓库)
  • LV:逻辑卷,也就是从VG中划分的逻辑分区

PV

  • 显示pv简要信息

    pvs
  • 显示pv详细信息

    pvdisplay
  • 创建pv

    pvcreate /dev/DEVICE
  • 删除pv

    pvmove

VG

  • 显示vg信息

    vgs
    vgdisplay
  • 创建卷组vg10,并将物理卷/dev/sdb/dev/sdc添加到卷组中

    vgcreate vg10 /dev/sdb /dev/sdc
  • 从卷组vg10中删除物理卷/dev/sdc

    vgreduce vg10 /dev/sdc
  • 向卷组vg10中加入物理卷/dev/vdc

    vgextend vg10 /dev/vdc

精简 LV

  • 在卷组vg10下创建名为lvtp的精简池

    lvcreate -L 200G --thinpool lvtp vg10
  • 在精简池lvtp下创建名为lvt1的精简LV

    lvcreate -V 32G --thin -n lvt1 vg10/lvtp
  • 扩展vg10下的lvtp精简池

    lvextend -L +32G /dev/vg10/lvtp

LV

  • 显示lv信息

    lvs
    lvdisplay
  • 创建lv

    lvcreate -L 容量大小 -n 逻辑卷名 卷组名
    lvcreate -l PE个数 -n 逻辑卷名 卷组名
  • 增大lv

    lvextend -L +大小 /dev/卷组名/逻辑卷名
    lvextend -l +PE个数 /dev/卷组名/逻辑卷名
  • lv扩容后需要激活修改的配置

    resize2fs /dev/卷组/逻辑卷名
  • 创建一个名为lv01的lv

    lvcreate -L 2G -n lv01 vg10
  • 创建一个占全部卷组大小的lv

    lvcreate -l 100%VG -n lv01 vg10
  • 创建一个空闲空间80%大小的lv

    lvcreate -l 80%FREE -n lv01 vg10
  • 创建一个空闲空间100%大小的lv

    lvcreate -l 100%FREE -n lv01 vg10

虚拟机镜像转换

  • qcow2转换为lv。lv需要提前创建,容量要大于qcow2原始大小。

    qemu-img convert -p -O raw vm-100-disk0.qcow2 /dev/vg10/vm-100-disk0
  • qcow2转换为raw

    qemu-img convert vm-100-disk0.qcow2 -O raw vm-100-disk0.raw
  • raw转换为lv。lv需要提前创建,容量要大于raw原始大小。

    dd if=vm-100-disk0.raw of=/dev/vg10/vm-100-disk0

为废弃的openssl-1.0.2填坑 (.a转.so)

先吐个槽:话说php7已经大行其道,php8也开测了,某擎微平台却还运行在已经停止支持的php5上,而php5更是依赖了已废弃的openssl-1.0.x

帮小伙伴编译php5环境的时候,发现工具链已经无法很好的编译出openssl的lib库。编译出来的libcrypto.so竟然是0字节,其他文件均正常。调整各项参数,重新编译均无法解决。

最后,只好拿libcrypto.a开刀,尝试编译出正确的.so文件。

ar -x libcrypto.a
gcc -shared *.o -o libcrypto.so
rm *.o

工作原理: .so文件是动态库文件,.a是由一系列.o 文件通过ar程序打包在一起的静态库,要把它转成动态库只需先解开,生成一堆.o文件,再通过编译器(gcc 或 ifort)编成动态库即可。

快速创建TLS证书并部署到Docker服务

将下方代码保存为certbot.sh,修改头部变量后,上传到装有openssl组件的linux服务器上运行即可。

#!/bin/sh
#

export PASSWORD="密码"

export COUNTRY="CN"
export STATE="省"
export CITY="市"
export ORGANIZATION="公司名称"
export ORGANIZATIONAL_UNIT="Dev"
export COMMON_NAME="域名"
export EMAIL="电子邮件地址"

export HOST_NAME="$COMMON_NAME"
export IP=`ping $HOST_NAME -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'`

export DIR="cert-$HOST_NAME"

# Workspace

[ -d $DIR ] || mkdir -p $DIR

echo "PASSWORD: $PASSWORD" > $DIR/!nfo.txt
echo "HOST_NAME: $HOST_NAME" >> $DIR/!nfo.txt
echo "HOST_IP: $IP" >> $DIR/!nfo.txt

# Generate CA

openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "$DIR/ca-key.pem" 4096

openssl req -new -x509 -days 3650 -key "$DIR/ca-key.pem" -sha256 -out "$DIR/ca.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"

# Generate Server Certs

openssl genrsa -out "$DIR/server-key.pem" 4096

openssl req -subj "/CN=$HOST_NAME" -sha256 -new -key "$DIR/server-key.pem" -out $DIR/server.csr

echo "subjectAltName = DNS:$HOST_NAME,IP:$IP,IP:127.0.0.1" > $DIR/server.cnf
echo "extendedKeyUsage = serverAuth" >> $DIR/server.cnf

openssl x509 -req -days 3650 -sha256 -in $DIR/server.csr -passin "pass:$PASSWORD" -CA "$DIR/ca.pem" -CAkey "$DIR/ca-key.pem" -CAcreateserial -out "$DIR/server-cert.pem" -extfile $DIR/server.cnf

# Generate Client Certs

openssl genrsa -out "$DIR/client-key.pem" 4096

openssl req -subj '/CN=client' -new -key "$DIR/client-key.pem" -out $DIR/client.csr

echo "extendedKeyUsage = clientAuth" > $DIR/client.cnf

openssl x509 -req -days 3650 -sha256 -in $DIR/client.csr -passin "pass:$PASSWORD" -CA "$DIR/ca.pem" -CAkey "$DIR/ca-key.pem" -CAcreateserial -out "$DIR/client-cert.pem" -extfile $DIR/client.cnf

# Modify Certs Permission

chmod 0400 $DIR/*-key.pem
chmod 0444 $DIR/ca.pem $DIR/*-cert.pem

# Remove Temporary Files

rm -f $DIR/*.csr $DIR/*.cnf

如果需要部署到Docker服务,请继续

# Install To Docker Daemon

mkdir -p /etc/docker/certs.d
cp $DIR/ca.pem /etc/docker/certs.d/
cp $DIR/server-*.pem /etc/docker/certs.d/

cat <<EOF >/etc/docker/daemon.json
{
    "tlsverify": true,
    "tlscacert": "/etc/docker/certs.d/ca.pem",
    "tlscert": "/etc/docker/certs.d/server-cert.pem",
    "tlskey": "/etc/docker/certs.d/server-key.pem",
    "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}
EOF

# Modify Systemd Service

if [ -f /lib/systemd/system/docker.service ]; then
    sed -i 's#\["tcp:#\["fd://", "tcp:#' /etc/docker/daemon.json
    sed -i 's# -H fd://##' /lib/systemd/system/docker.service
    systemctl daemon-reload && systemctl restart docker
fi

特别注意

在systemd系统上-H已设置,因此无法使用hosts键来添加侦听地址,请参阅 https://docs.docker.com/install/linux/linux-postinstall/#configuring-remote-access-with-systemd-unit-file

Debian9/10 启用 Google BBR 加速

一、加载BBR内核模块

lsmod | grep bbr

如果回显tcp_bbr 20480 14则表示已加载,否则请使用如下命令加载BBR内核模块

modprobe tcp_bbr
echo "tcp_bbr" > /etc/modules-load.d/tcp_bbr.conf

二、启用BBR网络优化

sysctl net.ipv4.tcp_available_congestion_control

如果回显net.ipv4.tcp_available_congestion_control = bbr cubic reno则表示已启用优化,否则请使用如下命令启用BBR网络优化

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

Ubuntu下刷极路由不死uboot

今天帮朋友刷2个极路由的uboot,但他那边只有一台Ubuntu-Server可远程登陆。
悲剧的我,只好SSH连接他本地的Ubuntu,然后再连接极路由刷写固件:

极路由1s

wget https://breed.hackpascal.net/breed-mt7620-hiwifi-hc5761.bin

scp -P 1022 root@192.168.199.1:/tmp/
ssh -p 1022 root@192.168.199.1

输入密码,登陆系统后,执行刷写命令

mtd write /tmp/breed-mt7620-hiwifi-mt7620.bin u-boot

极路由3

wget https://breed.hackpascal.net/breed-mt7620-hiwifi-hc5861.bin

scp -P 1022 root@192.168.199.1:/tmp/
ssh -p 1022 root@192.168.199.1

输入密码,登陆系统后,执行刷写命令

mtd write /tmp/breed-mt7620-hiwifi-hc5861.bin u-boot

Ubuntu安装Docker/Redmine/GitLab教程

兴趣所致,使用Docker部署下Redmine和GitLab,体验下Docker的魅力。

一、安装Docker

二、安装Redmie

地址 http://172.20.1.15
账号 admin
密码 admin

三、安装Gitlab

地址 http://172.20.1.16
账号 root
密码 5iveL!fe

集成安装脚本

PS1:安全起见,以下绑定的地址均为本地IP,无法对外提供服务,如需部署到服务器请酌情修改。
PS2:也可以安装 rinetd 软件包,实现任意端口转发。

请下载下面的集成安装脚本,修改password和email参数后,一键安装Redmine/GitLab吧~

#!/bin/bash
#
# Author  Anrip <mail@anrip.com>
# Website http://www.anrip.com/post/1811
# Refs https://github.com/sameersbn/docker-gitlab
# Refs https://github.com/sameersbn/docker-redmine
#

if [ ! `which docker` ]; then
    wget -qO- https://get.docker.com/ | sh
fi

docker network create --subnet=172.20.1.0/24 docker1

docker pull sameersbn/redis:latest
docker pull sameersbn/mysql:latest
docker pull sameersbn/gitlab:latest
docker pull sameersbn/redmine:latest

docker run --name app-redis -d \
    --net docker1 --ip 172.20.1.11 \
    --volume /srv/app-redis:/var/lib/redis \
    sameersbn/redis:latest

docker run --name app-mysql -d \
    --net docker1 --ip 172.20.1.12 \
    --env 'MYSQL_CHARSET=utf8' \
    --env 'MYSQL_COLLATION=utf8_general_ci' \
    --env 'DB_REMOTE_ROOT_NAME=root' \
    --env 'DB_REMOTE_ROOT_PASS=password' \
    --volume /srv/app-mysql:/var/lib/mysql \
    sameersbn/mysql:latest

MYSQL_CHARSET="DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci"
cat > /opt/app-mysql/init.sql <<EOF
    CREATE USER 'gitlab'@'%.%.%.%' IDENTIFIED BY 'password';
    CREATE DATABASE IF NOT EXISTS gitlabhq_production ${MYSQL_CHARSET};
    GRANT ALL PRIVILEGES ON \`gitlabhq_production\`.* TO 'gitlab'@'%.%.%.%';
    CREATE USER 'redmine'@'%.%.%.%' IDENTIFIED BY 'password';
    CREATE DATABASE IF NOT EXISTS redmine_production ${MYSQL_CHARSET};
    GRANT ALL PRIVILEGES ON \`redmine_production\`.* TO 'redmine'@'%.%.%.%';
EOF

sleep 30
docker exec -it app-mysql mysql "-e source /var/lib/mysql/init.sql"
rm -rf /opt/app-mysql/init.sql

docker run --name app-redmine -d \
    --net docker1 --ip 172.20.1.15 \
    --env 'REDMINE_PORT=80' \
    --env 'REDMINE_RELATIVE_URL_ROOT=/redmine' \
    --env 'SMTP_DOMAIN=anrip.com' \
    --env 'SMTP_HOST=smtp.exmail.qq.com' \
    --env 'SMTP_PORT=587' \
    --env 'SMTP_USER=team@anrip.com' \
    --env 'SMTP_PASS=anrip.2010' \
    --env='DB_ADAPTER=mysql2' \
    --env 'DB_HOST=172.20.1.12' \
    --env='DB_NAME=redmine_production' \
    --env 'DB_USER=redmine' \
    --env 'DB_PASS=password' \
    --volume /opt/app-redmine:/home/redmine/data \
    sameersbn/redmine:latest

docker run --name app-gitlab -d \
    --net docker1 --ip 172.20.1.16 \
    --env 'GITLAB_SSH_PORT=22' \
    --env 'GITLAB_PORT=80' \
    --env 'GITLAB_HOST=team.vmlu.com' \
    --env 'GITLAB_RELATIVE_URL_ROOT=/gitlab' \
    --env 'GITLAB_EMAIL=team@anrip.com' \
    --env 'GITLAB_EMAIL_DISPLAY_NAME=Vmlu Team' \
    --env 'GITLAB_SECRETS_DB_KEY_BASE=your-db-key-base' \
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=your-secert-key-base' \
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=your-opt-key-base' \
    --env 'GITLAB_USERNAME_CHANGE=false' \
    --env 'UNICORN_TIMEOUT=120' \
    --env 'SMTP_DOMAIN=anrip.com' \
    --env 'SMTP_HOST=smtp.exmail.qq.com' \
    --env 'SMTP_PORT=587' \
    --env 'SMTP_USER=your@anrip.com' \
    --env 'SMTP_PASS=your-mail-pasowrd' \
    --env 'REDIS_HOST=172.20.1.11' \
    --env 'REDIS_PORT=6379' \
    --env 'DB_ADAPTER=mysql2' \
    --env 'DB_HOST=172.20.1.12' \
    --env 'DB_NAME=gitlabhq_production' \
    --env 'DB_USER=gitlab' \
    --env 'DB_PASS=password' \
    --volume /opt/app-gitlab:/home/git/data \
    sameersbn/gitlab:latest

#sudo aptitude install -y rinetd
#sudo echo "12.34.56.78 22 172.20.1.16 22" >>/etc/rinetd.conf