2019-07-26

Console-terminal-tty-shell-kernel


Console-terminal-tty-shell-kernel
1. 先看一图一表
    1.1 简表
    1.2 shell与内核的示意图
    1.3 Console-terminal-tty-shell-kernel示意图
2. console控制台有2类
3. console及terminal操作
    3.1 切换控制台
    3.2 查看有那些用户登录,分别占用了那些tty*?
    3.3 发送文字到其他控制台终端
    3.4 查看当前控制台终端
    3.5 关闭一个虚拟终端
4. shell是运行在tty之上的命令行解释器。
    4.1 查看可用shell
    4.2 查看系统默认的shell
    4.3 查找用户的默认shell
    4.4 查看当前使用的shell
5. 小节
6. Q&A
    6.1 还没看懂? 返回第一页重新看一边。
    6.2 还没看懂? 写的太简单了,请看如下更详细的解释:
    6.3 上文如有错误,还请不吝赐教,在评论区帮忙指正。

Linux世界,如何理解这几个关键字: Console, terminal, tty, shell, kernel???
console和terminal在功能上没什么区别。
tty和terminal是同义词。
shell是内核kernel的外壳。
Huh?

1. 先看图表

1.1 简表

关键字
中文
文件
描述
简单说是
console 控制台 /dev/console 物理控制台,(显示器,键盘) 硬件设备

