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
记录一下使用 [[FFmpeg]] 将 YouTube 下载的 WebM 格式视频转码成 Adobe Premiere 可以处理的 MP4 格式。
[[WebM]] 是 Google 开源的一个,免版权费用视频文件格式。该格式可以提供高质量的视频压缩以在 HTML5 页面上使用。BSD 许可开源。1
WebM 采用 On2 Technologies 公司开发的 [[VP8]] 和后续的 [[VP9]] 作为视频解码器,使用 Xiph.Org 基金会开发的 Vorbis,[[Opus]] 作为音频编码器,以 [[Matroska]] 格式作为封装格式。
FFmpeg 是一系列有关多媒体,包括音频、视频,字幕等等相关元数据处理的编程库和处理工具。可以非常方便地用来对视频内容编解码,转码等等操作。FFmpeg 是一个开放源代码的项目,是一个命令行工具,如果你想要一个 GUI,可以尝试一下 [[HandBrake]]。
FFmpeg 支持非常多的编码格式,包括 VP8,VP9,H.264,Opus,Vorbis,AAC 等等。
查看一下下载的视频:
ffmpeg -i \[놀면\ 뭐하니\ 후공개\]\ WSG\ 워너비\ 블라인드\ 오디션\ 풀영상\ \[엠마스톤\ -\ 그런\ 일은\]\ \(Hangout\ with\ Yoo\ -\ WSG\ Wannabe\ YooPalBong\)\ \[n2eVz5IIu-Y\].webm
ffmpeg version 5.0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.1.6 (clang-1316.0.21.2)
configuration: --prefix=/usr/local/Cellar/ffmpeg/5.0.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
libavutil 57. 17.100 / 57. 17.100
libavcodec 59. 18.100 / 59. 18.100
libavformat 59. 16.100 / 59. 16.100
libavdevice 59. 4.100 / 59. 4.100
libavfilter 8. 24.100 / 8. 24.100
libswscale 6. 4.100 / 6. 4.100
libswresample 4. 3.100 / 4. 3.100
libpostproc 56. 3.100 / 56. 3.100
Input #0, matroska,webm, from '[놀면 뭐하니 후공개] WSG 워너비 블라인드 오디션 풀영상 [엠마스톤 - 그런 일은] (Hangout with Yoo - WSG Wannabe YooPalBong) [n2eVz5IIu-Y].webm':
Metadata:
ENCODER : Lavf58.29.100
Duration: 00:04:22.52, start: -0.007000, bitrate: 547 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 1920x1080, SAR 1:1 DAR 16:9, 29.97 fps, 29.97 tbr, 1k tbn (default)
Metadata:
DURATION : 00:04:22.495000000
Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
Metadata:
DURATION : 00:04:22.521000000
可以清楚的看到其中有两条数据,Video 使用 vp9 编码,而音频则是 opus 编码的。
使用命令转码:
ffmpeg -i origin.webm newfile.mp4
更多 ffmpeg 的选项可以参考之前的 FFmpeg 入门 。
转码过后:
❯ ffmpeg -i \[놀면\ 뭐하니\ 후공개\]\ WSG\ 워너비\ 블라인드\ 오디션\ 풀영상\ \[엠마스톤\ -\ 그런\ 일은\]\ \(Hangout\ with\ Yoo\ -\ WSG\ Wannabe\ YooPalBong\)\ \[n2eVz5IIu-Y\].mp4
ffmpeg version 5.0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with Apple clang version 13.1.6 (clang-1316.0.21.2)
configuration: --prefix=/usr/local/Cellar/ffmpeg/5.0.1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox
libavutil 57. 17.100 / 57. 17.100
libavcodec 59. 18.100 / 59. 18.100
libavformat 59. 16.100 / 59. 16.100
libavdevice 59. 4.100 / 59. 4.100
libavfilter 8. 24.100 / 8. 24.100
libswscale 6. 4.100 / 6. 4.100
libswresample 4. 3.100 / 4. 3.100
libpostproc 56. 3.100 / 56. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '[놀면 뭐하니 후공개] WSG 워너비 블라인드 오디션 풀영상 [엠마스톤 - 그런 일은] (Hangout with Yoo - WSG Wannabe YooPalBong) [n2eVz5IIu-Y].mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf59.16.100
Duration: 00:04:22.58, start: 0.000000, bitrate: 599 kb/s
Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 465 kb/s, 24 fps, 24 tbr, 12288 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 129 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
可以看到视频流已经变成 h264 编码,而音频也变成了 aac。
《邻家的百万富翁》是 [[20220515-21-天计划]] 中的第二本书,这本书在我的书单中已经存在很久了,好像是当时听某个播客中推荐的,就加到了书单,正好在这次计划中看完。这是一本讲述以统计数据,调查问卷的方式整理出来的对美国平民百万富翁的一份调查报告。最近几年因为 [[Naval Ravikant]],[[芒格]],[[孟岩]],等等人的影响已经对投资,金钱的观点所有改变,就像作者所说「有钱不是为了成为富人,而是为了拥有选择的权利。」
邻家的百万富翁作为一本畅销书确实非常易读,通过目录就能大致知道作者想要在这一章节中讲述的内容:
财富的积累固然不容易,但不是不可能。我们都想变得富有,但是变得富有的目的不应该是为了过高消费的生活。
任何想要了解财富是什么人。
你能通过创造一些有价值的东西(如产品或服务)来获得收入吗?并且你能继续持有并靠继续投资,使得这些收入不断增值吗?
投资自己的事业是那些经济成功人士的标志之一。但前提是他们要具备毅力、韧性和自制力等个性特征,能成功度过那些不可避免的低谷期。
创造力、自制力和某些社交技能(包括领导能力)比成绩和能力更重要。
书摘见:Clip
《自由软件 自由社会》是 [[20220515-21-天计划]] 阅读的第一本书,虽然早就听说过 [[Richard Stallman]],也听过其提倡的[[自由软件]],但是从来没有系统地了解过 Stallman 的思想,以及自由软件具体指代什么,而软件开发又和社会有着什么样的连接。我带着这样的疑问看完了这一本 Stallman 的著作集。
关于[[自由]],在哲学领域,政治领域,以及有无数的哲人给出了无数不同的解读,卢梭在社会契约论中说,只有服从了社会为自己所设之规定才叫做自由,康德说「自由不是想干什么就干什么,而是不想干什么就不干什么」,[[赛亚 伯林]]进而提出了[[积极自由]]和[[消极自由]],相较于政治哲学而言,软件行业发展才不过短短几十年,下面就来总结一下 Stallman 关于自由在软件领域的思考。
自由软件,free software, 这里的 free 不是免费,而是和 free speech 中的 free 同一个含义。
阅读的时候,让我最惊讶的是 Stallman 将自由软件和法律做了类比。 一个「自由的社会」是由法律来规范的,任何自由社会的法律对这些都有限制,即没有自由社会允许秘密法律。没有政府可以对其治理的对象隐藏规范,法律能够起效,只有在公平正义的情况下才可以。只有当法律条款可以被监管,或者管理的管理者(立法机构、律师)知悉和控制时,法律才是有效的。
在美国的司法实践中,我们可以看到当事人雇佣律师来提高收益,而诉讼过程中,律师撰写诉状,进而影响法官的判决意见。这过程中所有的材料都是符合 Stallman 所说的「自由」,诉讼简报是公开的,论据是透明的,论证过程也公开的,法官意见可以在之后的任何诉讼中被引用,可以被复制,可以被融合到其他案例中。整个美国的司法系统就是建立在「源代码」的设计和原则之上的。它对任何想使用它的人都是开放和自由的。
这一段类比论证突然让我醒悟过来过去几年里面为什么我一直着迷美国司法案件,正因为是公开的,所有的讨论就可以基于前人公开的「经验」,「知识」,在经过几十年,几百年的实践之后,就会有不断被修正,不断被重新认识,不断完善的司法系统。
这不仅是人类知识得以进步的原因,我想也是近[[200年来科技发展迅速的原因]],知识的交换带来了指数级的增长。
而这不也正是软件行业在短短几十年间就迅速改变了当代生活的原因吗?当代社会当然存在 Stallman 说的专有软件,但我们自己思考,服务器早已经被 GNU/Linux 占领,而手机操作系统领域,也早已被 Android 这样一个开源系统所占领。
回过来我们再来看看 Stallman 关于[[自由软件]]的具体定义,自由软件赋予了用户运行、复制、分发、学习、修改并改进的自由。进而归纳出四项基本自由:
从自由软件的四项自由,我们可以发现第二条,则是以获取源码为前提的,如果没有源代码,则后三条自由无从谈起。
相较于自由软件,可以看出来开源仅仅只能保证源码可得,相较于自由软件的约束要宽泛很多。
Stallman 也举了一些例子来举证,很多开源软件实际上并不符合自由软件:
在书中另外一个让我没有想到的是 Stallman 对于「专利」,「版权」,「商标」的思考。我们总以知识产权来统称这些概念,但实际我们能看到一些差别。
在阅读 Stallman 关于版权的讨论的时候,我时不时得想起当前正在如火如荼发生的 Web3 革命。我们要把被大公司夺取的自由抢回来。
想象一下,我们说的音乐版权真正的保护了音乐创作者了吗?是不是利益的大头都被音乐平台抽去了。在 Kindle 上发布作品的作家,是不是也受到了 Kindle 的限制。
在这些专有设备上运行的程序夺走了用户对其计算的控制权,想想一下 Amazon 可以在任何时候删掉用户设备上的《1984》,想想一下 Apple Music 可以因为某人不喜欢而下架整张专辑。数字技术可以赋予用户自由,同样也以一种温水煮青蛙的方式来剥夺了用户的自由。使用自由软件是掌握我们自己数字生活的第一步。
我的另一个疑惑便是自由软件何以和自由社会联系在一起,Stallman 用了整整一章来给我们普及大规模监控的危害。
而现实中的事实也告诉我们一旦当某人或某机构可以获取足够多的信息,就会对人们的思考方式产生深远的影响。
最后 Stallman 给出了关于「自由和权力」的区别,自由是指能够做出主要是影响自己的决定;而权力是指能够做出影响他人甚于自己的决定。
甚至引用了 William Hazlitt 的话,「对自由的爱是对他人的爱,对权力的爱是对自己的爱。」我们不要放弃我们对软件的控制权力。
因为整本书是 Stallman 历年的演讲、论文集,所以不可避免的产生了很多重复内容,在不同的文章中总是会看到一些重复的思考。但总体上我能从这本书中知道 Stallman 所主张的观点,暂不管不管这样的思想是否是对的,但过去几十年的经验告诉我,如果没有 Stallman,没有 [[Linus Torvalds]],我们的社会可能会没有当前这样的发展。
自由意味着你控制着自己的生活。如果你使用程序来打理你的生活,你的自由就取决于你如何控制着这些程序。
昨天有朋友分享给我一篇文章,关于红杉领投两轮的 Skiff,简单的看了一下,文章介绍的 Skiff 是一款基于 Web3 的在线协同文档应用。具有与 Google Docs 类似的文档编写和共享功能。
Skiff 将 E2EE (端到端加密技术)作为在线工作的核心设计原则,被用于消息传递、写作、协作和通信。Skiff 服务器只会存储加密版本的数据,而无法破译它。
文档内容可以在设置中选择存放在 Skiff 的中心服务器上,或者 [[IPFS]] 中。
今年 3 月 31 日,Skiff 完成了 1050 万美元 A 轮融资,由红杉资本领投。在去年 5 月红杉资本就参与领投了 Skiff 420 万美元种子轮,投资方还包括一群在隐私和去中心化领域拥有深厚专业知识的天使投资人:Mozilla 前首席执行官 John Lilly、[[Coinbase]] 前首席技术官 Balaji Srinivasan、TCG 加密投资者 Gaby Goldberg 和来自 Dropbox 和以太坊基金会的 Albert Ni。
用户每次登录 Skiff 时,浏览器都会生成一个密钥,该密钥用于在成功登录后解密由 Skiff 的服务器发送到您设备的帐户数据,并且都是在本地发生的。从中派生的密钥永远不会通过任何网络发送和存储在 Skiff 的服务器中。
当 A 编辑了一份文档后,会使用仅在他和 B 之间共享的对称加密密钥对其进行加密(该密钥不会与 Skiff 共享),B 接收到 A 的加密编辑后,执行验证和解密,然后将其合并到文档中。整个过程,数据不会泄露给任何中央服务器。这样便于验证和保护个人和敏感信息。
当文档出现敏感内容时,也可以通过设置密码进行保护。
在数据存储方面,Skiff 与 IPFS 集成。在 IPFS 上,数据被复制并分布在参与计算机的网络中,这些计算机协同工作以确保存储在网络上的所有数据的完整性和持久性。所以使用 IPFS 就可以永久访问用户数据,并无需依赖中央服务器。
目前为止 Skiff 可以在设置中选择将内容保存到 IPFS 还是 Skiff 自身的服务器。
2021 年 12 月上,Skiff 也开始支持 MetaMask 钱包登录,让用户使用现有的密钥对(以太坊地址)访问 Skiff 上端到端加密文档和数据。
在今年 1 月,Skiff 又可以使用以太坊域名服务(ENS)名称来简化 Skiff 上的用户名。
在体验文档编辑的时候,发现 Skiff 还退出了端到端加密的邮箱服务。
还能支持三个 @skiff.com
的别名,并且轻量使用起来问题不大,支持标签等等,就是目前搜索功能相较于成熟的 Gmail 还有一定距离。
有些时候在开源项目的时候可能需要对整个项目有一个全局的了解,比如想要了解这个项目中具体有多少行代码,那么这个时候,下面三个命令就派上用场了。
之前在 Twitter 上看到有人分享说 SQLite 的注释非常详细,甚至比代码都多,那么用下面这些工具一眼就能看到。
Tokei 是一个使用 Rust 编写的用来显示代码信息的命令行工具,Tokei 可以以编程语言为分类显示文件数,代码行数,注释行数,空行数。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Language Files Lines Code Comments Blanks
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BASH 4 49 30 10 9
JSON 1 1332 1332 0 0
Shell 1 49 38 1 10
TOML 2 77 64 4 9
───────────────────────────────────────────────────────────────────────────────
Markdown 5 1355 0 1074 281
|- JSON 1 41 41 0 0
|- Rust 2 53 42 6 5
|- Shell 1 22 18 0 4
(Total) 1471 101 1080 290
───────────────────────────────────────────────────────────────────────────────
Rust 19 3416 2840 116 460
|- Markdown 12 351 5 295 51
(Total) 3767 2845 411 511
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total 32 6745 4410 1506 829
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
在 macOS 下安装:
brew install tokei
cloc 同样是一个用来计算代码行数的命令行工具,和 Tokei 一样,可以统计代码行数,注释行数,空行。 cloc 使用 Perl 编写。
Debian/Ubuntu:
sudo apt install cloc
或者以 Docker 运行:
docker run --rm -v $PWD:/tmp aldanial/cloc
scc 是一个使用 Go 语言编写的统计代码行数的工具。
brew install scc