使用 Owncast 搭建自己的在线视频串流直播间

Owncast 是一个开源,可自行架设的、去中心化的,单用户视频串流工具。Owncast 使用 Go 语言编写。支持简单的在线聊天,支持 HLS 和 S3 存储。

Owncast 可以很好的成为 Twitch,YouTube Live 等等在线直播平台的代替。用户可以完整地控制自己的内容以及服务器。

Prerequisite

  • Ubuntu 20.04
  • [[FFmpeg]] 4.2 以上版本,需带有 x264/var_stream_map

Docker 安装

Docker compose1 如下:

version: '3.3'

services:
  owncast:
    image: 'gabekangas/owncast:latest'
    restart: always
    volumes:
      - '${CONFIG_PATH}/data:/app/data'
    ports:
      - '8080:8080'
      - '1935:1935'

启动容器之后,进入 /admin 页面,默认的用户名和密码是,admin 和 abc123

手动安装

安装 FFmpeg

apt update
apt install ffmpeg

下载 owncast:

mkdir -p /opt/owncast && cd /opt/owncast
wget https://github.com/owncast/owncast/releases/download/v0.0.2/owncast-0.0.2-linux-64bit.zip
unzip owncast-0.0.2-linux-64bit.zip

修改配置文件:

vim config.yaml

修改自己的串流秘钥和信息,样例文件内容如下:

# See https://owncast.online/docs/configuration/ for more details

instanceDetails:
  name: EV   //名称
  title: EV Live Stream  //网站标题

  logo:
    small: /img/logo128.png
    large: /img/logo256.png

  tags:
    - music
    - software
    - streaming

  # https://owncast.online/docs/configuration/#external-links
  # for full list of supported social links.  All optional.
  socialHandles:
    - platform: github
      url: http://github.com/owncast/owncast
    - platform: mastodon
      url: http://mastodon.something/owncast

videoSettings:
  # Change this value and keep it secure.  Treat it like a password to your live stream.
  streamingKey: secret_key   //串流秘钥

启动 owncast

./owncast

启动后查看日志文件 transcoder.log 如果没有报错着运行成功,如报错无法正常串流播放

可以使用 screen 或者 [[tmux]] 等工具在使用后台运行 owncast:

screen -S live  //创建新的命令行
cd cd /opt/owncast  //进入目录
./owncast  //执行脚本

服务器需要开放端口 1935,8080

设置 OBS 串流

服务器 rtmp://127.0.0.1/live 串流秘钥 [secret]

播放地址 http://127.0.0.1:8080

成功运行之后,日志文件在 transcoder.log

自动安装

cd /your/own/path
curl -s https://owncast.online/install.sh | bash

执行成功之后会返回默认的端口和默认的 streaming key。

cd owncast
./owncast
# change port
./owncast -webserverport 8095

配置 Nginx 反向代理,如果熟悉 [[Nginx Proxy Manager]] 也可以直接使用这个反向代理。

添加配置文件 vi /etc/nginx/conf.d/owncast.conf:

