Archlinux创建Debian/Ubuntu的systemd-nspawn容器是很简单的,因为有debootstrap软件。某天我突然想装个centos7玩玩,搜了半天没发现有什么类似于debootstrap的软件。然而,我找到了基于centos的chroot的创建教程,感觉可以试一试。

Chroot创建过程

新建一个chroot的目录,例如:

mkdir -p /path/to/chroot

初始化rpm数据库:

mkdir -p /path/to/chroot/var/lib/rpm
rpm --rebuilddb --root=/path/to/chroot

下载CentOS的发行包,使用rpm命令安装:

wget http://mirror.centos.org/centos/<版本号>/os/x86_64/Packages/centos-release-<对应版本>.rpm
rpm -i --root=/path/to/chroot --nodeps centos-release-<对应版本>.rpm

使用YUM工具安装CentOS发行版的其余包:

yum --installroot=/path/to/chroot install -y rpm-build yum

最后,整个过程结束以后,chroot环境便搭建完成。


动手实践

Archlinux上安装yum工具有点困难,AUR上的yum安装总是出错。偶然间发现debian系统源里自带yum包,便想了个曲线救国的办法:

  1. 使用debootstrap创建debian系统容器

    直接pacman -S debootstrap,然后debootstrap --arch=amd64 <debian版本代号> 目标目录 <软件源地址>,我用的是清华的源。

  2. 将centos的目录通过--bind挂载到debian容器中。

    通过命令systemd-nspawn -bD debian9/ --bind=/absolute/path/centos,挂载centos的目录。

  3. 在debian容器中安装yum:

    通过apt安装yum,别忘了在/etc/yum.repos.d中配置yum源。我使用的是还是清华的源。注意把关于gpg的选项注释掉。

  4. 按照上面的步骤安装centos的chroot环境

    注意使用root权限。

安装时会不时报以下错误:

Failed to get D-Bus connection: Operation not permitted

不知道什么问题。百度了一下好像docker安装centos7也会出现。因为没有研究过docker,暂时忽略该错误。


之后

大功告成了吗?实际上并没有那么简单。使用systemd-nspawn -D进去,空空如也,连$PS1都没有,好多基本命令也没装,比如passwd。密码都没法改,那还怎么玩?继续搞吧!

  • 更改yum源(刚才是debian中的源,现在修改的容器中的)
  • 安装passwd和vim以及常用的软件,修改root密码,把/etc/skel/中的东西复制到root目录下。
  • systemd-nspawn -bD centos7

终于启动了!然而你尝试登录就会发现,不管怎么尝试,root密码都提示是错的!真头疼。。Ctrl+]三下退出,然后去掉-b选项再次进入centos7,执行journalctl会发现类似于这种的错误:

...
pam_securetty(login:auth): access denied: tty 'pts/0' is not secure !
...

系统把root用户给deny掉了,原因是使用的终端不安全!解决的方法就是在/etc/securetty中添加一行pts/0。再次尝试启动,这次终于可以进到系统里面了。。然而启动时会遇到这个错误:

...
[FAILED] Failed to start Login Service.
See 'systemctl status systemd-logind.service' for details.
...

查看journalctl里面还有dbus的问题:

...
Failed to connect to system bus: No such file or directory
Failed to initialize D-Bus connection: No such file or directory
...

搜了半天,找到原因是/var/run没有链接到/run目录,链接目录以后,login service 和 dbus 的错误也都消失了。

另外,启动容器时开头会出现display-manager.service的错误,这是因为没有安装桌面环境的问题,只要将默认启动级别更换systemctl set-default multi-user.target即可解决。还有一个错误是:Failed to install release agent, ignoring: No such file or directory,Google了一下好像跟systemd版本有关系,不影响系统运行。Centos真麻烦,感觉Debian系统还是省事,一个debootstrap就搞定了。以后有时间继续探索。

