Linux PID 1 和 Systemd

systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。systemd 的特性有:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。

要说清 Systemd,得先从Linux操作系统的启动说起。Linux 操作系统的启动首先从 BIOS 开始,然后由 Boot Loader 载入内核,并初始化内核。内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程,也叫根进程。它负责产生其他所有用户进程。所有的进程都会被挂在这个进程下,如果这个进程退出了,那么所有的进程都被 kill 。如果一个子进程的父进程退了,那么这个子进程会被挂到 PID 1 下面。(注:PID 0 是内核的一部分,主要用于内进换页,参看:Process identifier

SysV Init

PID 1 这个进程非常特殊,其主要就任务是把整个操作系统带入可操作的状态。比如:启动 UI – Shell 以便进行人机交互,或者进入 X 图形窗口。传统上,PID 1 和传统的 Unix System V 相兼容的,所以也叫 sysvinit,这是使用得最悠久的 init 实现。Unix System V 于1983年 release。

在 sysvint 下,有好几个运行模式,又叫 runlevel。比如:常见的 3 级别指定启动到多用户的字符命令行界面,5 级别指定启起到图形界面,0 表示关机,6 表示重启。其配置在 /etc/inittab 文件中。

与此配套的还有 /etc/init.d/ 和 /etc/rc[X].d,前者存放各种进程的启停脚本(需要按照规范支持 startstop子命令),后者的 X 表示不同的 runlevel 下相应的后台进程服务,如:/etc/rc3.d 是 runlevel=3 的。 里面的文件主要是 link 到  /etc/init.d/ 里的启停脚本。其中也有一定的命名规范:S 或 K 打头的,后面跟一个数字,然后再跟一个自定义的名字,如:S01rsyslogS02ssh。S 表示启动,K表示停止,数字表示执行的顺序。

UpStart

Unix 和 Linux 在 sysvint 运作多年后,大约到了2006年的时候,Linux内核进入2.6时代,Linux有了很多更新。并且,Linux开始进入桌面系统,而桌面系统和服务器系统不一样的是,桌面系统面临频繁重启,而且,用户会非常频繁的使用硬件的热插拔技术。于是,这些新的场景,让 sysvint 受到了很多挑战。

比如,打印机需要CUPS等服务进程,但是如果用户没有打机印,启动这个服务完全是一种浪费,而如果不启动,如果要用打印机了,就无法使用,因为sysvint 没有自动检测的机制,它只能一次性启动所有的服务。另外,还有网络盘挂载的问题。在 /etc/fstab中,负责硬盘挂载,有时候还有网络硬盘(NFS 或 iSCSI)在其中,但是在桌面机上,有很可能开机的时候是没有网络的, 于是网络硬盘都不可以访问,也无法挂载,这会极大的影响启动速度。sysvinit 采用 netdev 的方式来解决这个问题,也就是说,需要用户自己在 /etc/fstab 中给相应的硬盘配置上 netdev 属性,于是 sysvint 启动时不会挂载它,只有在网络可用后,由专门的 netfs 服务进程来挂载。这种管理方式比较难以管理,也很容易让人掉坑。

所以,Ubuntu 开发人员在评估了当时几个可选的 init 系统后,决定重新设计这个系统,于是,这就是我们后面看到的 upstart 。 upstart 基于事件驱动的机制,把之前的完全串行的同步启动服务的方式改成了由事件驱动的异步的方式。比如:如果有U盘插入,udev得到通知,upstart 感知到这个事件后触发相应的服务程序,比如挂载文件系统等等。因为使用一个事件驱动的玩法,所以,启动操作系统时,很多不必要的服务可以不用启动,而是等待通知,lazy 启动。而且事件驱动的好处是,可以并行启动服务,他们之间的依赖关系,由相应的事件通知完成。

upstart 有着很不错的设计,其中最重要的两个概念是 Job 和 Event。

Job 有一般的Job,也有service的Job,并且,upstart 管理了整个 Job 的生命周期,比如:Waiting, Starting, pre-Start, Spawned, post-Start, Running, pre-Stop, Stopping, Killed, post-Stop等等,并维护着这个生命周期的状态机。

Event 分成三类,signalmethod 和 hookssignal 就是异步消息,method 是同步阻塞的。hooks 也是同步的,但介于前面两者之间,发出hook事件的进程必须等到事件完成,但不检查是否成功。

但是,upstart 的事件非常复杂,也非常纷乱,各种各样的事件(事件没有归好类)导致有点凌乱。不过因为整个事件驱动的设计比之前的 sysvinit 来说好太多,所以,也深得欢迎。

Systemd

直到2010的有一天,一个在 RedHat工作的工程师 Lennart Poettering 和 Kay Sievers ,开始引入了一个新的 init 系统—— systemd。这是一个非常非常有野心的项目,这个项目几乎改变了所有的东西,systemd 不但想取代已有的 init 系统,而且还想干更多的东西。

Lennart 同意 upstart 干的不错,代码质量很好,基于事件的设计也很好。但是他觉得 upstart 也有问题,其中最大的问题还是不够快,虽然 upstart 用事件可以达到一定的启动并行度,但是,本质上来说,这些事件还是会让启动过程串行在一起。  如:NetworkManager 在等 D-Bus 的启动事件,而 D-Bus 在等 syslog 的启动事件。

Lennart 认为,实现上来说,upstart 其实是在管理一个逻辑上的服务依赖树,但是这个服务依赖树在表现形式上比较简单,你只需要配置——“启动 B好了就启动A”或是“停止了A后就停止B”这样的规则。但是,Lennart 说,这种简单其实是有害的(this simplification is actually detrimental)。他认为,

  • 从一个系统管理的角度出来,他一开始会设定好整个系统启动的服务依赖树,但是这个系统管理员要人肉的把这个本来就非常干净的服务依整树给翻译成计算机看的懂的 Event/Action 形式,而且 Event/Action 这种配置方式是运行时的,所以,你需要运行起来才知道是什么样的。
  • Event逻辑从头到脚到处都是,这个事件扩大了运维的复杂度,还不如之前的 sysvint。 也就是说,当用户配置了 “启动 D-Bus 后请启动 NetworkManager”, 这个 upstart 可以干,但是反过来,如果,用户启动 NetworkManager,我们应该先去启动他的前置依赖 D-Bus,然而你还要配置相应的反向 Event。本来,我只需要配置一条依赖的,结果现在我要配置很多很多情况下的Event。
  • 最后,upstart 里的 Event 的并不标准,很混乱,没有良好的定义。比如:既有,进程启动,运行,停止的事件,也有USB设备插入、可用、拔出的事件,还有文件系统设备being mounted、 mounted 和 umounted 的事件,还有AC电源线连接和断开的事件。你会发现,这进程启停的、USB的、文件系统的、电源线的事件,看上去长得很像, 但是没有被标准化抽像出来掉,因为绝大多数的事件都是三元组:start, condition, stop 。这种概念设计模型并没有在 upstart 中出现。因为 upstart 被设计为单一的事件,而忽略了逻辑依赖。

当然,如果 systemd 只是解决 upstart 的问题,他就改造 upstart 就好了,但是 Lennart 的野心不只是想干个这样的事,他想干的更多。

首先,systemd 清醒的认识到了 init 进程的首要目标是要让用户快速的进入可以操作OS的环境,所以,这个速度一定要快,越快越好,所以,systemd 的设计理念就是两条:

  • To start less.
  • And to start more in parallel.

也就是说,按需启动,能不启动就不启动,如果要启动,能并行启动就并行启动,包括你们之间有依赖,我也并行启动。按需启动还好理解,那么,有依赖关系的并行启动,它是怎么做到的?这里,systemd 借鉴了 MacOS 的 Launchd 的玩法(在Youtube上有一个分享——Launchd: One Program to Rule them All,在苹果的开源网站上也有相关的设计文档——About Daemons and Services

要解决这些依赖性,systemd 需要解决好三种底层依赖—— Socket, D-Bus ,文件系统。

  • Socket依赖。如果服务C依赖于服务S的socket,那么就要先启动S,然后再启动C,因为如果C启动时找不到S的Socket,那么C就会失败。systemd 可以帮你在S还没有启动好的时候,建立一个socket,用来接收所有的C的请求和数据,并缓存之,一旦S全部启动完成,把systemd替换好的这个缓存的数据和Socket描述符替换过去。
  • D-Bus依赖D-Bus 全称 Desktop Bus,是一个用来在进程间通信的服务。除了用于用户态进程和内核态进程通信,也用于用户态的进程之前。现在,很多的现在的服务进程都用 D-Bus 而不是Socket来通信。比如:NetworkManager 就是通过 D-Bus 和其它服务进程通讯的,也就是说,如果一个进程需要知道网络的状态,那么就必需要通过 D-Bus 通信。D-Bus 支持 “Bus Activation”的特性。也就是说,A要通过 D-Bus服务和B通讯,但是B没有启动,那么 D-Bus 可以把B起来,在B启动的过程中,D-Bus 帮你缓存数据。systemd 可以帮你利用好这个特性来并行启动 A 和 B。
  • 文件系统依赖。系统启动过程中,文件系统相关的活动是最耗时的,比如挂载文件系统,对文件系统进行磁盘检查(fsck),磁盘配额检查等都是非常耗时的操作。在等待这些工作完成的同时,系统处于空闲状态。那些想使用文件系统的服务似乎必须等待文件系统初始化完成才可以启动。systemd 参考了 autofs 的设计思路,使得依赖文件系统的服务和文件系统本身初始化两者可以并发工作。autofs 可以监测到某个文件系统挂载点真正被访问到的时候才触发挂载操作,这是通过内核 automounter 模块的支持而实现的。比如一个 open() 系统调用作用在某个文件系统上的时候,而这个文件系统尚未执行挂载,此时 open() 调用被内核挂起等待,等到挂载完成后,控制权返回给 open() 系统调用,并正常打开文件。这个过程和 autofs 是相似的。

下图来自 Lennart 的演讲里的一页PPT,展示了不同 init 系统的启动。

启动流程

除此之外,systemd 还在启动时管理好了一些下面的事。

用C语言取代传统的脚本式的启动。前面说过,sysvint 用 /etc/rcX.d 下的各种脚本启动。然而这些脚本中需要使用 awksedgrepfindxargs 等等这些操作系统的命令,这些命令需要生成进程,生成进程的开销很大,关键是生成完这些进程后,这个进程就干了点屁大的事就退了。换句话说就是,我操作系统干了那么多事为你拉个进程起来,结果你就把个字串转成小写就退了,把我操作系统当什么了?

在正常的一个 sysvinit 的脚本里,可能会有成百上千个这样的命令。所以,慢死。因此,systemd 全面用 C 语言全部取代了。一般来说,sysvinit 下,操作系统启动完成后,用 echo $$ 可以看到,pid 被分配到了上千的样子,而 systemd 的系统只是上百。

另外,systemd 是真正一个可以管住服务进程的——可以跟踪上服务进程所fork/exec出来的所有进程。

  • 我们知道, 传统 Unix/Linux 的 Daemon 服务进程的最佳实践基本上是这个样子的 (具体过程可参看这篇文章“SysV Daemon”)——
    1. 进程启动时,关闭所有的打开的文件描述符(除了标准描述符0,1,2),然后重置所有的信号处理。
    2. 调用 fork() 创建子进程,在子进程中 setsid(),然后父进程退出(为了后台执行)
    3. 在子进程中,再调用一次 fork(),创建孙子进程,确定没有交互终端。然后子进程退出。
    4. 在孙子进程中,把标准输入标准输出标准错误都连到 /dev/null 上,还要创建 pid 文件,日志文件,处理相关信号 ……
    5. 最后才是真正开始提供服务。
  • 在上面的这个过程中,服务进程除了两次 fork 外还会 fork 出很多很多的子进程(比如说一些Web服务进程,会根据用户的请求链接来 fork 子进程),这个进程树是相当难以管理的,因为,一旦父进程退出来了,子进程就会被挂到 PID 1下,所以,基本上来说,你无法通过服务进程自已给定的一个pid文件来找到所有的相关进程(这个对开发者的要求太高了),所以,在传统的方式下用脚本启停服务是相当相当的 Buggy 的,因为无法做对所有的服务生出来的子子孙孙做到监控。
  • 为了解决这个问题,upstart 通过变态的 strace 来跟踪进程中的 fork() 和 exec()或 exit() 等相关的系统调用。这种方法相当笨拙。 systemd 使用了一个非常有意思的玩法来 tracking 服务进程生出来的所有进程,那就是用 cgroup (我在 Docker 的基础技术“cgroup篇”中讲过这个东西)。cgroup主要是用来管理进程组资源配额的事,所以,无论服务如何启动新的子进程,所有的这些相关进程都会同属于一个 cgroup,所以,systemd 只需要简单的去遍历一下相应的 cgroup 的那个虚文件系统目录下的文件,就可以正确的找到所有的相关进程,并将他们一一停止。

另外,systemd 简化了整个 daemon 开发的过程:

  • 不需要两次 fork(),只需要实现服务本身的主逻辑就可以了。
  • 不需要 setsid()systemd 会帮你干
  • 不需要维护 pid文件systemd 会帮处理。
  • 不需要管理日志文件或是使用syslog,或是处理HUP的日志reload信号。把日志打到 stderr 上,systemd 帮你管理。
  • 处理 SIGTERM 信号,这个信号就是正确退出当前服务,不要做其他的事。
  • ……

除此之外,systemd 还能——

  • 自动检测启动的服务间有没有环形依赖。
  • 内建 autofs 自动挂载管理功能。
  • 日志服务。systemd 改造了传统的 syslog 的问题,采用二进制格式保存日志,日志索引更快。
  • 快照和恢复。对当前的系统运行的服务集合做快照,并可以恢复。
  • ……

还有好多好多,他接管很多很多东西,于是就让很多人不爽了,因为他在干了很多本不属于 PID 1 的事。

Systemd 争论和八卦

于是 systemd 这个东西成了可能是有史以来口水战最多的一个开源软件了。systemd 饱受各种争议,最大的争议就是他破坏了 Unix 的设计哲学(相关的哲学可以读一下《Unix编程艺术》),干了一个大而全而且相当复杂的东西。当然,Lennart 并不同意这样的说法,他后来又写一篇blog “The Biggest Myths”来解释 systemd 并不是这样的,大家可以前往一读。

这个争议大到什么样子呢?2014 年,Debian Linux 因为想准备使用 systemd 来作为标准的 init 守护进程来替换 sysvinit 。而围绕这个事的争论达到了空前的热度,争论中充满着仇恨,systemd 的支持者和反对者都在互相辱骂,导致当时 Debian 阵营开始分裂。还有人给 Lennart 发了死亡威胁的邮件,用比特币雇凶买杀手,扬言要取他的性命,在Youbute上传了侮辱他的歌曲,在IRC和各种社交渠道上给他发下流和侮辱性的消息。这已经不是争议了,而是一种不折不扣的仇恨!

systemd shewantsit

于是,Lennart 在 Google Plus 上发了贴子,批评整个 Linux 开源社区和 Linus 本人。他大意说,

这个社区太病态了,全是 ass holes,你们不停用各种手段在各种地方用不同的语言和方式来侮辱和漫骂我。我还是一个年轻人,我从来没有经历过这样的场面,但是今天我已经对这种场面很熟悉了。我有时候说话可能不准确,但是我不会像他样那样说出那样的话,我也没有被这些事影响,因为我脸皮够厚,所以,为什么我可以在如何大的反对声面前让 systemd 成功,但是,你们 Linux 社区太可怕了。你们里面的有精神病的人太多了。另外,对于Linus Torvalds,你是这个社区的 Role Model,但可惜你是一个 Bad Role Model,你在社区里的刻薄和侮辱性的言行,基本从一定程度上鼓励了其它人跟你一样,当然,并不只是你一个人的问题,而是在你周围聚集了一群和你一样的这样干的人。送你一句话—— A fish rots from the head down !一条鱼是从头往下腐烂的……

这篇契文很长,喜欢八卦的同学可以前往一读。感受一下 Lennart 当时的心态(我觉得能算上是非常平稳了)。

Linus也在被一媒体问起 systemd 这个事来(参看“Torvalds says he has no strong opinions on systemd”),Linus在采访里说,

我对 systemd 和 Lennart 的贴子没有什么强烈的想法。虽然,传统的 Unix 设计哲学—— “Do one thing and Do it well”,很不错,而且我们大多数人也实践了这么多年,但是这并不代表所有的真实世界。在历史上,也不只有systemd 这么干过。但是,我个人还是 old-fashioned 的人,至少我喜欢文本式的日志,而不是二进制的日志。但是 systemd 没有必要一定要有这样的品味。哦,我说细节了……

今天,systemd 占据了几乎所有的主流的 Linux 发行版的默认配置,包括:Arch Linux、CentOS、CoreOS、Debian、Fedora、Megeia、OpenSUSE、RHEL、SUSE企业版和 Ubuntu。而且,对于 CentOS, CoreOS, Fedora, RHEL, SUSE这些发行版来说,不能没有 systemd。(Ubuntu 还有一个不错的wiki – Systemd for Upstart Users 阐述了如何在两者间切换)

其它

还记得在《缓存更新的套路》一文中,我说过,如果你要做好架构,首先你得把计算机体系结构以及很多老古董的基础技术吃透了。因为里面会有很多可以借鉴和相通的东西。那么,你是否从这篇文章里看到了一些有分布式架构相似的东西?

比如:从 sysvinit 到 upstart 再到 systemd,像不像是服务治理?Linux系统下的这些服务进程,是不是很像分布式架构中的微服务?还有那个D-Bus,是不是很像SOA里的ESB?而 init 系统是不是很像一个控制系统?甚至像一个服务编排(Service Orchestration)系统?

分布式系统中的服务之间也有很多依赖,所以,在启动一个架构的时候,如果我们可以做到像 systemd 那样并行启动的话,那么是不是就像是一个微服务的玩法了?

嗯,你会发现,技术上的很多东西是相通的,也是互相有对方的影子,所以,其实技术并不多。关键是我们学在了表面还是看到了本质。

延伸阅读

 

转载自: Linux PID 1 和 Systemd | | 酷 壳 – CoolShell

smartos教程二:与 Linux 不同点总结

在SmartOS用户中最常见的问题之一就是,既然说SmartOS和Linux类似,那除了那些看不见的技术细节,在使用时到底有什么不同呢?如果已经熟练操作Linux,那SmartOS能快速上手么?答案是当然能,其实常用的不同之处并不多。这篇文章将回答Linux与SmartOS在操作上的不同之处。

在SmartOS用户中最常见的问题之一就是,既然说SmartOS和Linux类似,那除了那些看不见的技术细节,在使用时到底有什么不同呢?如果已经熟练操作Linux,那SmartOS能快速上手么?答案是当然能,其实常用的不同之处并不多。这篇文章将回答Linux与SmartOS在操作上的不同之处。

SmartMachine和其他类Unix系统不同之处主要在于两类:

  • 命令类似,但在SmartOS中用不同的名字
  • 完成类似的任务,但在SmartOS中有不同的实现过程

这里列出一个命令列表,用来帮助Linux用户找到在SmartOS中与Linux对等的命令。

  • Linux 和 SmartOS 命令对比列表
  • 不同使用语境(Use Context)的例子
    • 检查进程和内存
    • 启动和停止服务

Linux and SmartOS 命令对比列表

任务 / 操作系统LinuxSmartOSSmartOS Virtual Instance (zone)
表中缩写代表的含义
table key
(rh) = Red Hat, Mandrake, SUSE,...
(deb) = Debian, Libranet,...
(fed) = Fedora
(gen) = Gentoo
(md) = Mandrake/Mandriva
(SUSE) = SUSE
Joyent SmartOS

开源版本可访问以下链接http://smartos.org
Joyent SmartOS zone
管理用户
managing users
useradd
usermod
userdel
adduser
chage
getent
useradd
userdel
usermod
getent
logins
groupadd
useradd
userdel
usermod
getent
logins
groupadd
列举硬件配置信息
list hardware configuration
arch
uname
dmesg (if you're lucky)
cat /var/log/dmesg
/proc/*
lshw
dmidecode
lspci
lspnp
lsscsi
lsusb
lsmod
(SUSE) hwinfo
/sys/devices/*
arch
prtconf [-v]
prtpicl [-v]
uname
psrinfo [-v]
isainfo [-v]
dmesg
iostat -En
cfgadm -l
/etc/path_to_inst
arch
uname
psrinfo [-v]
isainfo [-v]
dmesg
iostat -En
读取磁盘命名
read a disk label
fdisk -lfdisk
prtvtoc
命名磁盘
label a disk
cfdisk
fdisk
e2label
format
prtvtoc
fdisk
磁盘分区
partition a disk
parted (if you have it)
cfdisk
fdisk
pdisk (on a Mac)
(deb) mac-fdisk (on a Mac)_
(md) _diskdrake
format
fmthard
rmformat
内核文件
kernel
/boot/vmlinuz*
/boot/bootlx
(see /etc/lilo.conf or /boot/grub/menu.lst)
/kernel/genunix
/platform/`uname -m`/
kernel/unix
kernel modules are in /kernel, /usr/kernel, and /platform/`uname -m`/kernel
Kernel module files not visible within a zone
显示/配置内核参数
show/set kernel parameters
/proc/*
/proc/sys/*
sysctl
/etc/sysctl.conf
sysdef
getconf
cat /etc/system
ndd
mdb -k[w]
sysdef
getconf
ndd
显示已加载的内核模块
loaded kernel modules
lsmodmodinfomodinfo
加载内核模块
load module
modprobe
insmod
modload
add_drv
devfsadm
卸载内核模块
unload module
rmmod
modprobe -r
modunload
启动脚本
startup scripts
/etc/rc* (but may vary)
/etc/init.d/
SMF(5)
/etc/rc*
/etc/init.d/
svcadm
svcs
SMF(5)
/etc/rc*
/etc/init.d
svcadm
svcs
启动/停止/配置服务
start/ stop/ config services
(rh) _service
(rh) _chkconfig
(deb) _sysv-rc-conf
svcs
svcadm
svccfg
svcs
svcadm
svccfg
关机
shutdown (& power off if possible)
shutdown -Ph now
shutdown -y -g0 -i0
halt
poweroff
shutdown -y -g0 -i5
halt
shutdown -y -g0 -i5
halt
run levels
*=normal states
更多细节参考
www.phildev.net/runlevels.html
(set in /etc/inittab)
0: halt
s,S,1: vendor-dependent
1: single-user
2-5*: multiuser
6: reboot
0: firmware monitor
s,S: single-user
1: sys admin
2: multiuser
3*: share NFS
4*: user-defined
5: power-down if possible
6: reboot
s,S: single-user
1: sys admin
2: multiuser
3*: share NFS
4*: user-defined
5: power-down if possible
6: reboot
show runlevel/sbin/runlevelwho -rwho -r
时区信息
time zone info
/usr/share/zoneinfo/
/etc/localtime
/usr/share/lib/zoneinfo//usr/share/lib/zoneinfo
检查交换分区
check swap space
swapon -s
cat /proc/meminfo
cat /proc/swaps
free
swap -s[h]
swap -l[h]
Note: in a zone, swap is virtual
memory size
swap -s[h]
swap -l[h]
bind process to CPUtaskset (sched-utils)pbind
psrset
pbind
psrset
终止进程
killing processes
kill
killall
kill
pkill
killall <- tries to kill everything, DO NOT USE THIS
kill
pkill
killall <- tries to kill everything, DO NOT USE THIS
显示CPU信息
show CPU info
cat /proc/cpuinfo
lscpu
psrinfo -pvpsrinfo -pv
内存信息
memory
freememprtconf | head
zonememstat
prtconf | head
zonememstat
默认文件系统
"normal" filesystem
ext2
ext3
ReiserFS
zfszfs
开机自动挂载分区配置
file system
description
/etc/fstab/etc/vfstab/etc/vfstab
创建文件系统
create filesystem
mke2fs
mkreiserfs
mkdosfs
mkfs
zfs
zpool
zfs (if zone has delegated dataset)
文件系统调试和恢复
file system debugging and recovery
fsck
debugfs
e2undel
zdb
创建非空文件
create non-0-length empty file
dd if=/dev/zero of=filename
bs=1024k count=desired
mkfilemkfile
创建/挂载ISO镜像
create/mount ISO image
mkisofs
mount -o loop pathToIso
mountPoint
mkisofs;DEVICE=`lofiadm -a /absolute_pathname/image.iso` ; mount -F hsfs -o ro
$DEVICE
ACL配置
ACL management
getfacl
setfacl
getfacl
setfacl
getfacl
setfacl
NFS share definitions/etc/exports/etc/dfs/dfstab
dfshares
NFS share command/etc/init.d/nfs-server reload_(rh)__ _exportfs -ashare
shareall
NFS informationcat /proc/mountsshowmount
nfsstat
nfsstat
name resolution order/etc/nsswitch.conf
/etc/resolv.conf
/etc/nsswitch.conf
getent
/etc/nsswitch.conf
getent
显示网络接口信息
show network interface info
ifconfig
ethtool
dladm
ndd
ifconfig -a
netstat -in
dladm
ndd
ifconfig -a
netstat -in
更改IP地址
change IP
Joyent Public Cloud IP addresses are set in the Cloud Management Portal.
ifconfig
ping one packetping -c 1 hostnameping hostname packetsize 1ping hostname packetsize 1
监听网络
sniff network
etherfind
tcpdump
wireshark (formerly _ethereal)
etherape
snoopsnoop
tcpdump available from pkgin
route definitionsroute
(rh) /etc/sysconfig/network
(rh) /etc/sysconfig/static-routes
(deb) /etc/init.d/network
(deb) /etc/network
/etc/defaultrouter
/etc/notrouter
/etc/gateways
in.routed
netstat -r
route add
/etc/defaultrouter
/etc/notrouter
/etc/gateways
in.routed
netstat -r
route add
telnetd, ftpd banner/etc/issue.net (telnet)
(ftp varies; can use tcp wrappers)
Use nc insteadUse nc instead
配置日期/时间
set date/time
(from net: ntp or other)
ntpdate
rdate
netdate
ntpdate
rdate
ntpdate
rdate
auditingauditd
/var/log/faillog
audit
auditd
auditreduce
praudit
audit
auditd
auditreduce
praudit
用户密码保存位置
encrypted passwords in
/etc/shadow (may vary)/etc/shadow/etc/shadow
最小密码长度
min password length
/etc/pam.d/system-auth/etc/default/passwd/etc/default/passwd
允许/禁止root登陆
allow/deny root
logins
/etc/securetty/etc/default/login/etc/default/login
防火墙配置
firewall config
iptables
ipchains
ipfwadm
(rh) redhat-config-
securitylevel
/etc/ipf/ipf.conf/etc/ipf/ipf.conf
显示已安装的软件
show installed software
(rh) _rpm -a -i
(rh) _rpm -qa
(rh) yum list installed
(deb) dselect
(deb) aptitude
(deb) dpkg -l
(gen) _ls /var/db/pkg/*
(gen) _eix -I
pkgin list
pkgin avail <- list available installable software
安装软件
add software
(rh) _rpm -hiv
(rh) yum install pkg
(deb) dselect
(deb) _apt-get install _pkg
(deb) dpkg -i
pkgin install
precompiled binaries* of GPLware and freeware*www.linux.org
linux.tucows.com
sourceforge.net
rpmfind.net
(deb) ftp.debian.org
(deb) packages.debian.org
(gen) packages.gentoo.org
(gen) gentoo-portage.com;
(md) easyurpmi.zarb.org
www.sunfreeware.com
www.blastwave.org
http://pkgsrc.joyent.com/
pkgin
C编译器
C compiler
cc
gcc
gcc
[https://download.joyent.com/pub/build/SunStudio.tar.bz2]
gcc (may need to be installed via pkgin)
https://download.joyent.com/pub/build/SunStudio.tar.bz2
configure/show
runtime linking
ldconfig
ldd
readelf
lsmod
crle
ldd
elfdump
dump
pldd
modinfo
LD_PRELOAD
crle
ldd
elfdump
dump
readelf
pldd
modinfo
LD_PRELOAD
链接库路径
link library path
$LD_LIBRARY_PATH
/etc/ld.so.conf
$LD_LIBRARY_PATH$LD_LIBRARY_PATH
跟踪工具
tracing utility
strace
ltrace
dtrace
truss
sotruss
dtrace
truss
sotruss
define user defaults/etc/profile
/etc/security/
/etc/skel/
/etc/profile.d/*
/etc/default/login
/etc/profile
/etc/security/
/etc/default/login
/etc/profile
/etc/security/
csh global .login/etc/csh.login/etc/.login/etc/.login
default syslog and messages/var/log/syslog
/var/log/messages
/usr/adm/messages
/var/log/maillog
/var/adm/messages
/var/log/syslog
softpanorama.org/Logs/solaris_logs.shtml
/var/adm/messages
/var/log/syslog
系统错误报告工具
system error reporting tool
dmesg_(deb)_ reportbugfmadm
fmdump
prtdiag
fmadm
fmdump
性能检测
performance monitoring
vmstat
procinfo -D
top
htop
pstree
dtrace
prstat
sar
ostat
kstat
mpstat
netstat
nfsstat
vmstat
lockstat
plockstat
ptree
vfsstat
intrstat
dtrace
prstat
sar
ostat
kstat
mpstat
netstat
nfsstat
vmstat
plockstat
ptree
vfsstat
查看进程占用的文件和端口match process to file or portlsof
netstat -atup
fuser
pfiles
pfiles
fuser
lsof
zones/containerszoneadm
zonecfg
zlogin
zoneadm
zonename
虚拟工具
Virtualization
kvm/qemukvm/qemu (each instance in a kvm branded zone)
vmadm
imgadm
WikipediaLinuxSmartOS
Illumos
SmartOS
Illumos

smartos 和linux相同命令不同作用的例子

下面的例子是一些常用的命令,他们在linux与smartos中的作用不同

CommandWhat's different on a Smart Machine
dfOn most SmartOS image this is set up to use the GNU version. Use /usr/bin/df for the native version.
lsofSmartMachines use a different collection of tools to examine processes. See [Examining processes and memory|#procmem||||||||||||\||] later in this topic.
pingReturns whether a host responds or not.
Use ping -s to get a continuous response.
toptop is available in /opt/local/bin, but prstat -Z provides more zone aware (and more accurate) information than top.

Rosetta Stone for Unix 是一个有用的资源,可以帮你看看你经常使用的UNIX版本和其他的UNIX版本(包括Mac)有何不同,并如何对应。

检查进程和内存

在旧的SmartOS镜像中,这些命令提供了端口和相关资源的信息,使用root或sudo可运行它们。新的镜像使用的是 SmartMachine 工具包(Tools Package)

CommandDescriptionExample
pcpDisplays the ports used by a process, or the processes that use a port./root/bin/pcp -p 80 displays all the processes that use port 80.
/root/bin/pcp -P 28068 displays all the ports that process 28068 uses.
/root/bin/pcp -a displays port and process information for all ports.
jinfDisplays information about how your SmartMachine is using its resources./root/bin/jinf -c displays CPU usage information.
/root/bin/jinf -m displays memory usage information.
/root/bin/jinf -s displays swap usage information.

SmartOS 提供了一个工具套件来检查进程,可以在 proc 的 man page 中学习到更多内容。

ToolDescription
prstatThis tool displays the active processes like top does on Linux systems.
prstat -Z will provide you with a summary of your SmartMachine's status.
pgrepReturns a list of process IDs (PIDs) of processes that match a pattern or meet certain conditions.
pkillKills the processes that match a pattern or meet certain conditions.
pfilesReturns a list of all the open files that belong to a process.
pstackDisplays a stack trace of the specified process
ptreeDisplays a process tree for all processes or a given process
ls /procLists the process IDs of all running processes.

你可以将 pgrep 的结果和其他 proc 工具合并显示。比如,显示与 http 进程相关的所有文件,可以使用如下命令来替代 lsof:

$ sudo pfiles $(pgrep http)

若要限制 prstat 显示 http 进程,可以使用命令:

$ prstat $(pgrep -d , http)

注意:如果 prstat 显示改变了你的终端设置,可以使用 reset 命令返回到正常状态

对于 vmstat, mpstat 和 psrinfo 命令,主要显示物理机中处理器和内存的统计信息。这些输出一般来说对于SmartMachine的管理员才有用。

启动和停止服务

在其他系统中,你也许习惯使用命令在 /etc/init.d 来启动或停止服务。
SmartMachines 使用 Service Management Facility 来做到这些。

命令 svcs 和 svcadm 是你经常会使用到的。有些命令把 service identifier 叫做FMRI(Fault Management Resource Identifier)。
你可以使用 svcs 命令列举一个服务所有的 identifier 。

CommandDescription
svcsLists all the enabled services
svcs -aLists all of the services, even those that are disabled or off line
svcadm enable apacheEnable all of the processes with an apache FMRI
svcadm disable apacheDisable all of the processes with an apache FMRI
svcadm restart apacheRestart all of the processes with an apache FMRI

例如,如果你想更改 /etc/ssh/sshd_config 后重启SSH,可以这样做:

$ sudo svcadm restart ssh

向了解更多关于SMF的信息,可以打开这个网页

fedora 26 于7月13日正式发布

包括Workstation、Server和Atomic Host版本在内,Fedora 26系统镜像已经正式发布上线。用户可以通过命令行或者GNOME Software非常方面的进行升级,整个升级过程大约需要半个小时。继续为程序员和终端用户提供优质服务,Fedora于今天推出了全新升级的开发者软件,其中包括GCC 7,Golang 1.8和Python 3.6等等。

Fedora 26

包括Workstation、Server和Atomic Host版本在内,Fedora 26系统镜像已经正式发布上线。用户可以通过命令行或者GNOME Software非常方面的进行升级,整个升级过程大约需要半个小时。继续为程序员和终端用户提供优质服务,Fedora于今天推出了全新升级的开发者软件,其中包括GCC 7,Golang 1.8和Python 3.6等等。

此外在Fedora安装器中引入了全新的分区工具Anaconda,能够赋予系统爱好者和系统管理员更精细的控制选项。此外在本次升级中对Fedora 26的后台性能进行了诸多优化,例如更好的缓存用户和群组信息,更好的处理调试信息等等。此外在2.5重大版本更新中DNF安装包管理器也新增了很多功能。

下载地址: