container的分类

目前container可以分为两大类,一类是Privileged container,一类是Unprivileged container。

Privileged container内部的root跟container外部的root是同一个用户(也就是UID都是0),如果在Privileged container中创建文件(比如在--bind的目录中创建文件),那么该文件在Host中的UID跟Container中的UID一样。这样可以做到与Host权限一一对应,某些情况下比较方便。

Unprivileged container内部的UID 0用户其实是被映射到了container外部的某个unprivileged用户,这是通过user namespace来实现的,如果在Unprivileged container中创建文件,那么该文件在Host中的UID跟Container中的不一样,而是没有对应用户的一串数字(实际上Host可以指定一个有用户的UID来作为Container的指定UID)。这样可以保证当container被攻破时,Host仍然安全。

systemd-nspawn的默认情况

systemd-nspawn分两种情况。

  • systemd-nspawn直接启动
  • 通过systemd-nspawn@.service模板启动,即machinectl

两种方式启动时默认选项不同。

通过systemd-nspawn@.service模板启动:

  • 默认使用-b,--boot方式启动。
  • 默认使用 Unprivileged container 选项-U
  • 默认使用-n,--network-veth网络配置。
  • 默认使用 -j,--link-journal=try-guest日志配置。

systemd-nspawn@.service模板默认设置可以通过.nspawn配置文件覆盖掉。

machinectl

尝试了一下machinectl命令,差点以为把好不容易装好的centos7容器给搞坏了。注意:machinectl都是基于 systemd-nspawn@.service 模版启动的。

常用命令:

  • machinectl start <machine_name>:启动容器
  • machinectl stop <machine_name>:关闭容器
  • machinectl login <machine_name>:显示登录界面
  • machinectl enable/diable <machine_name>:是否以systemd-nspawn@.service方式开机启动

优先在 /var/lib/machines/ 目录中搜索, 但是也会在 /usr/local/lib/machines//usr/lib/machines/ 目录中搜索镜像, 出于兼容性原因,还会在 /var/lib/container/ 中搜索镜像。

模板文件搜索规则

模板文件xxx.nspawn

  • 如果在 /etc/systemd/nspawn//run/systemd/nspawn/ 目录中找到了对应的配置文件, 那么将会应用其中的全部配置(但依然有可能会被命令行上的设置所覆盖), 同时将会停止进一步的搜索。
  • 如果没有找到对应的配置文件, 那么将会进一步在容器镜像文件的所在目录、或容器根目录的所在父目录中搜索。 如果找到了对应的配置文件,那么将会仅应用其中的非特权指令, 所有特权指令, 也就是有可能造成权限提升或者要求访问主机资源(例如主机的文件或目录)的配置指令, 都将被忽略

.nspawn文件语法可以参考man

systemd-nspawn容器网络配置

-n,--network-veth配置方法:

  • Host运行systemd-networkd.service,此时Host端无ip。之后和container运行,此时Host端会自动配置ip。
  • container端配置ip地址,可以使用任何方式配置,比如ip addr add或者nmtui或者使用systemd-networkd
  • 确定Host内核开启ip转发功能。
  • 确定Host端FORWARD链规则是否默认DROP。如果是,添加ACCEPT规则,可以参考Archwiki。
  • 确定Host端iptables为ve-enth网卡开启dhcp端口(67,68),否则Host无法为container自动分配地址。

systemd-networkd.service(8) 默认包含 /usr/lib/systemd/network/80-container-ve.network, 此文件匹配所有通过该选项创建的虚拟以太网连接的宿主端接口, 此文件不但为这些接口启用了 DHCP 功能,而且还为这些接口设置了通向宿主机外部网络的路由(从而可以连通外网)。 该服务还默认包含 /usr/lib/systemd/network/80-container-host0.network , 此文件匹配所有通过该选项创建的虚拟以太网连接的容器端接口,并且为这些接口启用了 DHCP 功能。 如果在宿主与容器内同时运行了 systemd-networkd 服务, 那么无须额外的配置,即可自动实现在容器与宿主之间进行 IP 通信, 并且可以连接到外部网络。

撤销Unprivileged container造成的权限问题

撤销 --private-users-chown (或 -U) 造成的影响,可以通过将容器的 UID/GIU 起点重置为"0"来实现:

systemd-nspawn … --private-users=0 --private-users-chown

systemd-nspawn以及container的学习的更多相关文章

  1. systemd 编写服务管理脚本---学习

    转载:https://www.cnblogs.com/sparkdev/p/8521812.html 我们运行 linux 服务器的主要目的是通过运行程序提供服务,比如 mysql.web serve ...

  2. blfs(systemd版本)学习笔记-总页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemd版本)学习笔记:https://www.cnblogs.com/renren-study-notes/p/ ...

  3. lfs(systemd版本)学习笔记-第1页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...

  4. docker学习笔记(3)- 镜像

    简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...

  5. blfs(systemv版本)学习笔记-总页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemv版本)学习笔记:https://www.cnblogs.com/renren-study-notes/p/ ...

  6. lfs(systemv版本)学习笔记-第1页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...

  7. systemd初始化进程(转)

    Systemd初始化进程 Linux操作系统开机过程首先从BIOS开始→进入"Boot Loader"→加载内核→内核的初始化→启动初始化进程,初始化进程作为系统第一个进程,它需要 ...

  8. Kata Container 介绍

    docker容器,性能高,不安全:VM虚拟机,安全性好,性能损耗大:Kata Container轻量级虚拟机的容器,即安全,性能也高. 开源容器项目Kata Containers,旨在将虚拟机(VM) ...

  9. Docker系列03—Docker 基础入门

    本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...

随机推荐

  1. P7597 「EZEC-8」猜树 加强版

    #include<bits/stdc++.h>using namespace std;#define rg register#define inf 0x3f3f3f3f#define ll ...

  2. PHP-设计模式之-中介者模式

    <?php//中介者模式 -- //抽象中介者abstract class UnitedNationa{ punlic abstract function Declared($message,c ...

  3. 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 百篇博客分析OpenHarmony源码 | v19.03

    百篇博客系列篇.本篇为: v19.xx 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 51.c.h .o 先看四个宏定义,进程和线程(线程就是任务)最高和最低优先级定义,[0,31]区间 ...

  4. P4001-[ICPC-Beijing 2006]狼抓兔子【对偶图】

    正题 题目链接:https://www.luogu.com.cn/problem/P4001 题目大意 给出一个类似于 的网格图,求起点到终点的最小割. 解题思路 最小割直接跑网络流,然后发现\(di ...

  5. mysql的一次意外

    打开navcat连接本地mysql数据库的时候说mysql服务无法连接,切换到cmd用命令行来启动报错,发生系统错误5,查看百度,需用管理员权限运行, 用管理员运行依旧不好使 C:\WINDOWS\s ...

  6. 这两个基础seo插件,wordpress网站必装

    WordPress对搜索引擎非常友好,这一点很多人都知道.不过我们在制作完成WordPress主题后,还可以在原来的良好基础上,添加两个队seo非常有利的WordPress插件. 第一个插件:Baid ...

  7. 使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查

    目录 1. gitlab-ci.yml的配置 1.1 几个基本概念 1.2 使用CI进行代码检查demo 2. Sonarqube安装和配置 2.1 Sonarqube安装 2.2 数据库配置 2.3 ...

  8. 暑期 2021 | Serverless Devs 最全项目申请攻略来啦!

    Serverless 是近年来云计算领域热门话题,凭借极致弹性.按量付费.降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域.但是随着时间的发展,Serverles ...

  9. 从单体迈向 Serverless 的避坑指南

    作者 | 不瞋 导读:用户需求和云的发展两条线推动了云原生技术的兴起.发展和大规模应用.本文将主要讨论什么是云原生应用,构成云原生应用的要素是什么,什么是 Serverless 计算,以及 Serve ...

  10. Java秘诀!零基础怎样快速学习Java?

    对于零基础想学Java的朋友,其实一开始最应该做的就是定好学习目标和端正学习态度,切记不要三天打鱼两天晒网! 首先你是零基础,现在急需把Java学好,在保证学习质量的同时,用最短的时间学好Java应该 ...