折腾systemd-nspawn运行centos7的更多相关文章

  1. Demo+在Linux下运行(CentOS7+dotnetcore sdk)

    来份ASP.NET Core尝尝 0x01.前言 学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是 略懂一二.如果有错误,还望见谅. 本文还是和之 ...

  2. systemd的运行级别与服务管理命令简介

    从很久很久以前我们就在使用静态运行级别.而systemd提供了更为动态灵活的机制,来管控你的系统. 在开始介绍systemd命令前,让我们先简单的回顾一下历史.在Linux世界里,有一个很奇怪的现象, ...

  3. linux 服务开机自启动systemd方式 (Centos7)

    linux 服务开机自启动systemd方式 (Centos7) 1.编写一个 /opt/hello.sh 脚本 [root@jws-ftp prometheus]# cat /opt/hello.s ...

  4. .NET Worker Service 部署到 Linux 作为 Systemd Service 运行

    上一篇文章我们了解了如何将.NET Worker Service 作为 Windows 服务运行,今天我接着介绍一下如何将 Worker Service 部署到 Linux 上,并作为 Systemd ...

  5. 折腾一天安装Centos7,以及后面恢复Win7引导的曲折历程

    一.下载centos 7 livecd iso 访问镜像网站,http://mirrors.aliyun.com/centos/7.0.1406/isos/x86_64/ 或者直接下载:http:// ...

  6. python 安装成linux中的systemd守护运行

    参考文档1:https://blog.csdn.net/luckytanggu/article/details/53467687 参考文档2:https://www.jianshu.com/p/e14 ...

  7. centos7 管理开机启动:systemd

    一.CentOS7 systemd 介绍 在 CentOS7 中,使用 systemd 来管理其他服务是否开机启动,systemctl 是 systemd 服务的命令行工具 [root@mysql ~ ...

  8. centos7 systemd 必知必会

    systemd 简介: systemd 是一个 Linux 系统基础组件的集合, 提供了一个系统和服务管理器, 运行为 PID 1 并负责启动其它程序 功能包括: 1.支持并行化任务 2.同时采用 s ...

  9. 操作系统—Systemd

    操作系统-Systemd 时间 2016-09-24 22:34:49  运维部落 原文  http://www.178linux.com/48990 主题 systemd Systemd 概述: C ...

随机推荐

  1. element-ui的Tree树组件使用技巧

    目录 1,前言 2,需求 3,解决思路 4,完整代码 5,总结 1,前言 最近这段时间在做一个新的模块,其中有一个三层的树结构,产品经理提出了一个很古怪的需求,整的我只能自己控制树的交互,写完之后,感 ...

  2. Web爬虫|入门实战之糗事百科(附源码)

    coding by real mind writing by genuine heart 解析 任务背景:https://www.qiushibaike.com/hot/   窥探网页细节:观察每一页 ...

  3. Windows下升级Python3.7.7后(原Python3.6.2版本)如何切换Python版本

    笔者:风起怨江南 出处:https://www.cnblogs.com/mengjinxiang 笔者原创,文章欢迎转载,如果喜欢请点赞+关注,谢谢! 问题:window系统下,如果升级了最新的Pyt ...

  4. Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式

    1. 前言 发送邮件,我们在平时工作中经用到,做为测试人员,在自动化测试中用的也比较多,需要发送邮件给某领导 SMTP是Python默认的邮件模块,可以发送纯文本.富文本.HTML 等格式的邮件 今天 ...

  5. IdentityServer4[3]:使用客户端认证控制API访问(客户端授权模式)

    使用客户端认证控制API访问(客户端授权模式) 场景描述 使用IdentityServer保护API的最基本场景. 我们定义一个API和要访问API的客户端.客户端从IdentityServer请求A ...

  6. 配置一个简单的传统SSM项目

    背景 我们知道,从2002年开始,Spring一直在飞速的发展,如今已经成为了在Java EE开发中的标准,早期的项目都是传统的Spring-SpringMVC-Mybatis项目,打成一个war包丢 ...

  7. 13万字详细分析JDK中Stream的实现原理

    前提 Stream是JDK1.8中首次引入的,距今已经过去了接近8年时间(JDK1.8正式版是2013年底发布的).Stream的引入一方面极大地简化了某些开发场景,另一方面也可能降低了编码的可读性( ...

  8. 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

    通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  9. 题解 [HNOI2016]大数

    题目传送门 题目大意 给出一个\(n\)个数的字符串,有\(m\)次查询,对于该串的子串\([l,r]\)有多少个子串满足是固定素数\(p\)的倍数. 思路 其实很简单,但是一开始想偏了...果然还是 ...

  10. NX7.5 使用UF_MODL_create_proj_curves创建投影曲线

    1 [DllImport("libufun.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet ...