Owncast 是一个开源,可自行架设的、去中心化的,单用户视频串流工具。Owncast 使用 Go 语言编写。支持简单的在线聊天,支持 HLS 和 S3 存储。
Owncast 可以很好的成为 Twitch,YouTube Live 等等在线直播平台的代替。用户可以完整地控制自己的内容以及服务器。
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,在设置>服务中选择自定义(Custom),在管理员页面获取 RTMP 服务器链接和流密钥并填入 OBS 中,点击 Start Streaming 测试链接,开始推流。
也可以直接从命令行使用 [[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
今天在 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 中大部分行为都会有一个 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
目录也是一样的,这个目录中包含标签的信息。
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 itMERGE_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
是 Git 的安全网,他会记录在仓库中所有的操作。可以将其想象成一个本地仓库修改的时序历史记录.
Git reflog 是一个你对本地仓库所作的所有修改的记录。每一次提交,每一次切换分支,都会在 reflog 中留下记录。
在 Git 仓库中执行:
git reflog
ceb40ab HEAD@{0}: commit: messsage
《金融的本质》是美联储主席[[本 伯南克]]关于美联储历史,以及在 2008 年应对金融危机手段的一本科普读物。本伯南克以非常通俗的语言讲述了美联储的历史,以及央行的职能。每一章节后面都有一个答学生的提问,所以看起来就像是一本写给学生的科普读物,读完可以对美联储是做什么的?为什么要成立美联储?以及当危机来临时美联储能够做什么?有非常详细的介绍和解释。
在和朋友聊天的时候,说到美联储,于是朋友给推荐了这一本。
美联储作为美国的央行,其决定对全世界的经济都会产生一定的影响,这两天美联储加息,股市暴跌,成为了日常的新闻。而美联储为什么要这么做呢?很多报道都会提到为了压制美国的通货膨胀,而为什么美联储能够通过调整利率来影响通货膨胀呢?这一本书里面都有详细的说明。
中央银行的职能:
显然为了实现央行的职能,美联储能够使用一些工具来调整经济运行。
这里提到的短期利率,主要是对隔夜拆借利率的管理。也就是调整各银行向美联储借钱的成本,隔夜利率又称联邦基金利率。通过提高或降低短期利率,美联储可以影响更大范围的利率。
在最极端的情况下,如果调整货币政策已经无法影响经济,美联储还可以实行大规模资产购买计划,即媒体和其他地方所说的量化宽松。
基本工具:
什么是金本位呢?相信大部分人在教科书上曾经学过,简单来说就是一个国家的货币发行和黄金储备挂钩,央行有多少黄金才能发行多少货币,金本位是一种货币体系,在这个体系中,货币的价值以黄金的重量来衡量。这也就意味着手上的货币可以到央行兑换黄金。
但是也相信大部分人都知道金本位在上世纪已经破产了,大部分的国家已经抛弃了金本位。
金本位的缺点:
金本位的优点:
通货膨胀无论在何时何地都是一个货币现象。通过货币政策来维持过底的失业率,最终会引发通货膨胀。 价格是经济的温控器,是经济赖以运行的机制。所以,管控工资和物价意味着整个经济体存在短缺及其他各种问题。 低通胀是一件非常好的事情,长时间低而稳定的通胀率会使经济更加稳定,有利于保持健康的增长率和生产率以维持经济活动。
[[大而不倒]],有一部同名的纪录片讲述的就是 08 年金融危机之后,美国财政部长,联合美联储,巴菲特等等在经济中扮演重要角色的人物拯救华尔街金融机构的故事。而大而不倒也成为了经济中一个潜在的问题,如果一家机构大到足够影响经济,那么就不会让其轻易地倒闭,显然长期来看对于整个宏观经济是不利的。如果一个体系中存在一些企业“大而不倒”(too big to fail),那么这个体系一定存在某些根本性缺陷。
想要确保金融体系有所变革,为的是以后再有类似美国国际集团这样的系统重要性机构面临此类压力时,能够以一种安全的方式倒闭。
《若为自由故:自由软件之父理查德·斯托曼传》是 [[Richard Stallman]] 的个人传记,在读完 [[自由软件 自由社会]] 的时候就把这一本书加入了待看列表。《自由软件 自由社会》中只介绍了 Stallman 关于自由软件的哲学思考,没有涉及到 Stallman 是怎么形成自己的思想的原由。而这一本传记能够更清楚的看到 Stallman 如何争取一台打印机驱动,到对争取软件自由运动的全部过程。
虽然站在 2022 年再去回顾这位传奇黑客有一点晚,并且 Stallman 固执的性格也常常出现在新闻中,但是这一切都无法抹去他在自由软件运动,在 GNU 项目,在自由软件基金会的贡献。
鉴于可能有人不认识 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
一词,
想要了解计算机,尤其是自由软件发展历程的人。
我希望每个人都能珍视自由,也能拥有自由。 没有人可以写出没有错误的代码。通过共享软件代码,黑客们把不断改进程序作为终极的目标,甚至超越了个人野心。
《刷新:重新发现商业与未来》是微软第三任 CEO [[萨提亚 纳德拉]] 的传记,好朋友之前推荐过一次,后来在听《无人知晓》播客的时候又再一次被提到,所以就把这一本列在了 [[20220605 21 天挑战计划]] 中。
让我想要去了解萨提亚的是,我能在最近几年中明显感受到微软的变化,从股价上也能看到资本市场对微软的重新定价。读完,我才真正明白一位 CEO 对于一个公司未来方向的决定作用,寻求合作,拥抱开放,萨提亚的出现成为了微软近几年转型的重要角色。但是在书中不仅能看到萨提亚在微软的经历,也能看到他的成长过程,以及关于他关于「同理心」的认识和实践。
最近几年微软的收购案也是让我对这位 CEO 产生好奇的原因,甚至金额越来越大:
和成长型思维(growth mindset)对立的是固定思维(fixed mindset)。
萨提亚认为,一个人无法去准确地预测未来科技变化,但是成长型思维模式可以使他更好地对不确定性做出反应,并且在技术快速变化的情况下,去纠正自己所犯的错误,因此需要不断“刷新”。
这个思想和我刚刚看过的[[波普尔的哲学思想]]有着非常相似的思考路径,他们都认为我们无法避免犯错,唯一知道的就是去验证自己的思考,不断的纠正自己的过错。这个是萨提亚所说的「刷新」,也是波普尔所说的[[批判理性主义]]。我想这也是这本书标题「刷新」的由来。
批判理性主义提倡多元,包容,通过理性讨论和诚实寻求真相来解决冲突,萨提亚也认为「辩论和争辩的绝对必要」,通过相互交换意见想法,畅所欲言最后才能达到一个文化上的统一。
站在微软角度,纳德拉提出了三种方式练习成长型思维:
看完全书就会发现萨提亚在书中的每一个地方到提到了「同理心」,原文是 「Empathy」
同理心一词贯穿在全书中,我们可以理解成共情,同感,可以理解成换位思考,去设身处地地理解对方的思维、感受、想法,在后文萨提亚提到,「对残疾人抱以同理心,对在城市贫民区和锈带谋生的人们抱以同理心,对亚非拉发展中国家的人们抱以同理心,对努力获取成功的小企业主们抱以同理心,对任何因肤色、信仰或恋爱对象而遭受暴力和仇恨攻击的人抱以同理心。」,还包括对薪资不平等而提出疑问的女性的同理心,对普通职员的同理心,对经理的同理心。更进一步萨提亚将同理心作为信任中必不可少的一部分:
信任=同理心+共同的价值观+安全可靠
萨提亚提及的同理心来自于自己的求职精力,来自于自己的家庭,萨提亚在书中提到了一个面试插曲,当接受了一整天的面试,最后一位面试官问萨提亚,「如果看到一个婴儿躺在马路上哭,会怎么做?」,萨提亚回答了,「拨打911」,面试官在送萨提亚走出办公室的时候,和萨提亚说,「小伙子,你需要更多同理心,如果一个婴儿躺在马路上,你应该把这个婴儿抱起来」。这个故事让我一下子联想到最近发生的「唐山打人案件」,让我想起了[[小悦悦事件]],当有人被打到在地,当有小孩被车碾过,只要抱有一点点道德良知就应该知道,要做的事情并不只有报警而已。之后,萨提亚的第一个孩子因为重度大脑性瘫痪,未来将需要依赖轮椅生活,但这样的打击让萨提亚更能去理解孩子的遭遇,去理解他的痛苦。最后才会发出感慨,「只有经历过人生起伏,才能培养起同理心,要想不受苦难,或者少受苦难,就必须接纳无常」。
隐私,安全,言论自由是数字时代永恒的价值观。纳德拉从索尼被黑色入侵勒索开始,一直讲述到斯诺登。
后门,会导致安全被削弱,加剧不信任。故意设计后门,为访问某人的私人数据提供便利是一件危险的事情
隐私和安全最终的解决办法是确保彼此的信任。只有保护个人自由的规则清楚明了并且得到一致的遵守,构建和维持这种信任,在个人和公共责任之间找到平衡,向来是制度进步的特征。这是一门艺术,而非科学。
科技公司必须把信任科技到一切,信任不仅取决于技术,还有赖于管理它的法律框架。纳德拉认为在数字世界,信任的天平被打破了,因为法律没有跟上技术的变革。
同样在书中能看到纳德拉认同美国[[宪法第一修正案]]中保证的言论自由,[[宪法第四修正案]]保护美国人不接受不合理搜查和拘押的权利。他以自身的经历去思考印度的历史,去回顾美国司法历程,他主张通过制定新时代的法律来保证个人隐私得到保护的同时为执法机关访问数据提供便利。
也许我们的产品会瞬间即逝,但我们的价值观是永恒的。
Shaarli 是一个使用 PHP 编写的,开源的,可自行搭建的书签服务,无需数据库依赖。在很早几年曾经出现过一款叫做 Delicious 的在线书签收藏和分享的网站,但今天一查也早已经在 7 年前关闭了。这些年兜兜转转发现还是当只有自己掌握了软件、数据才是最安全的,不管是本地的应用还是在线的服务,越来越觉得 [[Richard Stallman]] 所提及的自由软件之珍贵。
这篇文章就简单的介绍一下 Shaarli 搭建的过程。
使用 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 中创建一个 Host,然后填入
将下面的 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。
自己组的 NAS,是用 Proxmox VE 做虚拟化,然后再其中安装了 OpenMediaVault 作为 NAS 系统,因为时间有些久1,所以不免有点担心硬盘的寿命,所以今天来好好了解一下 SMART 信息,并对磁盘进行一个全面的诊断,以保护数据的安全。
查看 S.M.A.R.T 信息是用来监控硬盘健康状态最直接的办法。
S.M.A.R.T 全称是 Self-Monitoring, Analysis and Reporting Technology,这是硬盘内建的一种状态检测和预警规范。2
SMART 信息中包含了硬盘的运行信息,包括硬盘的工作时间,通电次数,盘片温度,坏块的数量,写入量,读取量等等
在 Proxmox VE 后台能直接通过界面查看到磁盘的 SMART 信息。
点击左侧的 PVE 节点,然后在 Disks
中就能查看到磁盘的信息。
如果熟悉命令行,也可以直接 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
前两位十六进制数,括号中为对应的十进制,表示检测的参数,各个硬盘制造商大部分的 SMART ID 所代表的含义是一致的。但有的厂商也会根据自己的需求增减 ID。
属性名,ID 代码的文字解释。
属性标志
当前值,根据硬盘运行数据计算获得。
最差值,是硬盘运行时各 ID 曾出现过的最小 Value。
通常最差值与当前值是相等的,如果最差值出现较大波动,小于当前值,表明磁盘曾经出现过错误。
在报告硬盘 FAILED 状态前,WORST 可以允许的最小值。
原始值,是硬盘运行时各项参数的实测值。
属性的类型(Pre-fail 或 Oldage)
如果 VALUE 小于等于 THRESH,会被设置成“FAILING_NOW”;如果 WORST 小于等于 THRESH 会被设置成“In_the_past”;如果都不是,会被设置成“-”。在“FAILING_NOW”情况下,需要尽快备份重要 文件,特别是属性是 Pre-fail 类型时。“In_the_past”代表属性已经故障了,但在运行测试的时候没问题。“-”代表这个属性从没故障过。
属性的更新频率。Offline 代表磁盘上执行离线测试的时间。
底层数据读取错误率,当前值应远大于临界值。
数值越大越好。
当前值如果偏低或趋近临界值,表示硬盘存在严重的问题。但现在的硬盘通常显示数据值为 0 或根本不显示此项,一般在进行了人工脱机 SMART 测试后才会有数据量。
数据应为 0,当前值应远大于与临界值。
表示硬盘寻道操作的平均性能(寻道速度),通常与前一项(寻道错误率)相关联。
表示硬盘通电的时间,数据值直接累计了设备通电的时长,新硬盘当然应该接近 0,但不同硬盘的计数单位有所不同,有以小时计数的,也有以分、秒甚至 30 秒为单位的,这由磁盘制造商来定义。 这一参数的临界值通常为 0,当前值随着硬盘通电时间增加会逐渐下降,接近临界值表明硬盘已接近预计的设计寿命,这并不表明硬盘将出现故障或立即报废。参考磁盘制造商给出的该型号硬盘的 MTBF(平均无故障时间)值,可以大致估计剩余寿命或故障概率。
对于固态硬盘,要注意“设备优先电源管理功能(device initiated power management,DIPM)”会影响这个统计:如果启用了 DIPM,持续通电计数里就不包括睡眠时间;如果关闭了 DIPM 功能,那么活动、空闲和睡眠三种状态的时间都会被统计在内。
《开放社会及其敌人》是 [[波普尔]] 的一本政治哲学著作,是我 [[20220515-21-天计划]] 中的想要阅读的一本书,本来在上一个 21 天计划中就想要读完的,但是因为其内容复杂程度超出了我的想象,波普尔旁征博引,对柏拉图,黑格尔,马克思的观点信手拈来,但是我去消化的时候不仅需要先理解其引用的观点,还需要进一步去理解波普尔自己的观点,就使得我在上一个周期中没有完成,所以这一个 21 天计划依然把这本书列为必须要读完的图书之一。
最早知道[[波普尔]]是因为他在科学哲学领域提出的[[可证伪理论]],还有在看[[索罗斯]]传记的时候不停地引用波普尔的观点,进而我又看了其论文集[[通过知识获得解放]],进而逐渐对其理论形成了一个基础的概念,然后我才决定开始阅读这一本《开放社会及其敌人》,想要完整地了解波普尔在政治哲学领域的集大成之作。
什么是 [[开放社会]]
[[封闭社会]]
批判 [[历史主义]],[[极权主义]]
马克思的预言:
波普尔认为[[历史主义]] 为[[极权主义]] 提供了哲学基础。
波普尔所指的历史主义指的是历史决定论,认为历史有绝对的终极规律,人们可以通过认识和掌握历史规律,进而来控制和计划社会的发展。对波普尔而言历史主义和历史决定论是同义词。波普尔明确反对这种历史主义。
[[本质主义]]指的是事物依赖概念,根据其本质就可以明确的加以定义,然后就可以通过某种方式将世界放到一个逻辑和关系中。本质主义理论有几个假设:
本质主义是一种固化的思维模式,是对确定性的追求。教条式的信仰容易禁锢我们的思想,让我们无法获得进步,真正的无知,不是知识的缺乏,而是拒绝获取知识。
一个严重的后果就是,接受历史主义的人会认为个体是一种工具,是人类历史发展过程中一个微不足道的工具。而登上历史舞台的人,要么是一个伟大的国家,要么是一个伟大的领袖,要么就是一个伟大的阶级或概念,只要能够发现历史发展的法则和规律,就能够成功的预测未来的发展。这个想法成为了 20 世纪政治发展的基础。
但是历史主义还保留了集体主义的要素,依然强调某种集团,或集体,这是原始时代,部落的遗存,个人离开了部落就无法生存,不过在 20 世纪,人们把部落替换成国家或阶级的概念,波普尔认为,历史主义的根本错误在于人类无法通过理性、科学的方法来预知未来,问题不是在预知上,而是人类可以改变历史进程,人类对未来的预言甚至可能改变预言事物本身,波普尔认为历史主义错误地把自然科学的研究方法运用到了人类社会中,自然界是有规律的,但是人类社会却没有这样的普遍规律。
波普尔对[[历史主义]]的批判可以进一步归纳为对[[决定论]]的批判。
我们永远无法预测未来,对决定论的批判奠定了波普尔证伪理论的基础。
第一卷,集中讨论了柏拉图,苏格拉底和赫拉克利特,首先批评的哲学家是[[柏拉图]],他认为柏拉图是首个提出极权大于个人的思想家,柏拉图想要建立一个完美的城邦,理想国,国家才是人类命运的载体。柏拉图对人类历史的看法是,人类是不断堕落的,所以才需要设计一个乌托邦,一个理想的制度来防止人们堕落,在理想国当中,柏拉图提出统治者应当由哲学王来担当,哲学王既是哲学家又是统治者,而波普尔就认为,在柏拉图那里就孕育了极权主义,他已经确定了某种阶级具有绝对的权利,这为后来优等民族观念埋下了伏笔,而这些词汇都是纳粹党在 20 世纪经常使用的。希特勒、希姆莱、墨索里尼都是喜欢这样的词。在波普尔看来柏拉图笔下的理想国就是一个封闭社会,他会阻碍批判理性精神的出现,而只有批判理性主义才会使得个人对自己的道德选择负责,在波普尔看来个人主义和利他主义才是西方文明的根基。波普尔把柏拉图的政治思想叫做社会工程态度,社会工程师不关系历史的趋势和人类的命运,他相信,人类是历史的主人,相信我们可以按照我们的目的来影响或改变人类的历史,这些都是不同于历史主义的。因为历史主义者认为只有首先判定了历史进程我们才有政治行动。
第二卷,集中讨论了黑格尔和马克思,批评的第二个对象是黑格尔,他把黑格尔的哲学称为新部落主义,核心是国家主义,或者是柏拉图式的国家崇拜。这种学说主张国家高于一切,国家是神圣的,而个人什么都不是。波普尔认为黑格尔进一步发展了柏拉图的古典极权主义,黑格尔把一切都看做是哲学精神的展开过程,人类历史有一个内在的逻辑和动力,这是一种典型的历史主义看法,波普尔认为相信历史的必然性是完全错误的,这样的信念还会在实践中导致严重的问题,因为如果一个人相信历史是有必然性的,一切都会自然而然发生,那么我做什么和不做什么,到底会对历史造成什么影响呢?这样一来,个人就没有责任可言了。所以波普尔说,黑格尔否定了一切个人的道德和良心。波普尔甚至猜想黑格尔的哲学主张就是为普鲁士政府而服务的,所以在波普尔看来黑格尔的哲学成为了国家最卑微的服从。
[[社会工程]] 有两重含义:
对社会工程做了二分:
相比之下,渐进的社会工程和乌托邦的社会工程,波普尔一定会选择前者,而反对后者。
波普尔的思想是自由主义的,但远远不止于自由主义。
看到资本主义和自由市场的局限性,主张应该通过改革来缓解资本主义生产过剩的情况,应该通过务实的改革,而不是阶级斗争来解决问题。
他支持政府应该对市场进行干预,但是也担心政府因此获得太多的权力,对于自由主义来说,国家的权力太大是他们尤其害怕的,国家干预是为了保障公民的自由,而且必须有一种机制来防止权力被滥用。1956 年波普尔在一篇杂志中说了这样一句话,「国家是一种必要的痛苦,他的权力不应当增加到超越其必要的程度。」在波普尔那里,政府只有两种,一种是专制政府,一种是可以通过非暴力形式来实现可代替的政府。波普尔认为[[苏格拉底]]就已经提出了一个开放社会的想法,这个想法出现在开放社会及其敌人的标题里面,什么是开放社会,开放社会是一种信赖,信赖人,信赖人道,信赖自由,封闭社会是一种半组织状态的联合体,在开放社会里,人是按照自己的理解和个人的兴趣去行动的,而在封闭社会里要按照社会集体的理解去行动。开放社会的敌人是野蛮社会,是政治上的极权主义。
波普尔认为有两种政府干预的类型,第一种是在法律框架内进行的,第二种是国家把一些权力授予一些机构,让那些机构伺机而动。第一种干预是制度化的,间接的,第二种干预是个人化的,直接的。波普尔认为第一种干预是好的,因为第一种情况权力不会被滥用,而第二种情况下,权力几乎是无法得到控制的,因为这些政府机构具有太大的自由裁量权。波普尔认为希特勒掌握政权的过程就是一个自由裁量权失控的过程,民众把自己的权力拱手让给一个领袖,一群政客,一小撮官僚,这也就意味着,一些原本应当由每一个人自己做主的选择,现在让渡给了其他人,波普尔认为这样就完成了一个飞越,从理性到非理性。非理性主义必然会提出一种观点,那就是强权即公意,而个人的利益和权力也会因此而忽视,个人会成为一颗螺丝钉,个人选择和行动的权力就会被剥夺,专制和暴君之门就会随之开启。
20 世纪 20 年代,欧洲最流行[[实证主义]],实证主义认为科学建立在两个基本的方法之上,那就是观察和归纳,观察就是去看自然界的各种现象,收集尽可能多的示例;而归纳则是从一个又一个具体的示例中总结出规律。
但是波普尔认为实证主义的观察和归纳都是有问题的,波普尔认为,科学的理论不是来自于观察,而是来自于问题和猜测,而且理论是先于观察的,我们总是带着一定的预设去观察一切东西,波普尔自己举了一个例子,他在维也纳当中学老师的时候,在物理课上对学生说,拿起你的笔和纸,仔细观察,然后记下观察的结果,学生们一脸茫然,反过来问他,你要我们观察什么呢?波普尔由此发现,观察本身是一个非常荒谬的指令,凡是反查都是有选择的,需要一个对象,一个明确的任务,一个焦点和一个问题,波普尔还引用了生物学家的例子,一个饥饿的动物会把周围的东西分成可吃的和不可吃的,一个逃跑的动物会把环境分为出路和藏身之处,同样人总是先提出问题和目标,然后根据目标和兴趣对外部的事物进行分类,再然后才会进行观察,所谓的纯粹的观察是不存在的。 其次波普尔反对归纳的方法,归纳只能告诉我们过去是什么样的,但是没有办法告诉我们未来是怎么样的。过去反复发生的事情并不能保证未来仍然会发生,所以波普尔认为归纳法本身就是不科学的方法,要把归纳法排除到科学之外。波普尔提出全称命题不是从单称命题推导出来的,但是全称命题可以被单称问题反驳,因为他们与经验上,客观上的事实相冲突。 波普尔的看法对以往的科学观是颠覆性的,提出科学理论是对事实关系的大胆猜测,而不是从实际关系中获得的,但是这些理论可以被观察证伪。这就是著名的可证伪理论。
科学在原则上是要接受经验的检验的,如果不能接受经验的检验那就不是科学。有一些命题无法接受检验,比如说逻辑定律,数学命题,形而上学,和宗教命题,当然还有一些伪科学,观相,星象学,甚至弗洛伊德的心理分析也不是科学,因为一个人对另外一个人梦境的解释,也无法接受检验。对波普尔来说,科学总是通过猜测、试错和反对而前进的,并不是一劳永逸的科学,也没有永远的正确,我们只能说某个理论在现阶段是最好的,他能够解释最多的世界,而且没有出现与之相反的情况,对科学反驳也要提出论据,有些东西自己宣称是科学,但从来不接受任何检验那就有问题了。科学总是从错误中学习的,科学是可以错的,科学史甚至可以是一部充满错误的历史。波普尔说科学的态度,就是批判的态度,这种态度并不去寻求证实,而是却寻求检验,这些检验能反驳被检验的理论,虽然这些检验绝不能证实它。相反那些非科学的理论则声称自己是绝对没有谬误的,是绝对不会错的。
Proxmox VE 6.4 版本已经 停止更新 ,只能升级到 7.x 版本了。Proxmox VE(后简称 PVE) 7.x 版本使用 Debian 11(bullseye)。
通常有两种方式升级 PVE 6.x 系统到 7.x:
全新安装然后恢复的方式直接看 官网文档 ,这里就只总结一下原地通过 apt 方式平滑升级到 7.x 的过程。
apt update && apt upgrade -y
在更新之前,先把虚拟机全部关机,并且取消所有的自动启动(Options->Start at boot 取消勾选)。
使用 pve6to7
来检查,这个程序会检查升级必须要执行的内容,并给出建议和警告
pve6to7
确保没有 FAILURES。
确保在升级之前执行一次完整检查:
pve6to7 --full
这个脚本会检查并告警,但是默认情况下,不会对系统做任何修改,告警的问题不会自动修复,需要用户手动解决,并且需要记住 PVE 可以被高度的修改,这个脚本不会检查出所有的问题。
如果有 VMs 或 CTs 不能接受在升级过程中停机,可以将他们迁移到其他节点。VM 或 CT 从低版本 PVE 迁移到高版本是兼容的。但是从高版本迁移到低版本 PVE 可能出现问题。如果要升级 PVE 集群,这一点请铭记。
升级后,网桥的 MAC 地址可能发生变化。可以通过如下两个方式解决。
如果已经在 PVE 6 下使用了 ifupdown2
,那么升级到 PVE 7.x 的时候,ifupdown2 (3.1.0-1+pmx1) 版本会自动适配。
如果需要保留老的 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 地址在更换了物理网卡之后需要手动修改。
确保已经更新到 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
注意这一步根据不同的网络环境(bandwidth)和系统性能(filesystem’s IOPS),可能会花费不同的时间,对于一个比较慢的系统可能花费 60 分钟或更多,对于高性能的 SSD 存储可能只需要数分钟。
apt dist-upgrade
在升级的过程中可能会有弹出窗口讯问是否需要替换一些配置文件,根据需要自行选择即可。
命令执行完成之后,重启系统就可以享受新的 PVE kernel 了。
一台 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 a
和 ip 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。
当 Docker 容器在执行的时候,可以通过 exec
命令来进入容器执行命令,那么如果一个容器已经停止了,或者想要查看一个构建好的镜像中的内容,那应该怎么办呢?exec
命令肯定是用不了的。
这个时候可以使用 docker run --rm
命令来起一个临时的容器,然后再其中执行 /bin/sh
docker run -it --rm --entrypoint sh some/image