init:
详解:http://zh.wikipedia.org/wiki/Init
init(为英语:initialization的简写)是 Unix 和 类Unix 系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为1。
Unix 系列中(如 System III 和 System V)init的作用,和研究中的 Unix 和 BSD 派生版本相比,发生了一些变化。
大多数Linux发行版是和 System V 相兼容的,但是一些发行版如 Arch 和 Slackware 采用的是BSD风格,其它的如 Gentoo 是自己定制的。
Ubuntu和其它一些发行版现在开始采用来代替传统的 init 进程,不过貌似Ubuntu15.10将会采用systemd。
BSD风格:
BSD init 运行存放于’/etc/rc’的初始化 shell 脚本,然后启动基于文本模式的终端(getty)或者基于图形界面的终端(窗口系统,如 X)。
这里没有运行模式的问题,因为文件 ‘rc’ 决定了 init 如何执行。
优点: 简单且易于手动编辑。
缺点: 如果第三方软件需要在启动过程执行它自身的初始化脚本,它必须修改已经存在的启动脚本,
一旦这种过程中有一个小错误,都将导致系统无法正常启动。
SysV风格:
System V init 检查 ‘/etc/inittab’ 文件中是否含有 ‘initdefault’ 项。
这告诉 init 系统是否有一个默认运行模式。如果没有默认的运行模式,那么用户将进入系统控制台,手动决定进入何种运行模式。
优点: 灵活性强
缺陷: 比较复杂
跳过init:
Linux系统中,现代的bootloader(如 LILO 或者 GRUB),用户可以在初始化过程中最后启动的进程来取代默认的 /sbin/init。
通常是在 bootloader 环境中通过执行 init=/foo/bar 命令。例如,如果执行 init=/bin/bash,启动单用户 root 的 shell 环境,无需用户密码。
initrd:
Initrd ramdisk或者””initrd””是指一个临时文件系统,它在启动阶段被Linux内核调用。
initrd主要用于当“根”文件系统被挂载之前,进行准备工作。
initrd 系统中的文件在开机阶段可以被核心访问,里面的内容会被挂载成一个 loop 型态的文件,
早期是将 initrd 放在小的软盘片内。initrd 通常被压缩成 gzip 类型,在开机的时候由 bootloader(LILO, GRUB)
来告知核心 initrd 的位置。不过在2.6版本内核之后出现了initramfs,它和initrd实现同样的功能,
但是它基于一种cpio档,无须挂载就可以展开成一个文件系统,因此省去了各种相关的权限,在自动化方面更方便了。
initramfs:
如上介绍,initramfs就是为内核通往根文件系统的桥梁。其中包含了必要的环境,比如基本的C库,动态库的链接加载器,在初始化最后,内核运行initramfs中的
init程序,该程序将探测硬件设备、加载驱动,挂载真正的文件系统,执行文件系统上的/sbin/init,进而切换到真正的用户空间。
initrd和initramfs口语化描述:
initramfs是initrd的升级版,initrd基于ramdisk技术,而ramdisk就是一个基于内存的块设备,内核访问initrd仍需要缓存机制。
initramfs基于ramfs,Linus Torvalds基于已有的缓存机制实现了ramfs,而ramfs是基于缓存的一个文件系统。
rootfs:其实就是一个ramfs,rootfs存在于内存中,内核不需要特殊的驱动就可以挂碍rootfs,是一个过渡的桥梁。
systemd:
http://zh.wikipedia.org/wiki/Systemd
systemd是Linux下的一种init软件,由Lennart Poettering带头开发,其开发目标是最终代替现在常用的System V与BSD风格init程序。
从设计构思上说,由于systemd使用了cgroup与fanotify等组件以实现其特性,所以只适用于Linux。
有鉴于此,考虑到kFreeBSD分支的软件源无法纳入systemd,为与其他分支保持一致,Debian开发者尽力
避免纳入systemd。但Lennart Poettering本人对此并不在意,并称“Debian GNU/kFreeBSD不过是玩具系统”。
(所以个人认为这是Debian分家的一个小理由,个人纯属猜测)