标签 init 下的文章

我们前面几节已经详细介绍了基于 UbuntuCentOS 构建内存镜像的方案,其中 ~/work/initramfs/init 脚本内容大致如下:

#!/bin/busybox sh

# Dump to sh if something fails
error() {
    echo "Jumping into the shell..."
    setsid cttyhack sh
}

# Populate /bin with binaries from busybox
/bin/busybox --install /bin

mkdir -p /proc
mount -t proc proc /proc

mkdir -p /sys
mount -t sysfs sysfs /sys

mkdir -p /sys/dev
mkdir -p /var/run
mkdir -p /dev

mkdir -p /dev/pts
mount -t devpts devpts /dev/pts

# Populate /dev
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s

echo "mount rootfs... "
mkdir -p /newroot
mount -t tmpfs -o size=80% tmpfs /newroot || error

xz -d -c -f rootfs.tar.xz | tar -x -f - -C /newroot || error

mount --move /sys /newroot/sys
mount --move /proc /newroot/proc
mount --move /dev /newroot/dev

exec switch_root /newroot /sbin/init || error

- 阅读剩余部分 -

在前面, 我们已经使用 debootstrap 构建基于Ubuntu的内存OS, 但是业界常用的更多的是CentOS,所以一直在尝试使用CentOS来构建内存OS.
CentOS 7 root filesystem on tmpfs这篇文章中的方案可行, 我们不使用的原因是流程构建太长, 外部依赖太多,冗余的内容太多,也不够精简.
所以我们希望尝试的方案是类似 Ubuntudebootstrap 的工具. yum 本身是可以将对应包安装到指定目录,直到看到下面这篇日本同行写的文章,让这个过程更加清晰了.

宿主环境中,我们需要有 yum rpm 等工具命令的支持,在各个发行版中均可以安装这两个包, 当然宿主机器本身就是CentOS那就不需要在独立安装了.

- 阅读剩余部分 -

在前面的文章中, 我们已经提到, initrd 本身就是精简版的根盘文件系统, 主要目的是用于内核启动后 OS 环境的初始化, 比如你是 Soft Raid,需要在这个时候读取 /etc/fstab 文件,比如根盘文件在特定的 Raid 设备卷中的分区上, 需要预加载指定 Raid 驱动等等.总之这个环境主要用于真正用户 OS 启动之前的准备.

通常在各个发行版本都有各自的 initrd 的构建工具,各自的目的呢, 也仅限于我们上述提到的功能. 而我们是需要将整个 OS 塞到这个内存镜像中,所以稍微还是有区别,调研了下一些业界的实现, 这里的几个链接供参考:

上述链接可以看到, 一般是使用 https://virt-manager.org/和http://libguestfs.org/ 这两个项目的工具来构建镜像.可以尝试下这个方法, 完全可行, 但是有个问题是这个流程真的太长了, 比如要按上述流程构建的话, 需要用virt-install完整安装一遍目标 OS
, 继续用virt-sysprep对镜像做一遍清理, 将生成的镜像导入到 virt-builder, 继续在 KVM 虚拟机中配置一遍 OS 默认信息, 然后就可以将镜像更新到 virt-builder 基础镜像中, 然后拿到其他地方使用, 比如 Ramdisk boot/Vagrant/OpenStack/Docker中使用.

- 阅读剩余部分 -

systemd是一个全新的init系统和系统管理器,兼容传统的基于SysV init系统的所有主要的Linux发行版。
systemd兼容SysV和LSB init脚本,它作为SysV init系统的直接替代品。
systemd是内核启动并保持PID 1的第一个进程,它是系统运行后的所有进程的的父进程,Fedora 15是第一个支持systemd发行版。

systemctl是用于管理systemd守护程序/服务命令行实用程序和主要工具,例如(start, restart, stop, enable, disable, reload & status)。
systemd使用.service文件而不是bash脚本(SysV init使用)。systemd将所有守护进程排序到他们自己的Linux cgroup中,你可以通过搜索/cgroup/systemd文件来查看系统层次结构。

- 阅读剩余部分 -