server {
    listen 80;
    server_name     你的域名;

    location / {
        proxy_pass http://127.0.0.1:8080;    #8080改为Owncast对外开放的端口,默认为8080
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

测试:

nginx -t

使配置生效:

nginx -s reload
sudo systemctl start nginx
sudo systemctl enable nginx
# 获取证书
sudo certbot --nginx

配置 [[systemd]],修改文件 vi /etc/systemd/system/owncast.service:

[Unit]
Description=Owncast Service

[Service]
Type=simple
WorkingDirectory=/your/own/path/owncast  #注意替换位置
ExecStart=/your/own/path/owncast/owncast  #注意替换位置
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

生效:

systemctl daemon-reload
systemctl enable owncast
systemctl start owncast

设置 OBS

OBS 官网 安装 OBS,在设置>服务中选择自定义(Custom),在管理员页面获取 RTMP 服务器链接和流密钥并填入 OBS 中,点击 Start Streaming 测试链接,开始推流。

FFmpeg

也可以直接从命令行使用 [[FFmpeg]] 来推流到 Owncast 服务器。

ffmpeg -re -i /path/to/video.mp4 -c copy -f flv rtmp://localhost:1935/live/secret_key
# or
ffmpeg -i "http://IP_OF_HDHR:5004/auto/vCH.N" -c:v libx264 -c:a aac -b:v 512K -maxrate 512K -bufsize 1M -f flv rtmps://OWNCAST_URL:PORT/live/STREAM_KEY
# or
ffmpeg -video_size 1280x720 -i $1 \
  -c:v libx264 -b:v 512k -maxrate 1984k -bufsize 3968k \
  -c:a aac -b:a 128k -ar 44100 \
  -f flv rtmp://live.einvrne.info/live/KEY

或者:

ffmpeg -f alsa -ac 2 -i hw:1,0 -thread_queue_size 64 \
  -f v4l2 -framerate 60 -video_size 1280x720 -input_format yuyv422 -i /dev/video2 \
  -c:v libx264 -preset veryfast -b:v 1984k -maxrate 1984k -bufsize 3968k \
  -vf "format=yuv420p" -g 60 -c:a aac -b:a 128k -ar 44100 \
  -f flv rtmp://<ip-of-your-server>/live/<your-streaming-key>

如果串流 MP4 遇到:

Codec mpeg4 is not supported in the official FLV specification,

解决方案:

ffmpeg -re -nostdin -i "$file" \
    -vcodec libx264 -preset:v ultrafast \
    -acodec aac \
    -f flv rtmp://<your-server>/app/STREAM_KEY

说明:

  • -vcodec codec 设置视频编码器,是 -codec:v 的别名
  • -acodec codec 设置音频解码器,是 -codec:a 的别名
  • -nostdin 表示禁止交互输入
  • -preset:v 表示使用 FFmpeg 默认的编码,按速度降序 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
  • -f fmt 强制指定输入或输出的文件格式
ffmpeg -re -i ~/INPUT_FILE -vcodec libx264 -profile:v main -preset:v medium -r 30 -g 60 -keyint_min 60 -sc_threshold 0 -b:v 2500k -maxrate 2500k -bufsize 2500k -filter:v scale="trunc(oha/2)2:720" -sws_flags lanczos+accurate_rnd -acodec libfdk_aac -b:a 96k -ar 48000 -ac 2 -f flv rtmp://live.twitch.tv/app/STREAM_KEY

reference


2022-06-29 owncast , docker-compose , docker , livesteam , streaming

修复突然断电后 git 仓库 corrupt

今天在 Ubuntu 下编译项目,突然负载飙升到 140 多,然后整个系统就卡住,所有 UI 卡死,无奈之下只能对系统强制重启,不过重启之后发生了一件更严重的问题,当我访问我的项目,执行 git status 之后,显示:

error: object file .git/objects/2b/ca69094c49050b232756d8d862c39be9d4fe55 is empty
error: object file .git/objects/2b/ca69094c49050b232756d8d862c39be9d4fe55 is empty
fatal: loose object 2bca69094c49050b232756d8d862c39be9d4fe55 (stored in .git/objects/2b/ca69094c49050b232756d8d862c39be9d4fe55) is corrupt

git 仓库损坏了!虽然之前把 git 仓库放到 Syncthing 中同步也曾经出现过一次 corrupt 的情况,但是之前修复的时候已经把全部代码 push 到了远端仓库,所以直接重新拉一下代码就可以。

但是这一次我本地的分支没有推送到远端所有的修改还在本地,但是这个时候已经无法访问本地的分支代码了!

这个时候立马去网上 Google 解决办法,大部分的回答都让我删除掉 .git 目录,然后重新去远端获取。但这个方法一定会丢掉本地的修改,所以没有尝试,等到最后实在没有办法的时候再试试吧。

rm -fr .git  
git init  
git remote add origin your-git-remote-url  
git fetch  
git reset --hard origin/master  
git branch --set-upstream-to=origin/master master   

然后继续查看解决办法的时候发现了,可以使用:

git repair
git repair --force

执行完成之后,发现分支回来了。然后赶紧拉一下代码 git pull

之后在切换分支的时候发现本地的分支还在,所以基本完成修复。

另外一个项目也出现了相同的问题,不过本地分支名丢失了,不过还好之前合并过其他分支,在 git log 中找到之前的分支最后一次提交 commit id,重新 checkout 一个新分支即可。

深入 .git 目录 refs

Git 中大部分行为都会有一个 hash 来存储,可以使用 git show 52611da62ae41498fa186ec8b4913b5c7173a896 ,但是这需要用户记住所有的 hash 值,但 hash 值是一个随机的字符串,非常难以记忆,所以 Git 提供了一个 references(引用),或者简称 refs

引用是存储在 .git/refs 目录下的文件,通常这个文件中包含一个 commit object 的 hash。

$ ls -F1 .git/refs 
heads/
master
remotes/
tags/
v0.3

heads 目录中包含了所有本地分支,每一个文件都对应着一个分支名字,文件内容就是该分支最新的 commit hash。

在 Git 中,分支其实就是一个引用,修改 master 分支,其实 Git 只需要做的事情就是改变 /refs/heads/master 文件内容。而类似的,创建一个分支,其实就是将 commit hash 写到一个新的文件中。

而同样 tags 目录也是一样的,这个目录中包含标签的信息。

Special Refs

Git 也有一个特殊的引用,HEAD,这个一个当前分支的引用,而非对 commit hash 的引用。

cat .git/HEAD
ref: refs/heads/dev

可以看到的是当前正在 dev 分支。当然也可以将 HEAD 直接指向一个真实的 commit id,这个时候 Git 会提示 detached HEAD state,意味着你当前不是在一个分支上。

除了 HEAD 这个特殊的 refs,还有一些其他的:

  • FETCH_HEAD: 从远端最近一次拉取的分支
  • ORIG_HEAD: A backup reference to HEAD before drastic changes to it
  • MERGE_HEAD: The commit(s) that you’re merging into the current branch with git merge.
  • CHERRY_PICK_HEAD: The commit that you’re cherry-picking.

Reflog

Reflog 是 Git 的安全网,他会记录在仓库中所有的操作。可以将其想象成一个本地仓库修改的时序历史记录.

Git reflog 是一个你对本地仓库所作的所有修改的记录。每一次提交,每一次切换分支,都会在 reflog 中留下记录。

在 Git 仓库中执行:

git reflog
ceb40ab HEAD@{0}: commit: messsage

reference


2022-06-27 git , linux , git-repair , ubuntu

金融的本质 读书笔记

《金融的本质》是美联储主席[[本 伯南克]]关于美联储历史,以及在 2008 年应对金融危机手段的一本科普读物。本伯南克以非常通俗的语言讲述了美联储的历史,以及央行的职能。每一章节后面都有一个答学生的提问,所以看起来就像是一本写给学生的科普读物,读完可以对美联储是做什么的?为什么要成立美联储?以及当危机来临时美联储能够做什么?有非常详细的介绍和解释。

怎么知道的这一本书

在和朋友聊天的时候,说到美联储,于是朋友给推荐了这一本。

几句话总结书的内容

  • 美联储的起源与历史,以及美联储调整经济的手段
  • 本 伯南克应对金融危机的应对措施和后续影响
  • 危机之后有什么弥补手段

启发或想法

美联储的作用

美联储作为美国的央行,其决定对全世界的经济都会产生一定的影响,这两天美联储加息,股市暴跌,成为了日常的新闻。而美联储为什么要这么做呢?很多报道都会提到为了压制美国的通货膨胀,而为什么美联储能够通过调整利率来影响通货膨胀呢?这一本书里面都有详细的说明。

中央银行的职能:

  • 维持金融稳定,保证金融体系正常运行,缓解或阻止金融危机或金融恐慌
  • 维持经济稳定,保持经济增长,保持低通胀,避免大幅波动

美联储的影响经济的手段

显然为了实现央行的职能,美联储能够使用一些工具来调整经济运行。

  • 维持金融稳定,央行的工具是成为最后贷款人角色,为金融机构提供短期流动性和资金支持。
  • 为了维持经济稳定,央行最重要的工具是货币政策,在正常时期,货币政策主要体现为短期利率的调整。在通常情况下美联储可以通过在公开市场买卖证券(通常是短期政府债券),来降低或提高短期利率。当经济增长过缓或通胀水平过低时,美联储可以通过降息来刺激经济发展。

这里提到的短期利率,主要是对隔夜拆借利率的管理。也就是调整各银行向美联储借钱的成本,隔夜利率又称联邦基金利率。通过提高或降低短期利率,美联储可以影响更大范围的利率。

在最极端的情况下,如果调整货币政策已经无法影响经济,美联储还可以实行大规模资产购买计划,即媒体和其他地方所说的量化宽松。

基本工具:

  • 货币政策,隔夜拆借利率
  • 流动性供给(最后贷款人)

金本位的问题

什么是金本位呢?相信大部分人在教科书上曾经学过,简单来说就是一个国家的货币发行和黄金储备挂钩,央行有多少黄金才能发行多少货币,金本位是一种货币体系,在这个体系中,货币的价值以黄金的重量来衡量。这也就意味着手上的货币可以到央行兑换黄金。

但是也相信大部分人都知道金本位在上世纪已经破产了,大部分的国家已经抛弃了金本位。

金本位的缺点:

  • 资源浪费,开采,运输成本
  • 限制了货币供给,央行不能灵活地调整利率(在经济不景气时下调利率,在通胀时上调利率)
  • 金本位的国家货币之间形成一个固定汇率体系,一个国家货币供应量出现问题,会传导到另一个国家,从而剥夺另一个国家独立管理其本国货币政策的权力
  • 投机,短期的投机行为,挤兑银行

金本位的优点:

  • 维持货币价值的稳定,让通胀维持在一定水平(长期如此),但是短期会经常发生通货膨胀或通货紧缩

通货膨胀的本质

通货膨胀无论在何时何地都是一个货币现象。通过货币政策来维持过底的失业率,最终会引发通货膨胀。 价格是经济的温控器,是经济赖以运行的机制。所以,管控工资和物价意味着整个经济体存在短缺及其他各种问题。 低通胀是一件非常好的事情,长时间低而稳定的通胀率会使经济更加稳定,有利于保持健康的增长率和生产率以维持经济活动。

大而不倒

[[大而不倒]],有一部同名的纪录片讲述的就是 08 年金融危机之后,美国财政部长,联合美联储,巴菲特等等在经济中扮演重要角色的人物拯救华尔街金融机构的故事。而大而不倒也成为了经济中一个潜在的问题,如果一家机构大到足够影响经济,那么就不会让其轻易地倒闭,显然长期来看对于整个宏观经济是不利的。如果一个体系中存在一些企业“大而不倒”(too big to fail),那么这个体系一定存在某些根本性缺陷。

想要确保金融体系有所变革,为的是以后再有类似美国国际集团这样的系统重要性机构面临此类压力时,能够以一种安全的方式倒闭。


2022-06-21 reading , reading-2022 , financial , financial-crisis

若为自由故 读书笔记

《若为自由故:自由软件之父理查德·斯托曼传》是 [[Richard Stallman]] 的个人传记,在读完 [[自由软件 自由社会]] 的时候就把这一本书加入了待看列表。《自由软件 自由社会》中只介绍了 Stallman 关于自由软件的哲学思考,没有涉及到 Stallman 是怎么形成自己的思想的原由。而这一本传记能够更清楚的看到 Stallman 如何争取一台打印机驱动,到对争取软件自由运动的全部过程。

虽然站在 2022 年再去回顾这位传奇黑客有一点晚,并且 Stallman 固执的性格也常常出现在新闻中,但是这一切都无法抹去他在自由软件运动,在 GNU 项目,在自由软件基金会的贡献。

Richard Stallman 是谁?

鉴于可能有人不认识 Stallman,那么就从他的作品,Emacs 说起,这是一款可以并肩 Vim 的编辑器,Stallman 就是 Emacs 的原始作者,Stallman 还凭借一己之力创造了 GCC 编译器,GNU 项目,并且在专业律师的帮助下制定了 [[GNU General Public License]] GNU 通用许可证。

自由软件运动

Stallman 发起的自由软件运动,无疑也蕴含着一定的哲学思考,软件代码不可能完美无缺,所以最好的办法就是通过共享代码,通过不断地修改来逐渐完善。

没有人可以写出没有错误的代码。通过共享软件代码,黑客们把不断改进程序作为终极的目标,甚至超越了个人野心。

「自由」是一个抽象的名词,多少哲学家通过不同的角度去讨论自由,社会学的自由,个人的自由,[[消极自由]],[[积极自由]],而随着计算机,软件工程的发展,在数字领域如何获得个人的自由?Stallman 无疑给了我们一种思考的路径。尤其是伴随着互联网成长的我们,见证了太多的互联网服务关闭,见证了太多的软件停止维护,最后我们自己产生的数据变得不再是属于我们自己,曾经试过的软件再也无法打开。Stallman 个人的经历告诉我们,即使互联网服务给予了我们更多的便利,即使某些软件可以让我们更快的实现目标,我们也要时刻警惕,因为我们随时会失去自由。就像哈耶克曾经说得那样,「愿意放弃自由来换取保障的人,他最终既得不到自由,也得不到保障。」

Stallman 发起的自由软件运动究竟是什么呢? 可以参考 Stallman 关于 [[自由软件]] 的四大自由定义:

  • 基于任何目的、按自己的意愿运行软件的自由
  • 学习软件如何工作的自由,按意愿修改软件以符合自己需求的自由
  • 分发软件副本的自由
  • 将修改过的软件版本再分发给其他人的自由,这样整个社区就有机会共享你对软件的修改

简单来说就是运行、复制、学习、分发、修改的自由。

大教堂与集市

之前在阅读 [[大教堂与集市]] 的时候一直以为作者 [[Eric Raymond]] 是以商业公司开发模式和开源社区开发模式作为对比才写下的[[大教堂与集市]],但看完这本书,才知道原来 Raymond 在书中所指的大教堂模式指的是在 Stallman 领导下的 GNU 项目。整个 GNU 项目就是“大教堂”的开发模式,有计划地修建而成的宏伟的黑客精神的纪念碑,经得起时间的考验。另一方面,Linux 则更像是一个“嘈杂的大集市”,它是在 Internet 去中心化的松散组织结构中开发出来的。[[Linus Torvalds]] 所创建的这种「集市」开发模式反映了 Linus 的个性,作者写到,「从 Linus 的观点来看,最好的管理工作不是要加强对事情的控制,而是要保持思维的活跃度。」

自由软件和开源

在此之前,我几乎把自由软件和开源混为一谈,但显然如果代指同一个东西,人类没有必要发明两个名字,自由软件(Free software)和开源 (Open Source),显然 Stallman 是自由软件运动的发起者,他当然更支持自由软件,他在描述二者的区别时说道,「开源软件的观念更偏向于实用主义;而自由软件的观念则更强调用户自由。」当然自由软件和开源两者有很多共性的地方,支持 Open Source 的一派,部分原因是为了避免使用 Free 一词,

谁应该看这本书

想要了解计算机,尤其是自由软件发展历程的人。

Quotes

我希望每个人都能珍视自由,也能拥有自由。 没有人可以写出没有错误的代码。通过共享软件代码,黑客们把不断改进程序作为终极的目标,甚至超越了个人野心。

书摘


2022-06-14 free-software , open-source , stallman , software

微软新一代 CEO 萨提亚 纳德拉自传《刷新》 读书笔记

《刷新:重新发现商业与未来》是微软第三任 CEO [[萨提亚 纳德拉]] 的传记,好朋友之前推荐过一次,后来在听《无人知晓》播客的时候又再一次被提到,所以就把这一本列在了 [[20220605 21 天挑战计划]] 中。

让我想要去了解萨提亚的是,我能在最近几年中明显感受到微软的变化,从股价上也能看到资本市场对微软的重新定价。读完,我才真正明白一位 CEO 对于一个公司未来方向的决定作用,寻求合作,拥抱开放,萨提亚的出现成为了微软近几年转型的重要角色。但是在书中不仅能看到萨提亚在微软的经历,也能看到他的成长过程,以及关于他关于「同理心」的认识和实践。

最近几年微软的收购案也是让我对这位 CEO 产生好奇的原因,甚至金额越来越大:

  • 对 Minecraft 的收购
  • 对 GitHub 的收购
  • 对 LinkedIn 的收购
  • 对动视暴雪的收购

三句话总结书的内容

  • 萨提亚如何从印度移民到美国,在微软的工作,以及一步一步迈上 CEO 的经历
  • 带领微软文化转型,开放合作,拥抱开源
  • 对未来科技的畅想,云计算,混合现实,人工智能,量子计算

成长型思维

和成长型思维(growth mindset)对立的是固定思维(fixed mindset)。

萨提亚认为,一个人无法去准确地预测未来科技变化,但是成长型思维模式可以使他更好地对不确定性做出反应,并且在技术快速变化的情况下,去纠正自己所犯的错误,因此需要不断“刷新”。

这个思想和我刚刚看过的[[波普尔的哲学思想]]有着非常相似的思考路径,他们都认为我们无法避免犯错,唯一知道的就是去验证自己的思考,不断的纠正自己的过错。这个是萨提亚所说的「刷新」,也是波普尔所说的[[批判理性主义]]。我想这也是这本书标题「刷新」的由来。

批判理性主义提倡多元,包容,通过理性讨论和诚实寻求真相来解决冲突,萨提亚也认为「辩论和争辩的绝对必要」,通过相互交换意见想法,畅所欲言最后才能达到一个文化上的统一。

如何练习成长型思维

站在微软角度,纳德拉提出了三种方式练习成长型思维:

  • 以客户为中心,保持好奇心,用技术满足客户未能表达和未被满足的需求
  • 多元化和包容性
  • 打破壁垒

同理心

看完全书就会发现萨提亚在书中的每一个地方到提到了「同理心」,原文是 「Empathy」

同理心一词贯穿在全书中,我们可以理解成共情,同感,可以理解成换位思考,去设身处地地理解对方的思维、感受、想法,在后文萨提亚提到,「对残疾人抱以同理心,对在城市贫民区和锈带谋生的人们抱以同理心,对亚非拉发展中国家的人们抱以同理心,对努力获取成功的小企业主们抱以同理心,对任何因肤色、信仰或恋爱对象而遭受暴力和仇恨攻击的人抱以同理心。」,还包括对薪资不平等而提出疑问的女性的同理心,对普通职员的同理心,对经理的同理心。更进一步萨提亚将同理心作为信任中必不可少的一部分:

信任=同理心+共同的价值观+安全可靠

萨提亚提及的同理心来自于自己的求职精力,来自于自己的家庭,萨提亚在书中提到了一个面试插曲,当接受了一整天的面试,最后一位面试官问萨提亚,「如果看到一个婴儿躺在马路上哭,会怎么做?」,萨提亚回答了,「拨打911」,面试官在送萨提亚走出办公室的时候,和萨提亚说,「小伙子,你需要更多同理心,如果一个婴儿躺在马路上,你应该把这个婴儿抱起来」。这个故事让我一下子联想到最近发生的「唐山打人案件」,让我想起了[[小悦悦事件]],当有人被打到在地,当有小孩被车碾过,只要抱有一点点道德良知就应该知道,要做的事情并不只有报警而已。之后,萨提亚的第一个孩子因为重度大脑性瘫痪,未来将需要依赖轮椅生活,但这样的打击让萨提亚更能去理解孩子的遭遇,去理解他的痛苦。最后才会发出感慨,「只有经历过人生起伏,才能培养起同理心,要想不受苦难,或者少受苦难,就必须接纳无常」。

数字时代永恒的价值观

隐私,安全,言论自由是数字时代永恒的价值观。纳德拉从索尼被黑色入侵勒索开始,一直讲述到斯诺登。

后门,会导致安全被削弱,加剧不信任。故意设计后门,为访问某人的私人数据提供便利是一件危险的事情

隐私和安全最终的解决办法是确保彼此的信任。只有保护个人自由的规则清楚明了并且得到一致的遵守,构建和维持这种信任,在个人和公共责任之间找到平衡,向来是制度进步的特征。这是一门艺术,而非科学。

科技公司必须把信任科技到一切,信任不仅取决于技术,还有赖于管理它的法律框架。纳德拉认为在数字世界,信任的天平被打破了,因为法律没有跟上技术的变革。

同样在书中能看到纳德拉认同美国[[宪法第一修正案]]中保证的言论自由,[[宪法第四修正案]]保护美国人不接受不合理搜查和拘押的权利。他以自身的经历去思考印度的历史,去回顾美国司法历程,他主张通过制定新时代的法律来保证个人隐私得到保护的同时为执法机关访问数据提供便利。

三个 Quotes

也许我们的产品会瞬间即逝,但我们的价值观是永恒的。

刷新 书摘


2022-06-10 reading , reading-2022 , microsoft , biography

利用 Shaarli 搭建个人的在线书签管理

Shaarli 是一个使用 PHP 编写的,开源的,可自行搭建的书签服务,无需数据库依赖。在很早几年曾经出现过一款叫做 Delicious 的在线书签收藏和分享的网站,但今天一查也早已经在 7 年前关闭了。这些年兜兜转转发现还是当只有自己掌握了软件、数据才是最安全的,不管是本地的应用还是在线的服务,越来越觉得 [[Richard Stallman]] 所提及的自由软件之珍贵。

这篇文章就简单的介绍一下 Shaarli 搭建的过程。

Installation

使用 Docker 安装

version: '3.3'

services:
  shaarli:
    image: shaarli/shaarli:latest
    container_name: shaarli
    restart: always
    ports:
      - '${PORT}:80'
    volumes:
      - '${SHAARLI_DATA}:/var/www/shaarli/data'
      - '${SHAARLI_CACHE}:/var/www/shaarli/cache'

后续的更新维护在 dockerfile

安装完成之后,因为我使用外部的文件夹挂载,可能存在问题,使用 docker-compose logs -f 查看日志,发现错误:

shaarli  | 2022/07/09 08:00:46 [error] 10#10: *1 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught RuntimeException: The file could not be opened. Check permissions. in /var/www/shaarli/vendor/katzgrau/klogger/src/Logger.php:134
shaarli  | Stack trace:
shaarli  | #0 /var/www/shaarli/index.php(59): Katzgrau\KLogger\Logger->__construct()
shaarli  | #1 {main}
shaarli  |   thrown in /var/www/shaarli/vendor/katzgrau/klogger/src/Logger.php on line 134" while reading response header from upstream, client: 11.22.33.44, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: ":8080"
shaarli  | 11.22.33.44 - - [09/Jul/2022:08:00:46 +0000] "GET / HTTP/1.1" 500 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36"

需要调整文件夹的权限。1

docker exec -it shaarli chown -R nginx: nginx /var/www/shaarli/data
docker exec -it shaarli chown -R nginx: nginx /var/www/shaarli/cache

或者改写,直接使用 Docker volumes,避免权限的问题。

和 Nginx Proxy Manager 一起使用

假设已经使用了 Nginx Proxy Manager 反向代理了,那么在 Nginx Proxy Manager 中创建一个 Host,然后填入

nginx proxy manager shaarli

浏览器书签栏按钮

将下面的 shaarli.your_domain.com 替换为自己的域名:

javascript:(          function()%7B            var url %3D location.href%3B            var title %3D document.title %7C%7C url%3B            var desc%3Ddocument.getSelection().toString()%3B            if(desc.length>4000)%7B              desc%3Ddesc.substr(0,4000)%2B%27...%27%3B              alert(%27 所选文本太长,将会被截断。%27)%3B            %7D            window.open(              %27https:///shaarli.your_domain.com/admin/shaare%3Fpost%3D%27%2B encodeURIComponent(url)%2B              %27%26title%3D%27%2B encodeURIComponent(title)%2B              %27%26description%3D%27%2B encodeURIComponent(desc)%2B              %27%26source%3Dbookmarklet%27,%27_blank%27,%27menubar%3Dno,height%3D800,width%3D600,toolbar%3Dno,scrollbars%3Dyes,status%3Dno,dialog%3D1%27            )%3B          %7D        )()%3B

然后就可以在浏览器中点击这个书签栏上的按钮一键添加当前 URL 到 Shaarli。

  • [[Wallabag]]
  • [[onenav]]
  • [[Shiori]]
  • [[Huntly]]
  • [[linkwarden]]

2022-06-09 shaarli , docker , bookmarking , self-hosted , read-it-later , reader , webpage , link

在 Proxmox VE 上使用 S.M.A.R.T 信息监控硬盘状态

自己组的 NAS,是用 Proxmox VE 做虚拟化,然后再其中安装了 OpenMediaVault 作为 NAS 系统,因为时间有些久1,所以不免有点担心硬盘的寿命,所以今天来好好了解一下 SMART 信息,并对磁盘进行一个全面的诊断,以保护数据的安全。

S.M.A.R.T 信息

查看 S.M.A.R.T 信息是用来监控硬盘健康状态最直接的办法。

S.M.A.R.T 全称是 Self-Monitoring, Analysis and Reporting Technology,这是硬盘内建的一种状态检测和预警规范。2

SMART 信息中包含了硬盘的运行信息,包括硬盘的工作时间,通电次数,盘片温度,坏块的数量,写入量,读取量等等

Proxmox VE Disks

在 Proxmox VE 后台能直接通过界面查看到磁盘的 SMART 信息。

点击左侧的 PVE 节点,然后在 Disks 中就能查看到磁盘的信息。

pve smart value

smart value

如果熟悉命令行,也可以直接 SSH 登录之后执行:

smartctl --all /dev/sda

同样能获取到 SMART 信息。

root@pve:~# smartctl --all /dev/sda
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.4.143-1-pve] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate BarraCuda 3.5
Device Model:     ST4000DM004-RRRRR
Serial Number:    WFNRRRRR
LU WWN Device Id: 5 000c50 0cd3f38d9
Firmware Version: 0001
User Capacity:    4,000,787,030,016 bytes [4.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5425 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-3 T13/2161-D revision 5
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Sun Jun 12 10:30:29 2022 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.
Total time to complete Offline
data collection:                (    0) seconds.
Offline data collection
capabilities:                    (0x73) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        No Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine
recommended polling time:        (   1) minutes.
Extended self-test routine
recommended polling time:        ( 475) minutes.
Conveyance self-test routine
recommended polling time:        (   2) minutes.
SCT capabilities:              (0x30a5) SCT Status supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   084   064   006    Pre-fail  Always       -       235499960
  3 Spin_Up_Time            0x0003   097   097   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       33
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   088   060   045    Pre-fail  Always       -       573161103
  9 Power_On_Hours          0x0032   080   080   000    Old_age   Always       -       17577 (6 153 0)
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       33
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0 0 0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   061   058   040    Old_age   Always       -       39 (Min/Max 31/42)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       650
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       760
194 Temperature_Celsius     0x0022   039   042   000    Old_age   Always       -       39 (0 21 0 0 0)
195 Hardware_ECC_Recovered  0x001a   084   064   000    Old_age   Always       -       235499960
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       17435h+59m+22.019s
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       31388806852
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       28853375635

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

其中比较重要的值。

01(001) Raw_Read_Error_Rate 底层数据读取错误率 
04(004) Start_Stop_Count 启动/停止计数 
05(005) Reallocated_Sector_Ct 重映射扇区数 
09(009) Power_On_Hours 通电时间累计,出厂后通电的总时间,一般磁盘寿命三万小时 
0A(010) Spin_Retry_Count 主轴起旋重试次数(即硬盘主轴电机启动重试次数) 
0B(011) Calibration_Retry_Count 磁盘校准重试次数 
0C(012) Power_Cycle_Count 磁盘通电次数 
C2(194) Temperature_Celsius 温度 
C7(199) UDMA_CRC_Error_Count 奇偶校验错误率 
C8(200) Write_Error_Rate: 写错误率 
F1(241) Total_LBAs_Written:表示磁盘自出厂总共写入的的数据,单位是LBAS=512Byte 
F2(242) Total_LBAs_Read:表示磁盘自出厂总共读取的数据,单位是LBAS=512Byte

ID

前两位十六进制数,括号中为对应的十进制,表示检测的参数,各个硬盘制造商大部分的 SMART ID 所代表的含义是一致的。但有的厂商也会根据自己的需求增减 ID。

ATTRIBUTE_NAME

属性名,ID 代码的文字解释。

FLAG

属性标志

VALUE

当前值,根据硬盘运行数据计算获得。

WORST

最差值,是硬盘运行时各 ID 曾出现过的最小 Value。

通常最差值与当前值是相等的,如果最差值出现较大波动,小于当前值,表明磁盘曾经出现过错误。

Threshold

在报告硬盘 FAILED 状态前,WORST 可以允许的最小值。

RAW_VALUE

原始值,是硬盘运行时各项参数的实测值。

TYPE

属性的类型(Pre-fail 或 Oldage)

WHEN_FAILED

如果 VALUE 小于等于 THRESH,会被设置成“FAILING_NOW”;如果 WORST 小于等于 THRESH 会被设置成“In_the_past”;如果都不是,会被设置成“-”。在“FAILING_NOW”情况下,需要尽快备份重要 文件,特别是属性是 Pre-fail 类型时。“In_the_past”代表属性已经故障了,但在运行测试的时候没问题。“-”代表这个属性从没故障过。

UPDATED

属性的更新频率。Offline 代表磁盘上执行离线测试的时间。

SMART 参数解读

01(001)底层数据读取错误率 Raw Read Error Rate

底层数据读取错误率,当前值应远大于临界值。

02(002)磁盘读写通量性能 Throughput Performance

数值越大越好。

当前值如果偏低或趋近临界值,表示硬盘存在严重的问题。但现在的硬盘通常显示数据值为 0 或根本不显示此项,一般在进行了人工脱机 SMART 测试后才会有数据量。

07(007)寻道错误率 Seek Error Rate

数据应为 0,当前值应远大于与临界值。

08(008)寻道性能 Seek Time Performance

表示硬盘寻道操作的平均性能(寻道速度),通常与前一项(寻道错误率)相关联。

09(009)通电时间累计 Power-On Time Count (POH)

表示硬盘通电的时间,数据值直接累计了设备通电的时长,新硬盘当然应该接近 0,但不同硬盘的计数单位有所不同,有以小时计数的,也有以分、秒甚至 30 秒为单位的,这由磁盘制造商来定义。 这一参数的临界值通常为 0,当前值随着硬盘通电时间增加会逐渐下降,接近临界值表明硬盘已接近预计的设计寿命,这并不表明硬盘将出现故障或立即报废。参考磁盘制造商给出的该型号硬盘的 MTBF(平均无故障时间)值,可以大致估计剩余寿命或故障概率。

对于固态硬盘,要注意“设备优先电源管理功能(device initiated power management,DIPM)”会影响这个统计:如果启用了 DIPM,持续通电计数里就不包括睡眠时间;如果关闭了 DIPM 功能,那么活动、空闲和睡眠三种状态的时间都会被统计在内。


2022-06-05 openmediavault , omv , nas , hard-disk , hard-disk

开放社会及其敌人 读书笔记

《开放社会及其敌人》是 [[波普尔]] 的一本政治哲学著作,是我 [[20220515-21-天计划]] 中的想要阅读的一本书,本来在上一个 21 天计划中就想要读完的,但是因为其内容复杂程度超出了我的想象,波普尔旁征博引,对柏拉图,黑格尔,马克思的观点信手拈来,但是我去消化的时候不仅需要先理解其引用的观点,还需要进一步去理解波普尔自己的观点,就使得我在上一个周期中没有完成,所以这一个 21 天计划依然把这本书列为必须要读完的图书之一。

最早知道[[波普尔]]是因为他在科学哲学领域提出的[[可证伪理论]],还有在看[[索罗斯]]传记的时候不停地引用波普尔的观点,进而我又看了其论文集[[通过知识获得解放]],进而逐渐对其理论形成了一个基础的概念,然后我才决定开始阅读这一本《开放社会及其敌人》,想要完整地了解波普尔在政治哲学领域的集大成之作。

什么是开放社会

什么是 [[开放社会]]

  • 知识可以更新、可证伪
  • 文化是多元的、宗教是多元的
  • 大众具有批判性思维,不盲从
  • 知识不断进化、发展,永无止境

[[封闭社会]]

  • 知识是确定的,甚至可能是最终真理
  • 文化单一、宗教单一,无神论
  • 批判思维几乎不可能
  • 知识停滞不前、甚至被摧毁

论历史主义和极权主义

批判 [[历史主义]],[[极权主义]]

  • 历史主义预先设定了权利应该掌握在了解历史规律的手中,只有了解历史规律的人才能顺应历史规律。这是为极权辩护。为独裁者所利用。独裁者无视人们的意愿,压迫人民,残酷对待人民,并声称这么做是为了人民的利益。是为了追求一个只有独裁者才能了解的历史目标。
  • 扼杀了表达的自由、思想的自由、同时扼杀了对当权者的批评。懂得历史规律的人不仅规定了人民应该做什么,不应该做什么,有权决定什么是合理的批评,什么是不合理的批评
  • 历史目标是一个长期的目标,独裁者的继任者是任命的,而不是人民选出来的,只有独裁者才能知道哪个继承者掌握了历史规律
  • 个人的权利(生命、自由、财产) 都受到了压迫,因为必须服从整个社会的目标,名正言顺的打压
  • 抹杀了个人的能动性

马克思的预言:

  • 社会主义革命首先发生在资本主义发达的国家
  • 资本主义国家的工人工资水平越来越低,生活水平越来越低

波普尔认为[[历史主义]] 为[[极权主义]] 提供了哲学基础。

波普尔所指的历史主义指的是历史决定论,认为历史有绝对的终极规律,人们可以通过认识和掌握历史规律,进而来控制和计划社会的发展。对波普尔而言历史主义和历史决定论是同义词。波普尔明确反对这种历史主义。

  • 人类历史的进程受到人类知识进步的影响
  • 我们无法以合理科学的方法来预言我们科学知识的增长,因此我们无法预言历史的进程
  • 我们无法像理论物理那样找到一个理论可以解释历史社会科学
  • 历史主义的基本目标和构思就是错误的

[[本质主义]]指的是事物依赖概念,根据其本质就可以明确的加以定义,然后就可以通过某种方式将世界放到一个逻辑和关系中。本质主义理论有几个假设:

  • 有一种本质理论应该能够解释我们看到的所有现象
  • 科学家能够确立这种理论的真理性
  • 理论是终极的

本质主义是一种固化的思维模式,是对确定性的追求。教条式的信仰容易禁锢我们的思想,让我们无法获得进步,真正的无知,不是知识的缺乏,而是拒绝获取知识。

一个严重的后果就是,接受历史主义的人会认为个体是一种工具,是人类历史发展过程中一个微不足道的工具。而登上历史舞台的人,要么是一个伟大的国家,要么是一个伟大的领袖,要么就是一个伟大的阶级或概念,只要能够发现历史发展的法则和规律,就能够成功的预测未来的发展。这个想法成为了 20 世纪政治发展的基础。

但是历史主义还保留了集体主义的要素,依然强调某种集团,或集体,这是原始时代,部落的遗存,个人离开了部落就无法生存,不过在 20 世纪,人们把部落替换成国家或阶级的概念,波普尔认为,历史主义的根本错误在于人类无法通过理性、科学的方法来预知未来,问题不是在预知上,而是人类可以改变历史进程,人类对未来的预言甚至可能改变预言事物本身,波普尔认为历史主义错误地把自然科学的研究方法运用到了人类社会中,自然界是有规律的,但是人类社会却没有这样的普遍规律。

波普尔对[[历史主义]]的批判可以进一步归纳为对[[决定论]]的批判。

  • 人类的知识会对自身的行为有影响,新的认知会对未来的行为产生影响
  • 人类的认知是是会不断增长的
  • 在未来才能知道,现在不知道的知识对未来的行为会产生什么影响,不可预知

我们永远无法预测未来,对决定论的批判奠定了波普尔证伪理论的基础。

对柏拉图的批判

第一卷,集中讨论了柏拉图,苏格拉底和赫拉克利特,首先批评的哲学家是[[柏拉图]],他认为柏拉图是首个提出极权大于个人的思想家,柏拉图想要建立一个完美的城邦,理想国,国家才是人类命运的载体。柏拉图对人类历史的看法是,人类是不断堕落的,所以才需要设计一个乌托邦,一个理想的制度来防止人们堕落,在理想国当中,柏拉图提出统治者应当由哲学王来担当,哲学王既是哲学家又是统治者,而波普尔就认为,在柏拉图那里就孕育了极权主义,他已经确定了某种阶级具有绝对的权利,这为后来优等民族观念埋下了伏笔,而这些词汇都是纳粹党在 20 世纪经常使用的。希特勒、希姆莱、墨索里尼都是喜欢这样的词。在波普尔看来柏拉图笔下的理想国就是一个封闭社会,他会阻碍批判理性精神的出现,而只有批判理性主义才会使得个人对自己的道德选择负责,在波普尔看来个人主义和利他主义才是西方文明的根基。波普尔把柏拉图的政治思想叫做社会工程态度,社会工程师不关系历史的趋势和人类的命运,他相信,人类是历史的主人,相信我们可以按照我们的目的来影响或改变人类的历史,这些都是不同于历史主义的。因为历史主义者认为只有首先判定了历史进程我们才有政治行动。

对黑格尔的批判

第二卷,集中讨论了黑格尔和马克思,批评的第二个对象是黑格尔,他把黑格尔的哲学称为新部落主义,核心是国家主义,或者是柏拉图式的国家崇拜。这种学说主张国家高于一切,国家是神圣的,而个人什么都不是。波普尔认为黑格尔进一步发展了柏拉图的古典极权主义,黑格尔把一切都看做是哲学精神的展开过程,人类历史有一个内在的逻辑和动力,这是一种典型的历史主义看法,波普尔认为相信历史的必然性是完全错误的,这样的信念还会在实践中导致严重的问题,因为如果一个人相信历史是有必然性的,一切都会自然而然发生,那么我做什么和不做什么,到底会对历史造成什么影响呢?这样一来,个人就没有责任可言了。所以波普尔说,黑格尔否定了一切个人的道德和良心。波普尔甚至猜想黑格尔的哲学主张就是为普鲁士政府而服务的,所以在波普尔看来黑格尔的哲学成为了国家最卑微的服从。

社会工程的二分

[[社会工程]] 有两重含义:

  • 人是有主动性的
  • 对待社会就应该像对待一个工程一样

对社会工程做了二分:

  • 渐进的社会工程,通过零星的社会工程检验的社会技术,试错和检验的,一旦做错了可以及时的放弃或纠正这一部分,比如如果觉得一个社会贫富不均,那么可以通过提高富人的税率来试试看,而不能把所有的富人都杀掉或赶走,而且这种渐进的社会工程的目标不是最大限度的增加最大多数人的幸福,而是要最大限度的排除痛苦。虽然从表面上来看痛苦是幸福的反义词,但是波普尔认为幸福和痛苦不是一件事情的正反两面,因为幸福不能补偿痛苦,也不是没有痛苦的状态,相比之下如果是追求幸福,和减少痛苦,那么一定是减少痛苦来得比较迫切,锦上添花和雪中送炭就是这个意思。幸福是没有止境的,没有一个确定的终止,而且幸福因人而异,但是几乎所有的人都对什么是痛苦有着大同小异的看法,所以波普尔就提出消除痛苦是一件公共的事情,应该由政府了操心,而反过来追求幸福就是一件私事,留给个人努力就好了,不让政府来干预个人追求幸福的私事。
  • 乌托邦社会工程,从整体上重建社会,扫荡一切的变革,由于我们经验有限,这种变革的实际结果是很难进行计算的,乌托邦的社会工程要求理性地为全社会制定一个计划,但是我们不一定能保证得到一个良好的效果,而且我们也不一定具备取得这样良好效果的知识,事实上我们不可能拥有这份知识,因为我们在这样的计划活动方面是没有经验的,而实际知识必须以经验为基础。乌托邦的社会工程就是凭空地在脑袋里面构建出理想的蓝图,然后按照这个蓝图来平地起高楼,可是从人类历史上来看非常不幸,越是充满乌托邦的方案,越是最终导致灾难,譬如,柏拉图在理想国中指出,为了防止人私心的泛滥,就要废除家庭,让国家来抚养教育所有的小孩,但是我们发现这完全行不通,因为违背了基本的人性,在我们所知道的历史当中,大概也只有太平天国的时候短暂的实行过这样的做法,不过波普尔也说,提出乌托邦社会工程的,不一定都是坏人,很多人也并不是为了一己私利而提出乌托邦的,相反,他是历史主义者美好愿望的产物,但是美好愿望下可不一定有美好的结果。每一次我们想在地上知道天堂,但是旺旺带给人类的却是灾难和不幸。

相比之下,渐进的社会工程和乌托邦的社会工程,波普尔一定会选择前者,而反对后者。

  • 维护和平
  • 没有饥饿
  • 充分就业
  • 教育

波普尔的思想是自由主义的,但远远不止于自由主义。

国家和政府的基本看法 经济干预主义

看到资本主义和自由市场的局限性,主张应该通过改革来缓解资本主义生产过剩的情况,应该通过务实的改革,而不是阶级斗争来解决问题。

他支持政府应该对市场进行干预,但是也担心政府因此获得太多的权力,对于自由主义来说,国家的权力太大是他们尤其害怕的,国家干预是为了保障公民的自由,而且必须有一种机制来防止权力被滥用。1956 年波普尔在一篇杂志中说了这样一句话,「国家是一种必要的痛苦,他的权力不应当增加到超越其必要的程度。」在波普尔那里,政府只有两种,一种是专制政府,一种是可以通过非暴力形式来实现可代替的政府。波普尔认为[[苏格拉底]]就已经提出了一个开放社会的想法,这个想法出现在开放社会及其敌人的标题里面,什么是开放社会,开放社会是一种信赖,信赖人,信赖人道,信赖自由,封闭社会是一种半组织状态的联合体,在开放社会里,人是按照自己的理解和个人的兴趣去行动的,而在封闭社会里要按照社会集体的理解去行动。开放社会的敌人是野蛮社会,是政治上的极权主义。

波普尔认为有两种政府干预的类型,第一种是在法律框架内进行的,第二种是国家把一些权力授予一些机构,让那些机构伺机而动。第一种干预是制度化的,间接的,第二种干预是个人化的,直接的。波普尔认为第一种干预是好的,因为第一种情况权力不会被滥用,而第二种情况下,权力几乎是无法得到控制的,因为这些政府机构具有太大的自由裁量权。波普尔认为希特勒掌握政权的过程就是一个自由裁量权失控的过程,民众把自己的权力拱手让给一个领袖,一群政客,一小撮官僚,这也就意味着,一些原本应当由每一个人自己做主的选择,现在让渡给了其他人,波普尔认为这样就完成了一个飞越,从理性到非理性。非理性主义必然会提出一种观点,那就是强权即公意,而个人的利益和权力也会因此而忽视,个人会成为一颗螺丝钉,个人选择和行动的权力就会被剥夺,专制和暴君之门就会随之开启。

对科学哲学的贡献 可证伪理论

20 世纪 20 年代,欧洲最流行[[实证主义]],实证主义认为科学建立在两个基本的方法之上,那就是观察和归纳,观察就是去看自然界的各种现象,收集尽可能多的示例;而归纳则是从一个又一个具体的示例中总结出规律。

但是波普尔认为实证主义的观察和归纳都是有问题的,波普尔认为,科学的理论不是来自于观察,而是来自于问题和猜测,而且理论是先于观察的,我们总是带着一定的预设去观察一切东西,波普尔自己举了一个例子,他在维也纳当中学老师的时候,在物理课上对学生说,拿起你的笔和纸,仔细观察,然后记下观察的结果,学生们一脸茫然,反过来问他,你要我们观察什么呢?波普尔由此发现,观察本身是一个非常荒谬的指令,凡是反查都是有选择的,需要一个对象,一个明确的任务,一个焦点和一个问题,波普尔还引用了生物学家的例子,一个饥饿的动物会把周围的东西分成可吃的和不可吃的,一个逃跑的动物会把环境分为出路和藏身之处,同样人总是先提出问题和目标,然后根据目标和兴趣对外部的事物进行分类,再然后才会进行观察,所谓的纯粹的观察是不存在的。 其次波普尔反对归纳的方法,归纳只能告诉我们过去是什么样的,但是没有办法告诉我们未来是怎么样的。过去反复发生的事情并不能保证未来仍然会发生,所以波普尔认为归纳法本身就是不科学的方法,要把归纳法排除到科学之外。波普尔提出全称命题不是从单称命题推导出来的,但是全称命题可以被单称问题反驳,因为他们与经验上,客观上的事实相冲突。 波普尔的看法对以往的科学观是颠覆性的,提出科学理论是对事实关系的大胆猜测,而不是从实际关系中获得的,但是这些理论可以被观察证伪。这就是著名的可证伪理论。

科学在原则上是要接受经验的检验的,如果不能接受经验的检验那就不是科学。有一些命题无法接受检验,比如说逻辑定律,数学命题,形而上学,和宗教命题,当然还有一些伪科学,观相,星象学,甚至弗洛伊德的心理分析也不是科学,因为一个人对另外一个人梦境的解释,也无法接受检验。对波普尔来说,科学总是通过猜测、试错和反对而前进的,并不是一劳永逸的科学,也没有永远的正确,我们只能说某个理论在现阶段是最好的,他能够解释最多的世界,而且没有出现与之相反的情况,对科学反驳也要提出论据,有些东西自己宣称是科学,但从来不接受任何检验那就有问题了。科学总是从错误中学习的,科学是可以错的,科学史甚至可以是一部充满错误的历史。波普尔说科学的态度,就是批判的态度,这种态度并不去寻求证实,而是却寻求检验,这些检验能反驳被检验的理论,虽然这些检验绝不能证实它。相反那些非科学的理论则声称自己是绝对没有谬误的,是绝对不会错的。


2022-06-04 philosophy , politics , society , popper , 经济 , 科学 , 波普尔 , 政治哲学 , 科学哲学 , 可证伪

Proxmox VE 从 6 升级到 7

Proxmox VE 6.4 版本已经 停止更新 ,只能升级到 7.x 版本了。Proxmox VE(后简称 PVE) 7.x 版本使用 Debian 11(bullseye)。

通常有两种方式升级 PVE 6.x 系统到 7.x:

  • 在硬件上全新安装,然后从备份中恢复 VMs
  • 通过 apt (按步骤) 在 PVE 6.x 上升级

全新安装然后恢复的方式直接看 官网文档 ,这里就只总结一下原地通过 apt 方式平滑升级到 7.x 的过程。

Preconditions

  • 升级到 PVE 6.x (最新版本是 6.4)
    • apt update && apt upgrade -y
  • 如果使用了 Hyper-converged Ceph, 需要根据 文档 将 Ceph Nautilus cluster 升级到 Ceph 15.2 Octopus
  • 如果使用 Proxmox Backup Server 需要同步 升级到 1.2 版本
  • 可靠的连接,推荐使用 iKVM 或者 [[IPMI]],或者可以直接物理访问的方式,以防止突然网络断开可能造成的问题
    • 如果只有 SSH 连接,推荐在非生产的环境中先测试升级,然后再升级生产
    • 或者使用可靠的 [[Tmux]]
  • 备份并验证所有 VMs 和 CTs 的完整性,防止出现问题
  • 在 root 分区至少需要 4 GiB 空闲空间
  • 查阅所有 已知的升级问题

在更新之前,先把虚拟机全部关机,并且取消所有的自动启动(Options->Start at boot 取消勾选)。

Step by step

使用 pve6to7 来检查,这个程序会检查升级必须要执行的内容,并给出建议和警告

pve6to7

确保没有 FAILURES。

确保在升级之前执行一次完整检查:

pve6to7 --full

这个脚本会检查并告警,但是默认情况下,不会对系统做任何修改,告警的问题不会自动修复,需要用户手动解决,并且需要记住 PVE 可以被高度的修改,这个脚本不会检查出所有的问题。

迁移重要的 Virtual Machines 和 Containers

如果有 VMs 或 CTs 不能接受在升级过程中停机,可以将他们迁移到其他节点。VM 或 CT 从低版本 PVE 迁移到高版本是兼容的。但是从高版本迁移到低版本 PVE 可能出现问题。如果要升级 PVE 集群,这一点请铭记。

检查网桥

升级后,网桥的 MAC 地址可能发生变化。可以通过如下两个方式解决。

使用 ifupdown2

如果已经在 PVE 6 下使用了 ifupdown2 ,那么升级到 PVE 7.x 的时候,ifupdown2 (3.1.0-1+pmx1) 版本会自动适配。

使用硬编码的 MAC 地址

如果需要保留老的 MAC 地址,那么需要手动配置 /etc/network/interfaces ,添加 hwaddress MAC。可以使用 ip -c link 来查看网卡的 MAC 地址。默认情况下,主要的网桥叫做 vmbr0

auto vmbr0
iface vmbr0 inet static
    address 192.168.X.Y/24
    hwaddress aa:bb:cc:12:34
    # ... remaining options

如果安装了 ifupdown2 ,可以使用 ifreload -a 来应用修改。如果使用老的 ifupdown,没有 ifreload 命令,可以重启,或者重启接口 ifdown vmbr0 然后 ifup vmbr0。注意,硬编码的 MAC 地址在更换了物理网卡之后需要手动修改。

更新 APT repositories

确保已经更新到 6.4

apt update
apt dist-upgrade

更新所有 Debian repository 到 Bullseye

sed -i 's/buster\/updates/bullseye-security/g;s/buster/bullseye/g' /etc/apt/sources.list

对于非订阅用户:

sed -i -e 's/buster/bullseye/g' /etc/apt/sources.list.d/pve-install-repo.list 

如果配置了 Ceph 那么也需要修改, 具体可参考官网。

然后执行:

apt update

升级系统到 Debian Bullseye 和 Proxmox VE 7.0

注意这一步根据不同的网络环境(bandwidth)和系统性能(filesystem’s IOPS),可能会花费不同的时间,对于一个比较慢的系统可能花费 60 分钟或更多,对于高性能的 SSD 存储可能只需要数分钟。

apt dist-upgrade

在升级的过程中可能会有弹出窗口讯问是否需要替换一些配置文件,根据需要自行选择即可。

命令执行完成之后,重启系统就可以享受新的 PVE kernel 了。

问题

OVH 机器升级后网络问题

一台 OVH(So you Start) 独立服务器上的 PVE 从 6.4 升级到 7.0 之后,重启系统后无法找到网络。

仔细的搜索了一番,并看了很多帖子之后得出来的结论是,OVH(So you Start)的机器网络配置会根据 mac 地址。PVE 升级的过程中会将网络接口的 mac 地址改掉,需要在 /etc/network/interfaces 中把网络接口的硬件 mac 地址配置上。

iface eth0 inet manual

auto vmbr0
iface vmbr0 inet dhcp
        hwaddress ac:xx:yy:ee:cf:xx   # <- 这里
        bridge-ports eth0
        bridge-stp off
        bridge-fd 0

而我机器的问题是在 PVE 升级的过程中将网络接口的名字也改了,以前叫 eno3,现在升级之后变成了 eth0。所以需要将配置中对应的 eno3 都替换成 eth0

这些网络配置信息都可以从 Rescue mode 中,执行 ip aip r 来获取。进入 Rescue mode 的方式是从 Web 管理后台,点击 Netboot,然后选择 Rescue,重启服务器。过一会儿后注册账户的邮箱里面会收到 Rescue mode 机器的密码,使用 ssh 连接,然后在 Rescue mode 中挂载磁盘。Rescue mode 类似于 OVH 用网络启动的方式启动了一个恢复模式的系统,在这个系统中可以看到 OVH 机器系统上的配置文件。通过恢复模式可以去修复一些常见的配置文件导致的系统挂掉的情况。

首先执行 fdisk -l 查看磁盘,然后找到系统的分区,一般会在第一块硬盘上的某个分区中。然后挂载分区到本地的 /mnt 目录中:

mount /dev/sda2 /mnt

然后进入 /mnt 目录修改机器上的 etc/network/interfaces 注意,这里别修改到 Rescue mode 系统的配置,这里的配置是在 /mnt 目录下的。

升级后虚拟机启动问题

启动虚拟机报错:

TASK ERROR: failed to get address info for: localhost: Temporary failure in name resolution

需要在 PVE 系统的 /etc/hosts 文件中配置 localhost。

  • [[Proxmox VE]]
  • [[Ceph]]

reference


2022-06-04 proxmox , pve , pve-upgrade , proxmox-ve , debian , apt

在停止的 Docker 中其中执行命令

当 Docker 容器在执行的时候,可以通过 exec 命令来进入容器执行命令,那么如果一个容器已经停止了,或者想要查看一个构建好的镜像中的内容,那应该怎么办呢?exec 命令肯定是用不了的。

这个时候可以使用 docker run --rm 命令来起一个临时的容器,然后再其中执行 /bin/sh

docker run -it --rm --entrypoint sh some/image

2022-06-02 docker , linux , docker-compose

电子书

本站提供服务

最近文章

  • 2024 年台北之行 去年的时候就得知了海外的大陆人可以通过官方网站申请入台证,从而可以在海外直接入境台湾,所以 4 月份女朋友过来日本之后就通过线上系统申请了入台证,入台证申请通过并付费之后是只有 3 个月有效期的,因为我们申请的比较晚,所以有效期的三个月正好落在了最热的 7,8,9 月份,但考虑到暑假有假期,我们还是决定硬着头皮买了机票。
  • macOS 上的多栏文件管理器 QSpace QSpace 是一个 macOS 上的多窗口平铺的文件管理器,可以作为 Finder 的代替,在 Windows 上曾经用过很长时间的 [[Total Commander]],后来更换到 Linux Mint 之后默认的文件管理器自带多面板,反而是用了很多年 macOS ,才意识到原来我缺一个多窗口,多面板的文件管理器。
  • Dinox 又一款 AI 语音转录笔记 前两天介绍过 [[Voicenotes]],也是一款 AI 转录文字的笔记软件,之前在调查 Voicenotes 的时候就留意到了 Dinox,因为是在小红书留意到的,所以猜测应该是国内的某位独立开发者的作品,整个应用使用起来也比较舒服,但相较于 Voicenotes,Dinox 更偏向于一个手机端的笔记软件,因为他整体的设计中没有将语音作为首选,用户也可以添加文字的笔记,反而在 Voicenotes 中,语音作为了所有笔记的首选,当然 Voicenotes 也可以自己编辑笔记,但是语音是它的核心。
  • Emote 又一款 AI 语音笔记应用 继发现了 Voicenotes 以及 Dinox 之后,又发现一款语音笔记 Emote,相较于前两款应用,Emote 吸引我的就是其实时转录的功能,在用 Voicenotes 的时候时长担心如果应用出现故障,没有把我要录下来的话录制进去,后期怎么办,而 Emote 就解决了这个问题,实时转录的功能恰好作为了一个声音录制的监听。
  • 音流:一款支持 Navidrome 兼容 Subsonic 的跨平台音乐播放器 之前一篇文章介绍了Navidrome,搭建了一个自己在线音乐流媒体库,把我本地通过 [[Syncthing]] 同步的 80 G 音乐导入了。自己也尝试了 Navidrome 官网列出的 Subsonic 兼容客户端 [[substreamer]],以及 macOS 上面的 [[Sonixd]],体验都还不错。但是在了解的过程中又发现了一款中文名叫做「音流」(英文 Stream Music)的应用,初步体验了一下感觉还不错,所以分享出来。