ctrl + alt [F2,F7] 切换 支持独立登录会话的虚拟控制台 虚拟终端
terminal 终端 /dev/pts/*
/dev/tty*
文本输入/输出会话 会话session
tty TTY 特殊类型的设备文件, 伪设备
shell 外壳 /bin/bash 命令行解释器, 程序
Kernel 内核 /boot/vmlinuz* Linux操作系统内核 内核

1.2 shell与内核的示意图














User







The Shell







The Kernel







System
Hardware








































古老的单用户单任务系统,大概就这个结构。

1.3 Console-terminal-tty-shell-kernel示意图

现代的系统都是多用户,多任务,图形界面的复杂结构,就需要多个控制台,多个终端同时登录。

如上示意图,假设了4个用户同时登录,2个本机用户,2个远程用户
地点 界面 用户 console terminal > tty shell
本机 GUI User01 本机GUI tty7 (/dev/pts/0,1,2…) /bin/sh;/bin/bash…
本机 ctl User02 本机ctl tty2 (ctrl + alt [F2|F7]切换) /bin/sh
远程 ctl User03 ssh tty3 /usr//bin/fish
远程 ctl User04 ssh tty4 /usr//bin/zsh

2. console控制台有2类

console,控制台(/dev/console),有2类,
  • 物理控制台: (比如键盘,显示器);也叫物理终端
  • 虚拟控制台: 每个控制台都支持独立的登录会话

3. console及terminal操作

3.1 切换控制台

Ctrl + Alt + [F2...F7]

查看当前用户:
$ whoami
toma

3.2 查看有那些用户登录,分别占用了那些tty*?

$  who
toma     tty7         2019-07-20 20:20 (:0)
root     tty2         2019-07-25 23:22
$ w
 23:22:26 up 5 days,  3:02,  2 users,  load average: 0.48, 0.84, 1.14
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
toma     tty7      Sat20    5days  5:49m  0.01s /bin/sh /etc/xdg/xfce4/xinitrc
root     tty2      23:22   18.00s  1.46s  1.31s cmatrix

注: tty7是当前用户登录的xfce4图像界面,其他是通过(Ctrl + Alt [F2])登录的命令行界面。

3.3 发送文字到其他控制台终端

$ echo "hello" > /dev/tty2

3.4 查看当前控制台终端

Ctrl + Alt [F2] 切换到tty2,查看当前控制台终端
$ tty
/dev/tty2

Ctrl + Alt [F7] 切换到tty7,查看当前控制台终端
$ tty
/dev/pts/0

注: 这个tty不是直接在tty7的sh上运行的,是在tty7之上的图形界面之上,通过xfce4-terminal软件建立的虚拟终端会话。
多开一个xfce4-terminal软件界面,就多出一个这样的会话。
$ tty
/dev/pts/1

3.5 关闭一个虚拟终端

$ ls /dev/pts/
0  1  2  ptmx
exit退出或关掉任意一个xfce4-terminal界面,这里也会少一个文件。
至于tty2,需要切换到tty2,再exit退出。

4. shell是运行在tty之上的命令行解释器。

4.1 查看可用shell

$ chsh -l
/bin/sh
/bin/bash
/usr/bin/git-shell
/usr/bin/fish

$ cat /etc/shells
# Pathnames of valid login shells.
# See shells(5) for details.
/bin/sh
/bin/bash
/usr/bin/git-shell
/usr/bin/fish

4.2 查看系统默认的shell

$ echo $SHELL
/usr/bin/fish

通过环境变量
$ env | grep SHELL
SHELL=/usr/bin/fish

4.3 查找用户的默认shell

$ cat /etc/passwd | grep toma
toma:x:1001:985::/home/toma:/usr/bin/fish

4.4 查看当前使用的shell

$ ps
  PID TTY          TIME CMD
17333 pts/0    00:00:00 fish
28228 pts/0    00:00:00 ps

$ bash
$ ps
  PID TTY          TIME CMD
17333 pts/0    00:00:00 fish
28235 pts/0    00:00:00 bash
28241 pts/0    00:00:00 ps

// bash 可用如下方式,其他sh不一定有效。
$ ps -p $$
  PID TTY          TIME CMD
28235 pts/0    00:00:00 bash

$ echo $0
bash

5. 小节

console主要指物理终端,硬件设备键盘等;terminal提供文本输入的会话,/dev/下的体现都是字符类设备文件。
GUI下创建虚拟终端terminal会话的程序比如:/usr/bin/xfce4-terminal。
terminal = tty 是文本输入/输出的会话。
terminal 是统称概念,每个terminal都有具体的tty编号对应,且在/dev/下以字符文件形式存在。
shell是运行在tty之上的程序,打开终端自动运行的程序,内核的外壳,用户的命令提示符。比如bash,zsh,fish等。
shell通过控制tty与用户交互,并向用户提供启动其他程序的方式。

6. Q&A

6.1 还没看懂? 返回第一页重新看一边。

6.2 还没看懂? 写的太简单了,请看如下更详细的解释:

What is the exact difference between a 'terminal', a 'shell', a 'tty' and a 'console'?
https://unix.stackexchange.com/questions/4126/what-is-the-exact-difference-between-a-terminal-a-shell-a-tty-and-a-con

https://www.zhihu.com/question/21711307

The TTY demystified 解密TTY
http://www.linusakesson.net/programming/tty/
中文翻译:https://www.cnblogs.com/liqiuhao/p/9031803.html

还有疑问?console, terminal, tty的概念模糊不清,其实问题不大,这有历史的原因。
普通用户只要知道命令在终端里输入,其实是终端的shell里输入。打开终端就会运行默认的shell。会用基本的shell命令即可。

6.3 上文如有错误,还请不吝赐教,在评论区帮忙指正。


2019-07-25

Google-Trends

Linux distributions
OS Trends
Program-Language
Windows VS Android
Linux VS macOS
BSD


Linux distributions



OS Trends



Program-Language



Windows VS Android



Linux VS macOS



BSD



2019-07-23

Unix-Time


1. Unix_time
2. Year_2000_problem
3. Year_10,000_problem
4. Year_2038_problem
5. Time_formatting_and_storage_bugs
6. 更多有关时间的wiki

1. Unix_time

https://en.wikipedia.org/wiki/Unix_time
Unix时间(也称为POSIX时间或UNIX纪元时间)是用于描述时间点的系统。
记录自1970年1月1日起已经过多少秒 00:00:00 的协调世界时(UTC),减去闰秒。
每天被视为完全包含86 400秒,所以从纪元开始减去闰秒。它广泛用于类Unix和许多其他操作系统和文件格式。
但是,Unix时间并不是UTC的真实表示,因为UTC中的闰秒与之前的第二个时间具有相同的Unix时间。
通过date +%s在命令行上键入,可以在大多数Unix系统上检查Unix时间。

$ date
Tue 23 Jul 2019 08:23:03 AM CST
$ date +%s
1563841385

实际记录的就是这个秒数,自1970年1月1日起已经过了1563841385秒,除以每天86400秒得18100天。再除以每年365天得49.6年。
公元2019年是Unix纪元49年。现在是Unix纪元1563841385秒。

2. Year_2000_problem

https://en.wikipedia.org/wiki/Year_2000_problem
Year_2000_problem,也被称为Y2K问题,千年虫问题等,是一类计算机日历格式及日历数据存储设计的漏洞。
因为许多程序使用最后2位数代表四位数年份(使用89代表1989年)这在当时不会有问题。但超过2000年后,89年是1989还是2089呢?

1997年,英国标准协会(BSI)制定了标准 DISC PD2000-1,将“2000年符合性要求”定义为四条规则:
  1. 无效日期将导致运营中断;
  2. 无论日期是否在不同的世纪,计算日期之间的持续时间或日期顺序都是正确的;
  3. 在所有接口和所有存储中,世纪必须是明确的,既可以指定,也可以通过算法计算 ;
  4. 2000年必须确认为闰年。
它确定了许多计算机程序中可能存在的两个问题。
  • 首先,用两位数表示年份的做法在从xx99到xx00的“翻转”时产生的逻辑错误成为问题。
  • 其次,一些程序员误解了公历规则,该规则决定了可以被100整除的年份是不是闰年,并假设2000年不是闰年。实际上,格里高利历法系统中有一条规则,规定可被400整除的年份是闰年 - 从而使2000年成为闰年。
全球的公司和组织检查,修复和升级其计算机系统以解决预期的问题。因此,当时钟延续到2000年时,报告的计算机故障很少。

3. Year_10,000_problem

https://en.wikipedia.org/wiki/Year_10,000_problem
10 ,000年的问题(也称为Y10K问题或万年虫)是所有潜在的时间格式和存储错误的类,当需要表达五位数的年份时会出现。这个问题今天可以产生明显的影响,但有时也会像RFC 2550那样提到幽默效果。

4. Year_2038_problem

https://en.wikipedia.org/wiki/Year_2038_problem
在Unix时间存储为带符号的32位二进制整数的系统上,可以记录的最大值是 2 147 483 647(2 31 - 1),即2038年1月19日 03:14:07 UTC。随后的第二秒,时钟将环绕至负面2 147 483 648(-2 31),即1901年12月13日星期五20:45:52 UTC。这被称为2038年问题。
2038年问题是由所选存储单元的容量不足引起的。
https://en.wikipedia.org/wiki/File:Year_2038_problem.gif
https://upload.wikimedia.org/wikipedia/commons/e/e9/Year_2038_problem.gif
动画显示日期将如何重置,表示为带符号的32位整数(在2038年1月19日03:14:08 UTC)。

5. Time_formatting_and_storage_bugs

https://en.wikipedia.org/wiki/Time_formatting_and_storage_bugs
时间格式和存储错误
1975年 12位字段溢出
1989年 16位溢出(1900年1月1日开始)
2000年 yymmdd > yyyymmdd
2036年 ntp时间翻转
2079年 16位第二次溢出(第32,768天和第65,536天)
...

6. 更多有关时间的wiki

https://en.wikipedia.org/wiki/Holocene_calendar
全新世日历, 公元2019年,全新世日历为12019 HE。

https://en.wikipedia.org/wiki/Network_Time_Protocol#Timestamps

https://en.wikipedia.org/wiki/List_of_calendars
https://en.wikipedia.org/wiki/Perpetual_calendar

https://en.wikipedia.org/wiki/Timeline_of_the_far_future
遥远未来的时间表

图形时间表
有关这些事件的图形,对数时间轴,请参阅:
宇宙的图形时间表(从现在开始到80亿年) https://en.wikipedia.org/wiki/Graphical_timeline_of_the_universe
Stelliferous时代的图形时间表(从现在起10年20年)
从大爆炸到热死的图形时间线(从现在起10 1000年)

https://en.wikipedia.org/wiki/Cosmic_Calendar
宇宙日历, 比例尺: 一秒对应438年; 一分钟大约是26,000年; 一小时是160万年; 一天是3800万年。

https://en.wikipedia.org/wiki/Timelines_of_modern_history
https://en.wikipedia.org/wiki/Timeline_of_human_prehistory
https://en.wikipedia.org/wiki/Timeline_of_historic_inventions
https://en.wikipedia.org/wiki/Timeline_of_ancient_history
https://en.wikipedia.org/wiki/Timeline_of_the_evolutionary_history_of_life
https://en.wikipedia.org/wiki/Timeline_of_the_Middle_Ages
https://en.wikipedia.org/wiki/Timeline_of_the_near_future
https://en.wikipedia.org/wiki/Timeline_of_natural_history
https://en.wikipedia.org/wiki/Timeline_of_epochs_in_cosmology
https://en.wikipedia.org/wiki/Template:Life_timeline
https://en.wikipedia.org/wiki/Template:Human_timeline

https://en.wikipedia.org/wiki/Detailed_logarithmic_timeline
详细的对数时间线

https://en.wikipedia.org/wiki/Ultimate_fate_of_the_universe
https://en.wikipedia.org/wiki/Chronology_of_the_universe
https://en.wikipedia.org/wiki/Age_of_the_universe
https://en.wikipedia.org/wiki/Graphical_timeline_of_the_Big_Bang
https://en.wikipedia.org/wiki/Graphical_timeline_of_the_Stelliferous_Era
https://en.wikipedia.org/wiki/Graphical_timeline_from_Big_Bang_to_Heat_Death
https://en.wikipedia.org/wiki/Future_of_Earth
https://en.wikipedia.org/wiki/Deep_Impact_(spacecraft)#Contact_lost_and_end_of_mission

https://en.wikipedia.org/wiki/Extreme_risk
https://en.wikipedia.org/wiki/Extinction_event
五个主要灭绝事件:[11]
奥陶纪的结束:4.4亿年前,所有物种中有86%的物种丢失,包括陨石
晚泥盆世:3.75亿年前,75%的物种损失,包括大多数三叶虫
二叠纪末,“大死”:2.5亿年前,96%的物种失去了,包括制表珊瑚,以及大多数现存的树木和突触
三叠纪结束:2亿年前,80%的物种丢失,包括所有的牙形刺
在结束白垩纪 66万年前,种的76%丢失,包括所有的菊石,沧龙,鱼龙,蛇颈龙,翼龙和nonavian 恐龙

https://en.wikipedia.org/wiki/The_Sixth_Extinction:_An_Unnatural_History
第六次灭绝:一种不自然的历史

https://en.wikipedia.org/wiki/Human_extinction
https://en.wikipedia.org/wiki/Holocene_extinction

https://en.wikipedia.org/wiki/Timeline_of_extinctions_in_the_Holocene

https://en.wikipedia.org/wiki/Index_of_environmental_articles
环境主题列表

https://en.wikipedia.org/wiki/List_of_environmental_issues
环境问题清单

https://en.wikipedia.org/wiki/Effective_population_size
https://en.wikipedia.org/wiki/Minimum_viable_population
https://en.wikipedia.org/wiki/World_population

https://en.wikipedia.org/wiki/Timeline_of_human_evolution

https://en.wikipedia.org/wiki/Fermi_paradox
费米悖论
动物园假说: https://en.wikipedia.org/wiki/Zoo_hypothesis
黑暗森林: https://en.wikipedia.org/wiki/The_Dark_Forest

https://en.wikipedia.org/wiki/World_Scientists%27_Warning_to_Humanity
世界科学家对人类的警告
http://www.scientistswarning.org/
https://m.phys.org/news/2019-04-commentary-famous-humanity-paper-global.html

https://en.wikipedia.org/wiki/Epoch_(computing)
纪元(计算)

https://en.wikipedia.org/wiki/List_of_global_issues
https://en.wikipedia.org/wiki/Global_issue
全球问题
世界人口过剩
过度消费
全球变暖

https://en.wikipedia.org/wiki/Global_catastrophic_risk
全球灾难性风险
风险 估计2100年前人类灭绝的可能性
整体概率 19%
分子纳米技术武器 5%
超级智能AI 5%
所有战争(包括内战) 4%
工程大流行 2%
核战争 1%
纳米技术事故 0.5%
自然大流行 0.05%
核恐怖主义 0.03%

https://en.wikipedia.org/wiki/Global_Risks_Report
http://reports.weforum.org/global-risks-2019/?doing_wp_cron=1563279790.2732028961181640625000
http://www3.weforum.org/docs/WEF_Global_Risks_Report_2019.pdf

https://en.wikipedia.org/wiki/Apocalyptic_and_post-apocalyptic_fiction
世界末日和后世界末日的小说
https://en.wikipedia.org/wiki/List_of_apocalyptic_films
https://en.wikipedia.org/wiki/List_of_dystopian_films
https://en.wikipedia.org/wiki/List_of_apocalyptic_and_post-apocalyptic_fiction
https://en.wikipedia.org/wiki/Degeneration_theory

https://en.wikipedia.org/wiki/Doomsday_Clock
世界末日时钟图,1947-2018。图表中的较低点表示技术或环境诱发的灾难的概率较高,较高的点表示概率较低。

https://en.wikipedia.org/wiki/Linux_adoption
https://en.wikipedia.org/wiki/List_of_Linux_adopters

https://en.wikipedia.org/wiki/Timeline_of_operating_systems
操作系统的时间表

2019-07-22

Linux-init


1. init简介
2. init简史
3. init现状
    3.1 OpenRC
    3.2 Systemd
    3.3 使用命令对比
    3.4 systemd 备受争议,仍然一同天下?
4. 主流Linux发行版使用的init列表
5. init对比
6. 值得期待更好的init替代品

1. init简介

https://en.wikipedia.org/wiki/Init
在基于Unix的计算机操作系统中,init(初始化的简称)是在启动计算机系统期间启动的第一个进程。
Init是一个守护进程,它将持续运行,直到系统关闭。
它是所有其他进程的直接或间接祖先,并自动采用所有孤立进程(adopts)。
Init 在启动过程中由内核启动 ; 如果内核无法启动它,将发生内核恐慌
通常为Init分配进程标识符 1。

2. init简史

就GNU/Linux而言,最常见的首先是sysvinit。
然后Apple创建了launchd,这启发了Ubuntu制作Upstart
大约2007年,Gentoo开始使用OpenRC
接着在2010年systemd改变了一切。到2015年,基本一统天下,大部分Linux发行版都采用Systemd作为默认init。
更完整的历史请看: https://blog.darknedgy.net/technology/2015/09/05/0/
现代初始系统的历史(1992-2015)

3. init现状

  • 大部分主流Linux发行版采用systemd
  • Gentoo支持多种内核的特性,需要使用OpenRC(因为可移植性?),但在使用Linux内核时可安装为Systemd;
  • Apple的mac OS使用lanuchd。https://en.wikipedia.org/wiki/Launchd
还有极少数Linux发行版仍在使用SysV作为默认init;以及一些非广泛场景的其他init。
https://en.wikipedia.org/wiki/Operating_system_service_management
  • Service Control Manager - 由Microsoft Windows使用
  • Android init - 由谷歌Android使用
  • Service Management Facility - 由illumos发行版和Oracle Solaris使用
  • sysvinit - 由较旧的类Unix操作系统使用
  • rc.d or rcorder-based init - 由BSD操作系统使用
  • cygserver - 由Cygwin使用
  • runit - 由Void使用
  • The GNU Shepherd - 由Guix系统分发GuixSD和GNU Hurd使用,但设计用于Guile可用的每个类似POSIX的系统
关于古老的Slackware发行版使用的init?
wiki百科的对比列表里Slackware使用BSD init scripts作为init
distrowatch的Slackware页面,使用SysV作为init
https://distrowatch.com/table.php?distribution=slackware

Slackware可以使用OpenRC
http://docs.slackware.com/howtos:general_admin:openrc?s[]=init
OpenRC提供了许多功能,如硬件启动的initscript运行和cgroups支持,无需进行大的布局更改。
有两个Slackbuild可用,openrc包含OpenRC init系统,openrc-services包含用于OpenRC的各种服务。

3.1 OpenRC

https://en.wikipedia.org/wiki/OpenRC
https://github.com/OpenRC/openrc
http://wiki.gentoo.org/wiki/OpenRC
与Linux一样,OpenRC也可用于多个BSD系统。它是由一个NetBSD开发人员创建的,他开始了Gentoo/FreeBSD项目。
OpenRC提供以下功能:
  • 可在Linux,TrueOS,FreeBSD和NetBSD之间移植
  • 并行服务启动(可选,正在开发中)
  • 基于依赖关系的启动
  • 通过cgroup进行流程隔离
  • 每服务资源限制(ulimit)
  • 代码和配置的分离(init.d / conf.d)
  • 用户可自定义的易于扩展的启动脚本
  • 除了基本的“开始,停止和状态”之外,能够包含无限多种命令
  • 有状态的init脚本(它已经启动了吗?)
  • 用于启动多个组件的复杂init脚本(Samba(smbd和nmbd),NFS(nfsd,portmap等))
  • 自动依赖计算和服务排序
  • 正确集成到容器/虚拟化(Linux-VServer,OpenVZ等
  • 适当的模块化架构和可选组件的分离(Cron,syslog)
  • 富有表现力和灵活的网络处理(包括VPN,网桥等)
  • 支持裸机裸依赖服务器
  • 详细的调试模式
项目主页: https://wiki.gentoo.org/wiki/Project:OpenRC
OpenRC是一个基于依赖的init系统,基于依赖的rc(运行命令)系统,它与系统提供的init程序一起工作,通常位于/sbin/init。
它不是/sbin/init的替代品。
Gentoo Linux使用的默认init系统是sys-apps/sysvinit,而Gentoo/FreeBSD使用sys-freebsd/freebsd-sbin提供的FreeBSD init 。
OpenRC与Gentoo init脚本100%兼容,这意味着您可以在主Gentoo存储库中找到几个守护进程。
但是,OpenRC并非由Gentoo Linux专门使用,因此我们的目标是与平台无关。

https://wiki.gentoo.org/wiki/Init_system
https://wiki.gentoo.org/wiki/OpenRC

3.2 Systemd

https://en.wikipedia.org/wiki/Systemd
该systemd 软件套件提供了一个基本的构建模块的Linux 操作系统。
systemd包括“System and Service Manager”,用于引导用户空间和管理用户进程的init系统。
systemd旨在统一Linux发行版中的服务配置和行为。它取代了UNIX System V和BSD init系统。
自2015年以来,大多数Linux发行版都采用了systemd,并且它被认为是事实上的标准。

3.3 使用命令对比

OpenRC中常用的命令列表及其等效的systemd命令。
https://wiki.gentoo.org/wiki/OpenRC_to_systemd_Cheatsheet
https://wiki.archlinux.org/index.php/OpenRC#Usage
描述 SysVinit systemd OpenRC
开始服务 rc.d start daemon systemctl start <service> /etc/init.d/<service> start
rc-service <service> start
停止服务 rc.d stop daemon systemctl stop <service> /etc/init.d/<service> stop
rc-service <service> stop
重启服务 rc.d restart daemon systemctl restart <service> /etc/init.d/<service> restart
rc-service <service> restart
获得服务状态 rc.d (start, stop, restart) daemon systemctl status <service> /etc/init.d/<service> status
rc-service <service> status
显示已知的启动脚本
列出运行服务状态
rc.d list systemctl list-units rc-status
rc-update show
启动时启用服务 chkconfig daemon on systemctl enable <service> rc-update add <service> <runlevel>
启动时禁用服务 chkconfig daemon off systemctl disable <service> rc-update del <service> <runlevel>
显示所有启动脚本
systemctl list-unit-files --type=service ls /etc/init.d/
rc-update -v show
检查服务失败
systemctl --failed rc-status --crashed
显示所有可用服务。
systemctl --all rc-update -v show
创建或修改配置。 chkconfig daemon --add systemctl daemon-reload
禁用自动生成的服务
systemctl mask <service>
杀死与服务相关的所有流程
systemctl kill <service>
显示记录今天发生的事件,
首先记录最近的事件

journalctl -r --since=today
显示特定服务的日志事件
journalctl _SYSTEMD_UNIT=<service>.service

3.4 systemd 备受争议,仍然一同天下?

批评者认为systemd过于复杂,并且持续存在功能蔓延,认为其架构违反了Unix哲学。
还有人担心它会形成一个互锁的依赖系统,从而使分发维护者别无选择,只能采用systemd,因为更多的用户空间软件依赖于它的组件。

https://www.zhihu.com/question/25873473
systemd 为什么会有那么大的争议?
https://www.solidot.org/story?sid=41361
systemd作者抨击开源和Linux社区
https://www.solidot.org/story?sid=41219
抗议者创建Systemd分支Uselessd
Systemd因其复杂性而饱受Unix哲学(做一件事并做好)拥护者的鞭笞,批评者为此发起了抵制Systemd的运动,呼吁抵制使用Systemd的Linux发行版。

抗议者更进一步的创建了Systemd分支Uselessd,以求简化Systemd的功能。
开发者表示,Uselessd不仅仅是一种政治抗议,他们的目标是创造出Systemd的可靠替代。
Uselessd是基于systemd 208 ,剥离被认为与初始化系统无关的功能如systemd journal和udev。
Systemd只支持Linux,而Uselessd将能移植到BSD。
但这仅仅是曾经的想法,该项目已与几年前暂停至今...

Systemd虽然饱受争议,但其方便使用,快速的优点让他在几年内被大部分发行版接受。

4. 主流Linux发行版使用的init列表

排名 Distribution Default
Init system
systemd
加入仓库日期
systemd
作为默认init日期
Runs
Without?
1 MX Linux SysV


2 Manjaro systemd 2013-11 2013-11
3 Mint systemd 2013-11 2013-11 Yes
5 Ubuntu systemd 2013-04 2015-04
6 Debian systemd 2012-04 2015-04 Yes
7 Solus systemd 2016-10 2016-10 No
8 Fedora systemd 2010-11 2011-05 No
9 openSUSE systemd 2011-03 2012-09 No
15 CentOS systemd 2014-04 2014-04 No
16 Arch Linux systemd 2012-01 2012-10 Yes
21 Kali Linux systemd 2007-03 2015-08
40 Red Hat Enterprise Linux systemd 2014-06 2014-06 No
43 Gentoo Linux[b] openrc 2011-07
Yes
59 GhostBSD openrc


26 FreeBSD RC


60 DragonFly RC


31 Slackware BSD init scripts
N/A Yes

5. init对比

https://wiki.gentoo.org/wiki/Comparison_of_init_systems
特征 sysvinit OpenRC systemd launchd runit BSD rc.d SMF
Gentoo支持 partially (used by OpenRC)  Yes (default init)  Yes  No  Yes  No  No
包装 sys-apps/sysvinit sys-apps/openrc sys-apps/systemd - sys-process/runit - -
支持的平台 Linux / BSD Linux + BSD Linux MacOSX Linux / BSD / MacOSX BSD Solaris
主要编码语言 C POSIX shell (+ C) C C C POSIX shell (+ C) C
主要依赖 - init (sysv or BSD) D-Bus - - rcorder init(sysv?)
初始化脚本
/服务格式
single config file shell scripts config files (ini) plist shell scripts shell scripts XML (+ shell scripts)
每服务配置  No  Yes (conf.d)  Yes  ?  No  No  Yes (service instances)
作为守护
进程运行
 Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (PID 1)  Yes (invoked)
跨服务
依赖/事件
 No  Yes  Yes  No  Yes  Yes  Yes
并行服务启动  Yes  Yes (optional)  Yes  Yes  Yes  Yes  Yes
让守护进程
保持活力
 Yes  Yes (optional v0.21+ via supervise-daemon)  Yes  Yes  Yes  Yes  Yes
首选服务
供应商
n/a Gentoo upstream MacOSX Void Linux NetBSD, FreeBSD, OpenBSD Solaris
执照 GPL v2+ 2-cl. BSD LGPL v2.1+ Apache License 2.0 BSD BSD ?

支持的服务(在Gentoo中)
特征 systemd OpenRC
文件系统加载 每个mountpoint两个单元 (fsck+mount),运行时生成依赖项 每组一个脚本 (root, local, network, swap...).
getty (终端提示) 每个控制台一个单元, 从模板按需实例化。 通过 /etc/inittab 或agetty脚本启动
网络设置 外部(NetworkManager, networkd, DHCP守护程序) 几个选项, 如dhcpcd  netifrc 或NetworkManager
X11显示管理器设置 单独的DM单位。 为所有人提供单一服务(需要自动重启)

6. 值得期待更好的init替代品

https://www.funtoo.org/FAQ:Do_You_Support_Systemd
常见问题:你支持Systemd吗? 本页面最后编辑于2018年11月20日 (星期二) 21:00。
Funtoo Linux的部分独特之处在于它的基于依赖性的OpenRC init系统,所以改变它会使它成为Funtoo Linux以外的东西。
所以我们不支持systemd作为Funtoo Linux的一部分。
感谢Dantrell B.和其他人的工作,我们完全支持在不依赖systemd的情况下运行GNOME 3.26。
我们正计划开发一种新的OpenRC风格的初始化系统,其中包含“下一代”功能,这些功能在功能上可与systemd相媲美。

https://www.funtoo.org/FLOP:No-systemd_system
systemd如何潜入Funtoo,以及删除它的可能解决方案。

https://www.funtoo.org/Mitigating_Systemd
Funtoo目前没有计划迁移或采用systemd作为它的默认init系统。这并不能阻止你使用systemd您的系统上。
例如,CoreOS是基于Gentoo的基于系统的系统。

Unix-History


OS-History

1. 主流操作系统使用份额
2. Unix_history-simple.svg
    2.1 bsdt_v17.01.svg
    2.2 Linux_Distribution_Timeline.svg
3. unix.pdf 打印版
4. windows.pdf
5. 其他历史时间线

1. 主流操作系统使用份额

https://zh.wikipedia.org/zh/操作系统使用份额
https://en.wikipedia.org/wiki/Usage_share_of_operating_systems

类别 数据来源 统计日期 Linux Unix和类Unix
(不包括Linux)
Windows 其他
桌面,笔记本电脑 Net Applications 2018年9月 3% 9.52%(macOS) 87.56% 0.37%
智能手机,平板电 StatCounter 2018年9月 73.19%(Android) 24.26%(iOS)
0.36%
2.19%
服务器(网络) W3Techs 2017年4月 66.6% 1% 33.5%
超级计算机 TOP500 2017年11月 100%


  • Apple: 
    • macOS, 遇到了Windows, 只有不到10%的用户; 
    • iOS, 遇到了Android, 截止2018年9月用户数不到25%.
  • Linux: 服务器(网络)领域,Linux主要发行版本比例: 
    • Ubuntu 35.8%
    • Debian 31.9%
    • CentOS 21%
    • Red Hat(RHEL) 3%
    • Gentoo 2.7%
  • Google: Android操作系统使用的是Linux内核

2. Unix_history-simple.svg

https://en.wikipedia.org/wiki/File:Unix_history-simple.svg
1969-2017
  • Open sourec
    • BSD
    • Linux, Android (Google)
  • Mixed/Shared source
    • Darwin; macOS, iOS (Apple)
  • Closed source
    • SunOS; Solaris (Oracle\Sun)
    • AIX (IBM)
    • HP-UX (HP)

2.1 bsdt_v17.01.svg

(1978-2016) Version 17.01
https://github.com/FabioLolix/BSD-TimeLine

2.2 Linux_Distribution_Timeline.svg

(1992-2019)
https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg
GNU/Linux Distributions Timeline Version 19.04
https://github.com/FabioLolix/linuxtimeline

3. unix.pdf 打印版

https://www.levenez.com/unix/unix.pdf (长长的一页,放大了看)
Open Systems(1969-2019)
https://www.levenez.com/unix/unix_a4.pdf (打印版,可以打印为35页A4纸张)
这是unix历史的简化图。有许多衍生系统未在此图表中列出,可能是10倍以上!在最近的过去,许多电子公司都有自己的unix版本。
这张图只是冰山一角...

如果您已将此图放在办公室的墙上并拍下了照片,请将副本发给作者,会将其放在此页面上。;-)
https://www.levenez.com/wall/

4. windows.pdf

(1980-2017)
https://www.levenez.com/windows/windows.pdf
Closed Systems
December 21, 2017

5. 其他历史时间线

BSD tree字符版本
https://svnweb.freebsd.org/base/head/share/misc/bsd-family-tree?view=co
https://svnweb.freebsd.org/base/head/share/misc/bsd-family-tree?view=markup
The UNIX system family tree: Research and BSD
树上只有版本号,和发展方向,没有时间。下方有部分版本时间列表。


https://minnie.tuhs.org/cgi-bin/utree.pl
欢迎来到Unix Tree。在这里,您可以浏览各种旧版Unix的源代码和手册。对于每个文件,您还可以从其他版本中找到相关文件:这可以帮助显示不同版本的Unix是如何相关的。下面的大多数Unix版本都来自 Unix Archive。
https://wiki.tuhs.org/doku.php?id=source:unix_archive

http://www.unix.org/what_is_unix/history_timeline.html
(1969-2010)list...

unix_posterA3_Screen.pdf
1969-2003
http://www.unix.org/Posters/download/unix_posterA3.pdf
http://www.unix.org/Posters/download/unix_posterA3_Screen.pdf

unix_timeline.png
http://www.reistlin.com/blog/10
http://www.reistlin.com/usr/upknows/unix_timeline.png
1969-2003
  • UNIX classic UNIX & Unixware UNIX System 5
  • BSD Classic BSD TO 4.4BSD
  • UNIX System 5 (HP-UX; IBM AIX)
  • UNIX BSD and System 5 (SGI IRIX; SOLARIS)
  • MACH
  • BSD NEXTSTEP (MAC OS)
  • UNIX OSF/1 (OSF/1, DIGITAL, TRU64, )
  • BSD 4.4BSD (NETBSD; OPENBSD; FREEBSD; MAC OS)
  • GNU GNU/LINUX (Linux...)




2019-07-21

Program-Language


1. 主流编程语言
2. 编程语言分类
    2.1 编译or解释
    2.2 按照客观系统的描述可分为两类
    2.3 按照编程范型可分为
3. 语言范式 Paradigm
4. 计算机语言历史
5. 编程语言排名
6. 编程语言影响关系
7. 更多信息:

1. 主流编程语言

Language 2019 Top Languages Influenced Influenced by
Java 1 2015 39 17
C 2 2017 54 10
Python 3 2018 30 9
C++ 4 2003 36 6
Lisp 32
60 1
C# 6
17 8
JavaScript 7 2014 12 7
PHP 8 2004 2 8
SQL 9 2013 7 1
Objective-C 10 2012 11 2
Ruby 12 2006 17 10
Perl 17
19 10
go 18 2016
7
列描述:
  • 2019: 截止2019年7月排名
  • Top: 登录过首位的年份
  • Languages Influenced: 影响多少个编程语言
  • Influenced by: 被多少个编程语言影响

2. 编程语言分类

  • 机器语言 (二进制代码)
  • 汇编语言 (面向机器的程序设计语言)
  • 高级语言 (...)

2.1 编译or解释

  • 解释性语言:Java、JavaScript、Perl、Python、Ruby、MATLAB 等。
  • 编译性语言: C/C++、Pascal/Object Pascal(Delphi)
  • 脚本语言(一种解释性语言):Python、JavaScript,ASP,PHP,Perl等

2.2 按照客观系统的描述可分为两类

  • 面向过程语言(C);
  • 面向对象语言(C++, Objective-C)

2.3 按照编程范型可分为

  • 命令式语言;  (Fortran、ALGOL、COBOL、C、Ada、Pascal)
  • 函数式语言;  (Lisp、Haskell、ML、Scheme 、F#)
  • 逻辑式语言;  (Prolog)
  • 纯面向对象语言  (Smalltalk)

3. 语言范式 Paradigm

sn 语言范式 Paradigm 比如: 描述 count
1 面向对象的编程
Object-oriented
Lisp, Java, Python, C++, Ruby, Perl, Smalltalk 使用由数据字段和方法组成的数据结构及其交互(对象)来设计程序 188
2 功能编程 Functional Lisp,Python, C++, Ruby, JavaScript, C# 使用数学函数的评估并避免状态和可变数据 130
3 命令式编程 Imperative C, Java, Python, JavaScript, Pascal, Ruby, Perl 改变程序状态的显式语句 118
4 逻辑编程 Logic Prolog 使用显式数学逻辑进行编程 20
5 声明性编程 Declarative Haskell 描述应该执行的计算,而不指定详细的状态变化c.f.命令式编程(功能和逻辑编程是声明性编程的主要子组) 15
6 通用编程 Generic Java, C++, Perl, C# 使用根据待指定的后续类型编写的算法,然后根据需要对作为参数提供的特定类型进行实例化 10
7 反思性编程 Reflective Ruby, JavaScript 元编程方法,其中程序修改或扩展自身 5
8 数据流编程 Dataflow SISAL 数据值发生变化时强制重新计算公式(例如电子表格) 3
9 管道编程 Pipeline
一个简单的语法更改,用于添加语法以将函数调用嵌套到最初使用none设计的语言 2
10 分布式编程 Distributed
支持通过计算机网络进行通信的多台自治计算机 1
11 多范式编程语言 Python, C++, Perl, Ruby, C# Multi-paradigm programming language 94
12 程序编程 Lisp, C, Python, C++, Perl Procedural programming 89
13 结构化编程 C, Java, Pascal, Ruby Structured programming 65
14 并发计算 C# Concurrent computing 26
15 基于原型的编程 JavaScript Prototype-based programming 24
16 面向堆栈的编程语言 Forth Stack-oriented programming language 17
17 并行计算 ALGOL 68 Parallel computing 16
18 数组编程 APL Array programming 13
19 知识表示语言 KPL Knowledge Representation Language 9
20 连接编程语言 Forth Concatenative programming language 9
21 口译语言 Lisp, Python, Ruby Interpreted language 8
22 动态编程语言 Perl, Ruby Dynamic programming language 7
23 数据库编程 SQL Database programming 7
24 教育编程语言 Logo Educational programming language 6
25 数学 Lisp, Haskell, APL Mathematics 4
26 懒惰的评价 Haskell Lazy evaluation 4
27 编译语言 Haskell Compiled language 4
28 强打字 Haskell, Java Strong typing 3
29 可视化编程语言
Visual programming language 3
30 按合同设计 Eiffel Design by contract 3
31 模块化编程 Modula, Mesa Modular programming 3
32 类型推断 Haskell, ML Type inference 3
33 功能级编程 FP Function-level programming 3
34 标记语言 Curl Markup language 2
35 依赖类型
Dependent type 2
36 演员模特
Actor model 2
37 框架语言
Frame language 2
38 自修改代码
Self-modifying code 2
39 事件驱动的编程
Event-driven programming 2
40 组合逻辑
Combinatory logic 2
41 细胞为主
Cell-based 2
42 虚拟机
Virtual machine 1
43 一次编写, 随处运行
Write once, run anywhere 1
44 多代理系统
Multi-agent system 1
45 基于表达式
Expression-based 1
46 基于知识的系统
Knowledge-based systems 1
47 面向组件的编程
Component oriented programming 1
48 封装
Encapsulation 1
49 阿贾克斯
Ajax 1
50 操作者
Operator 1
51 示例中心编程
Example Centric Programming 1
52 二维
Two dimensional 1
 注: [count]列内的数字,表示该范式包含多少种编程语言,数据来源: https://exploring-data.com/vis/programming-languages-influence-network/

4. 计算机语言历史

lang.pdf (1954-2018)
https://www.levenez.com/lang/lang.pdf

5. 编程语言排名

https://www.tiobe.com/tiobe-index/

6. 编程语言影响关系

https://exploring-data.com/vis/programming-languages-influence-network/
编程语言影响关系图↑及相关说明↓
https://exploring-data.com/info/programming-languages-influence-network/

7. 更多信息:

https://en.wikipedia.org/wiki/Programming_paradigm
编程范式是一种根据编程语言的特性对编程语言进行分类的方法。语言可以分为多种范例。
https://upload.wikimedia.org/wikipedia/commons/f/f7/Programming_paradigms.svg
根据Peter Van Roy的各种编程范例概述(svg图)

多范式编程语言的比较
https://en.wikipedia.org/wiki/Comparison_of_multi-paradigm_programming_languages

https://en.wikipedia.org/wiki/Comparison_of_programming_languages

https://en.wikipedia.org/wiki/Categorical_list_of_programming_languages
编程语言的分类列表



2019-07-19

Linux-10Year


主流Linux发行版近10年排行曲线
10个主流的发行版概述(distrowatch挑选)
搜索特定的发行
选择建议
    初级用户选择:开箱即用
    中级用户组装:适合你自己的系统
    高级用户搭建:适合你自己,且适配你电脑的系统
    顶级用户使用:LFS 构筑自己的Linux系统
Arch VS Gentoo
    Arch 和 Gentoo的共同点
    部分差异表格
    Gentoo的自定义更胜一筹

主流Linux发行版近10年排行曲线

数据来源: https://distrowatch.com/


10个主流的发行版概述(distrowatch挑选)

详见: https://distrowatch.com/dwres.php?resource=major
distrowatch网站挑选的10个主流版本,有概述及优缺点。
  • 初级用户:Ubuntu,Linux Mint和MX Linux对于希望尽快在Linux中获得高效而不必掌握其所有复杂性的新用户而言,这被认为是最简单的。
  • 中间用户:openSUSE,Fedora,Debian GNU / Linux可以归类为良好的“中间道路”分布,通常用作其他发行版的基础。
  • 企业用户:CentOS是一种企业分布,适合那些喜欢稳定性,可靠性和长期支持而不是尖端功能和软件的人。
  • 高级用户:Arch Linux,Gentoo和Slackware Linux是更高级的发行版,需要大量学习才能有效使用。

搜索特定的发行

https://distrowatch.com/search.php
https://www.cnblogs.com/sztom/p/11040147.html

选择建议

初级用户选择:开箱即用

Linux (内核版本, 201907)
  • 超前的 Manjaro(5.2.1)
  • 稳定的 Ubuntu (5.0)
  • Fedora 实验室 (5.0.9)
普通用户(初级用户)可从以上三选一,都是开箱即用的,但包管理器不同,所以很多命令有差异。不过只要适应了其中任何一种,就可参照包管理器命令对照表学习使用其他版本。

中级用户组装:适合你自己的系统

中级用户可以选择 激进的Arch,滚动发布,几乎每天都有更新。
官方有提醒,由于版本更新比较激进,可能会有意向不到的状况。实际使用了半年,从内核到各种软件都是最新的,暂未遇到异常。
Arch(当前内核是最新的5.2.1)。Arch 有优秀的wiki文档参考,普通用户可在这里学习进阶。
Arch的安装就是从最小安装开始,一点一点安装你需要的软件包,就像搭积木。所以安装完成就是适合你自己的系统。

高级用户搭建:适合你自己,且适配你电脑的系统

Gentoo 需要耐心,同样有优秀的wiki文档可供参考。安装适合你自己,且适配你电脑的系统.
这是一个高度灵活的基于源代码的Linux发行版。https://www.gentoo.org/
Arch是安装线程的二进制软件包,Gentoo是从源代码开始编译。所以不只软件适合你的要求,系统更加适配你的电脑硬件。
https://wiki.gentoo.org/wiki/Handbook:Main_Page/zh-cn


顶级用户使用:LFS 构筑自己的Linux系统

http://www.linuxfromscratch.org/lfs/
Linux From Scratch(LFS)是一个项目,为您提供完全从源代码构建自己的自定义Linux系统的分步说明。
http://www.linuxfromscratch.org/lfs/downloads/stable/
只要按照手册上一步步做下来,就能得到一个可用的系统。
所以lfs并不是一个发行版,而是类似于一个教学环境,一本说明书。
除了lfs以外,还有blfs、alfs等子项目。
注:按照lfs手册成够构筑Linux系统后,你可能还不知道其中的每一步为什么要这么做,因为这个文档比较实在,并不会提供太多关联信息。
而gentoo的文档上则详细的介绍了执行每一步所需的背景知识,包含很多可选项,并把最后的决定权留给你。

Arch VS Gentoo

https://wiki.archlinux.org/index.php/Arch_compared_to_other_distributions#Gentoo/Funtoo_Linux
  • Arch Linux 和 Gentoo Linux 都是滚动升级的发行版,所以在上游软件发布很短时间后,其上就会有软件包可用。
  • Gentoo 的基础系统和软件包都是根据用户指定的 USE 标识直接从源代码构建。Gentoo 提供了一个类 ports 系统( Ports 是 BSD 上的一个系统工具)来从源代码编译软件包,而 Arch 基础系统被设计为“直接由预构建好的 x86_64 二进制软件包组成”。一般来说,Arch 更易于构建和升级,而 Gentoo 更易于进行系统化的定制。
  • Arch 只支持 x86_64 架构,Gentoo 对 x86(i486/i686)、x86_64、PPC/PPC64、SPARC、Alpha、ARM、MIPS、HPPA、S/390、Itanium 架构提供官方支持。
  • Gentoo 的官方包管理工具比 ArchLinux 的更复杂和强大,而且一些在 Gentoo 中处于核心位置的特性(比如 USE 标记、SLOTs 等等)在 Arch 中并没有相对应的功能。究其原因,一是因为 ArchLinux 主要是一个二进制发行版,第二是因为 Gentoo 和 Arch 在设计哲学上有些差别。Arch 在原则上更偏向于架构的简洁性和避免过度设计。
  • 因为 Gentoo 和 Arch 的安装包都只包含基本系统,所以它们两者都被认为是需要高度定制化的系统。一般来说,Gentoo 用户如果习惯于 systemd 的话,对Arch的大多数方面都会感到满意。

Arch 和 Gentoo的共同点:

  • 最小系统基础,仅有命令行界面
  • 高度可定制化
  • 优秀的帮助文档系统
  • 都是滚动发布
  • 在从源码生成安装的角度来讲两者没有明显的优劣之分。
  • 甚至两者都可以通过包元文件使用其他发行版提供的二进制包(rpm, deb等)进行安装。

部分差异表格

项目 ARCH Gentoo
Init-System Systemd OpenRC
软件仓库 二进制仓库 源码仓库
额外支持 提供从源码编译的支持(ABS) 提供野包(overlay)
包管理 pacman Portage
软件树 ABS Portage
包管理器 abs, pacman、makepkg等的集合 emerge
包元文件 PKGBUILD ebuild
多版本支持 单一版本 (新包名安装多一个版本) “slot”多版本共存
软件包版本 主流发行版中,更新速度最快的一个 不一定是最新的,但维护的包质量都很高
架构支持 x86-64(AMD64) 几乎所有架构
内核 Linux Linux, BSD, hurd
安装过程 效率极高 编译安装速度慢
能耗 低能耗 以电费换性能著称 ?

Gentoo的自定义更胜一筹

  • 定制性极强的USE变量使其灵活性远超Arch
  • 从依赖的角度来讲,USE变量相当于更微观的“包”,
  • USE有全局的和针对特定包的,前者影响着后者,通过USE变量你可以选择整个系统或某个包具备的特性和功能,全局USE可能会影响到多个包。
  • USE之间也有依赖和冲突关系,包间的依赖和USE间的依赖共同构成了Gentoo包管理问题的核心。
更多信息:
https://www.zhihu.com/question/19672940
https://en.wikipedia.org/wiki/Comparison_of_BSD_operating_systems

Diode

导航 (返回顶部) 1. Diode 1.1 Diode 概述 1.2 肖克利二极管方程 1.3 缩写 Abbreviations 2. 主要功能 2.1 单向电流 (Unidirectional current flow) 2.2 阈值电压 (Threshold...