# 安全性和隔离性
- [安全性和隔离性](#安全性和隔离性)
    - [user namespace多对多](#user-namespace多对多)
    - [用户权限控制](#用户权限控制)
    - [proc文件系统隔离（lxcfs）](#proc文件系统隔离（lxcfs）)


## user-namespace多对多

### 功能描述

user namespace是将容器的root映射到主机的普通用户，使得容器中的进程和用户在容器里有特权，但是在主机上就是普通权限，防止容器中的进程逃逸到主机上，进行非法操作。更进一步，使用user namespace技术后，容器和主机使用不同的uid和gid，保证容器内部的用户资源和主机资源进行隔离，例如文件描述符等。

系统容器支持通过--user-remap接口参数将不同容器的user namespace映射到宿主机不同的user namespace，实现容器user namespace隔离。

### 参数说明

<a name="zh-cn_topic_0182200842_table1869210387418"></a>
<table><thead align="left"><tr id="zh-cn_topic_0182200842_row1569373816419"><th class="cellrowborder" valign="top" width="19.98%" id="mcps1.1.4.1.1"><p id="zh-cn_topic_0182200842_p106936387415"><a name="zh-cn_topic_0182200842_p106936387415"></a><a name="zh-cn_topic_0182200842_p106936387415"></a>命令</p>
</th>
<th class="cellrowborder" valign="top" width="19.36%" id="mcps1.1.4.1.2"><p id="zh-cn_topic_0182200842_p15693173814112"><a name="zh-cn_topic_0182200842_p15693173814112"></a><a name="zh-cn_topic_0182200842_p15693173814112"></a>参数</p>
</th>
<th class="cellrowborder" valign="top" width="60.660000000000004%" id="mcps1.1.4.1.3"><p id="zh-cn_topic_0182200842_p18217181119202"><a name="zh-cn_topic_0182200842_p18217181119202"></a><a name="zh-cn_topic_0182200842_p18217181119202"></a>参数指定值说明</p>
</th>
</tr>
</thead>
<tbody><tr id="zh-cn_topic_0182200842_row12693163810415"><td class="cellrowborder" valign="top" width="19.98%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182200842_p66931838134110"><a name="zh-cn_topic_0182200842_p66931838134110"></a><a name="zh-cn_topic_0182200842_p66931838134110"></a>isula create/run</p>
</td>
<td class="cellrowborder" valign="top" width="19.36%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182200842_p08101647154218"><a name="zh-cn_topic_0182200842_p08101647154218"></a><a name="zh-cn_topic_0182200842_p08101647154218"></a>--user-remap</p>
</td>
<td class="cellrowborder" valign="top" width="60.660000000000004%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182200842_p5810124718426"><a name="zh-cn_topic_0182200842_p5810124718426"></a><a name="zh-cn_topic_0182200842_p5810124718426"></a>参数格式为&lt;uid&gt;:&lt;gid&gt;:&lt;offset&gt;，参数说明如下：</p>
<a name="zh-cn_topic_0182200842_ul13732312203"></a><a name="zh-cn_topic_0182200842_ul13732312203"></a><ul id="zh-cn_topic_0182200842_ul13732312203"><li>uid、gid为整数型，且必须大于等于0。</li><li>offset为整数型，且必须大于0，并且小于65536。取值不能太小，否则容器无法启动。</li><li>uid加上offset的值必须小于等于2<sup id="zh-cn_topic_0182200842_sup1238617401203"><a name="zh-cn_topic_0182200842_sup1238617401203"></a><a name="zh-cn_topic_0182200842_sup1238617401203"></a>32</sup>-1，gid加上offset的值必须小于等于2<sup id="zh-cn_topic_0182200842_sup1952419166211"><a name="zh-cn_topic_0182200842_sup1952419166211"></a><a name="zh-cn_topic_0182200842_sup1952419166211"></a>32</sup>-1，否则容器启动会报错。</li></ul>
</td>
</tr>
</tbody>
</table>

### 约束限制

-   如果系统容器指定了--user-remap，那么rootfs目录必须能够被--user-remap指定的uid/gid用户所访问，否则会导致容器user  namespace无法访问rootfs，容器启动失败。
-   容器内所有的id都应该能映射到主机rootfs，某些目录/文件可能是从主机mount到容器，比如/dev/pts目录下面的设备文件，如果offset值太小可能会导致mount失败。
-   uid、gid和offset的值由上层调度平台控制，容器引擎只做合法性检查。
-   --user-remap只适用于系统容器。
-   --user-remap和--privileged不能共存，否则容器启动会报错。
-   如果uid或gid指定为0，则--user-remap参数不生效。

### 使用指导

>![](public_sys-resources/icon-note.gif) **说明：**   
>指定--user-remap参数前，请先将rootfs下所有目录和文件的uid和gid做整体偏移，偏移量为--user-remap指定uid和gid的偏移量。  
>例如将dev目录的uid和gid整体uid和gid偏移100000的参考命令为：  
>chown 100000:100000 dev  

系统容器启动指定--user-remap参数：

```
[root@localhost ~]# isula run -tid --user-remap 100000:100000:65535 --system-container --external-rootfs /home/root-fs none /sbin/init
eb9605b3b56dfae9e0b696a729d5e1805af900af6ce24428fde63f3b0a443f4a
```

分别在宿主机和容器内查看/sbin/init进程信息：

```
[root@localhost ~]# isula exec eb ps aux | grep /sbin/init
root         1  0.6  0.0  21624  9624 ?        Ss   15:47   0:00 /sbin/init
[root@localhost ~]# ps aux | grep /sbin/init
100000    4861  0.5  0.0  21624  9624 ?        Ss   15:47   0:00 /sbin/init
root      4948  0.0  0.0 213032   808 pts/0    S+   15:48   0:00 grep --color=auto /sbin/init
```

可以看到/sbin/init进程在容器内的owner是root用户，但是在宿主机的owner是uid=100000这个用户。

在容器内创建一个文件，然后在宿主机上查看文件的owner：

```
[root@localhost ~]# isula exec -it eb bash
[root@localhost /]# echo test123 >> /test123
[root@localhost /]# exit
exit
[root@localhost ~]# ll /home/root-fs/test123
-rw-------. 1 100000 100000 8 Aug  2 15:52 /home/root-fs/test123
```

可以看到，在容器内生成了一个文件，它的owner是root，但是在宿主机上看到的owner是id=100000这个用户。

## 用户权限控制

### 功能描述

容器引擎支持通过TLS认证方式来认证用户的身份，并依此控制用户的权限，当前容器引擎可以对接authz插件实现权限控制。

### 接口说明

通过配置iSulad容器引擎启动参数来指定权限控制插件，daemon配置文件默认为/etc/isulad/daemon.json。

<a name="zh-cn_topic_0182200843_table19691237182514"></a>
<table><thead align="left"><tr id="zh-cn_topic_0182200843_row3969103710257"><th class="cellrowborder" valign="top" width="24.779999999999998%" id="mcps1.1.4.1.1"><p id="zh-cn_topic_0182200843_p1996983712519"><a name="zh-cn_topic_0182200843_p1996983712519"></a><a name="zh-cn_topic_0182200843_p1996983712519"></a>配置参数</p>
</th>
<th class="cellrowborder" valign="top" width="43.47%" id="mcps1.1.4.1.2"><p id="zh-cn_topic_0182200843_p197083782512"><a name="zh-cn_topic_0182200843_p197083782512"></a><a name="zh-cn_topic_0182200843_p197083782512"></a>示例</p>
</th>
<th class="cellrowborder" valign="top" width="31.75%" id="mcps1.1.4.1.3"><p id="zh-cn_topic_0182200843_p163741918172615"><a name="zh-cn_topic_0182200843_p163741918172615"></a><a name="zh-cn_topic_0182200843_p163741918172615"></a>说明</p>
</th>
</tr>
</thead>
<tbody><tr id="zh-cn_topic_0182200843_row169701737132511"><td class="cellrowborder" valign="top" width="24.779999999999998%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182200843_p313573395910"><a name="zh-cn_topic_0182200843_p313573395910"></a><a name="zh-cn_topic_0182200843_p313573395910"></a>--authorization-plugin</p>
</td>
<td class="cellrowborder" valign="top" width="43.47%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182200843_p1318314512594"><a name="zh-cn_topic_0182200843_p1318314512594"></a><a name="zh-cn_topic_0182200843_p1318314512594"></a>"authorization-plugin":  "authz-broker"</p>
</td>
<td class="cellrowborder" valign="top" width="31.75%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182200843_p19601904015"><a name="zh-cn_topic_0182200843_p19601904015"></a><a name="zh-cn_topic_0182200843_p19601904015"></a>用户权限认证插件，当前只支持authz-broker。</p>
</td>
</tr>
</tbody>
</table>

### 约束限制

-   authz需要配置用户权限策略，策略文件默认为/var/lib/authz-broker/policy.json，该配置文件支持动态修改，修改完即时生效，不需要重启插件服务。
-   由于容器引擎为root用户启动，放开一般用户使用的一些命令可能会导致该用户不当获得过大权限，需谨慎配置。目前container\_attach、container\_create和container\_exec\_create动作可能会有风险。
-   对于某些复合操作，比如isula exec、isula attach等命令依赖isula inspect是否有权限，如果用户没有inspect权限会直接报错。
-   采用SSL/TLS 加密通道在增加安全性的同时也会带来性能损耗，如增加延时，消耗较多的CPU资源，除了数据传输外，加解密需要更大吞吐量，因此在并发场景下，相比非TLS通信，其并发量有一定程度上的下降。经实测，在ARM服务器（Cortex-A72 64核）接近空载情况下，采用TLS并发起容器，其最大并发量在200\~250范围内。
-   服务端指定--tlsverify时，认证文件默认配置路径为/etc/isulad。且默认文件名分别为ca.pem、cert.pem、key.pem。

### 使用示例

1.  确认宿主机安装了authz插件，如果需要安装，安装并启动authz插件服务命令如下：

    ```
    [root@localhost ~]# yum install authz
    [root@localhost ~]# systemctl start authz
    ```

2.  要启动该功能，首先需要配置容器引擎和用户的TLS证书。可以使用OPENSSL来生成需要的证书，具体步骤如下：

    ```
    #SERVERSIDE
     
    # Generate CA key
    openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "ca-key.pem" 4096
    # Generate CA
    openssl req -new -x509 -days $VALIDITY -key "ca-key.pem" -sha256 -out "ca.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"
    # Generate Server key
    openssl genrsa -out "server-key.pem" 4096
     
    # Generate Server Certs.
    openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "server-key.pem" -out server.csr
     
    echo "subjectAltName = DNS:localhost,IP:127.0.0.1" > extfile.cnf
    echo "extendedKeyUsage = serverAuth" >> extfile.cnf
     
    openssl x509 -req -days $VALIDITY -sha256 -in server.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "server-cert.pem" -extfile extfile.cnf
     
    #CLIENTSIDE
     
    openssl genrsa -out "key.pem" 4096
    openssl req -subj "/CN=$CLIENT_NAME" -new -key "key.pem" -out client.csr
    echo "extendedKeyUsage = clientAuth" > extfile.cnf
    openssl x509 -req -days $VALIDITY -sha256 -in client.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "cert.pem" -extfile extfile.cnf
    ```

    若要直接使用以上过程作为脚本，需替换各变量为配置数值。生成CA时使用的参数若为空则写为“''”。PASSWORD、COMMON\_NAME、CLIENT\_NAME、VALIDITY为必选项。

3.  容器引擎启动时添加TLS相关参数和认证插件相关参数，并保证认证插件的运行。此外，为了使用TLS认证，容器引擎必须使用TCP侦听的方式启动，不能使用传统的unix socket的方式启动。容器demon端配置如下：

    ```
    {
        "tls": true,
        "tls-verify": true,
        "tls-config": {
               "CAFile": "/root/.iSulad/ca.pem",
               "CertFile": "/root/.iSulad/server-cert.pem",
               "KeyFile":"/root/.iSulad/server-key.pem"
        },
        "authorization-plugin": "authz-broker"
    }
    ```

4.  然后需要配置策略，对于基本授权流程，所有策略都位于一个配置文件下/var/lib/authz-broker/policy.json。该配置文件支持动态修改，更改时不需要重新启动插件，只需要向authz进程发送SIGHUP信号。文件格式是每行一个策略JSON对象。每行只有一个匹配。具体的策略配置示例如下：

    -   所有用户都可以运行所有iSulad命令：\{"name":"policy\_0","users":\[""\],"actions":\[""\]\}。
    -   Alice可以运行所有iSulad命令：\{"name":"policy\_1","users":\["alice"\],"actions":\[""\]\}。
    -   空用户都可以运行所有iSulad命令： \{"name":"policy\_2","users":\[""\],"actions":\[""\]\}。
    -   Alice和Bob可以创建新的容器：\{"name":"policy\_3","users":\["alice","bob"\],"actions":\["container\_create"\]\}。
    -   service\_account可以读取日志并运行docker top：\{"name":"policy\_4","users":\["service\_account"\],"actions":\["container\_logs","container\_top"\]\}。
    -   Alice可以执行任何container操作：\{"name":"policy\_5","users":\["alice"\],"actions":\["container"\]\}。
    -   Alice可以执行任何container操作，但请求的种类只能是get：\{"name":"policy\_5","users":\["alice"\],"actions":\["container"\], "readonly":true \}。

    >![](public_sys-resources/icon-note.gif) **说明：**   
    >-   配置中匹配action支持正则表达式。  
    >-   users不支持正则表达式。  
    >-   users不能有重复用户，即同一用户不能被多条规则匹配。  

5.  配置并更新完之后，客户端配置TLS参数连接容器引擎，即是以受限的权限访问。

    ```
    [root@localhost ~]#  isula version --tlsverify --tlscacert=/root/.iSulad/ca.pem --tlscert=/root/.iSulad/cert.pem --tlskey=/root/.iSulad/key.pem  -H=tcp://127.0.0.1:2375
    ```

    如果想默认配置TLS认证进行客户端连接，可以将文件移动到\~/.iSulad，并设置 ISULAD\_HOST和ISULAD\_TLS\_VERIFY变量（而不是每次调用时传递 -H=tcp://$HOST:2375和--tlsverify）。

    ```
    [root@localhost ~]# mkdir -pv ~/.iSulad
    [root@localhost ~]# cp -v {ca,cert,key}.pem ~/.iSulad 
    [root@localhost ~]# export ISULAD_HOST=localhost:2375 ISULAD_TLS_VERIFY=1
    [root@localhost ~]# isula version
    ```


## proc文件系统隔离（lxcfs）

### 场景描述

容器虚拟化带来轻量高效，快速部署的同时，也因其隔离性不够彻底，给用户带来一定程度的使用不便。由于Linux内核namespace本身还不够完善，因此容器在隔离性方面也存在一些缺陷。例如，在容器内部proc文件系统中可以看到宿主机上的proc信息（如meminfo,  cpuinfo，stat， uptime等）。利用lxcfs工具可以将容器内的看到宿主机/proc文件系统的内容，替换成本容器实例的相关/proc内容，以便容器内业务获取正确的资源数值。

### 接口说明

系统容器对外提供两个工具包：一个是lxcfs软件，另外一个是配合lxcfs一起使用的lxcfs-tools工具。其中lxcfs作为宿主机daemon进程常驻，lxcfs-tools通过hook机制将宿主机的lxcfs文件系统绑定挂载到容器。

lxcfs-tools命令行格式如下：

```
lxcfs-tools [OPTIONS] COMMAND [COMMAND_OPTIONS]
```

<a name="zh-cn_topic_0182200844_table1869210387418"></a>
<table><thead align="left"><tr id="zh-cn_topic_0182200844_row1569373816419"><th class="cellrowborder" valign="top" width="20.349999999999998%" id="mcps1.1.4.1.1"><p id="zh-cn_topic_0182200844_p106936387415"><a name="zh-cn_topic_0182200844_p106936387415"></a><a name="zh-cn_topic_0182200844_p106936387415"></a>命令</p>
</th>
<th class="cellrowborder" valign="top" width="33.410000000000004%" id="mcps1.1.4.1.2"><p id="zh-cn_topic_0182200844_p43193341215"><a name="zh-cn_topic_0182200844_p43193341215"></a><a name="zh-cn_topic_0182200844_p43193341215"></a>功能说明</p>
</th>
<th class="cellrowborder" valign="top" width="46.239999999999995%" id="mcps1.1.4.1.3"><p id="zh-cn_topic_0182200844_p15693173814112"><a name="zh-cn_topic_0182200844_p15693173814112"></a><a name="zh-cn_topic_0182200844_p15693173814112"></a>参数</p>
</th>
</tr>
</thead>
<tbody><tr id="zh-cn_topic_0182200844_row12693163810415"><td class="cellrowborder" valign="top" width="20.349999999999998%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182200844_p66931838134110"><a name="zh-cn_topic_0182200844_p66931838134110"></a><a name="zh-cn_topic_0182200844_p66931838134110"></a>remount</p>
</td>
<td class="cellrowborder" valign="top" width="33.410000000000004%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182200844_p811074612115"><a name="zh-cn_topic_0182200844_p811074612115"></a><a name="zh-cn_topic_0182200844_p811074612115"></a>将lxcfs重新mount到容器中</p>
</td>
<td class="cellrowborder" valign="top" width="46.239999999999995%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182200844_p1273811584599"><a name="zh-cn_topic_0182200844_p1273811584599"></a><a name="zh-cn_topic_0182200844_p1273811584599"></a>--all：对所有的容器执行remout  lxcfs操作</p>
<p id="zh-cn_topic_0182200844_p8738358165912"><a name="zh-cn_topic_0182200844_p8738358165912"></a><a name="zh-cn_topic_0182200844_p8738358165912"></a>--container-id：remount  lxcfs到特定的容器ID</p>
</td>
</tr>
<tr id="zh-cn_topic_0182200844_row12634059013"><td class="cellrowborder" valign="top" width="20.349999999999998%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182200844_p9635951805"><a name="zh-cn_topic_0182200844_p9635951805"></a><a name="zh-cn_topic_0182200844_p9635951805"></a>umount</p>
</td>
<td class="cellrowborder" valign="top" width="33.410000000000004%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182200844_p4389165412117"><a name="zh-cn_topic_0182200844_p4389165412117"></a><a name="zh-cn_topic_0182200844_p4389165412117"></a>将lxcfs从容器中umount掉</p>
</td>
<td class="cellrowborder" valign="top" width="46.239999999999995%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182200844_p112881622103"><a name="zh-cn_topic_0182200844_p112881622103"></a><a name="zh-cn_topic_0182200844_p112881622103"></a>--all：对所有的容器执行umout  lxcfs操作</p>
<p id="zh-cn_topic_0182200844_p3288172210011"><a name="zh-cn_topic_0182200844_p3288172210011"></a><a name="zh-cn_topic_0182200844_p3288172210011"></a>--container-id：对特定容器执行umount  lxcfs操作</p>
</td>
</tr>
<tr id="zh-cn_topic_0182200844_row915811441301"><td class="cellrowborder" valign="top" width="20.349999999999998%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182200844_p166420541409"><a name="zh-cn_topic_0182200844_p166420541409"></a><a name="zh-cn_topic_0182200844_p166420541409"></a>check-lxcfs</p>
</td>
<td class="cellrowborder" valign="top" width="33.410000000000004%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182200844_p143691559811"><a name="zh-cn_topic_0182200844_p143691559811"></a><a name="zh-cn_topic_0182200844_p143691559811"></a>检查lxcfs服务是否运行</p>
</td>
<td class="cellrowborder" valign="top" width="46.239999999999995%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182200844_p1329712815118"><a name="zh-cn_topic_0182200844_p1329712815118"></a><a name="zh-cn_topic_0182200844_p1329712815118"></a>无</p>
</td>
</tr>
<tr id="zh-cn_topic_0182200844_row17443144712014"><td class="cellrowborder" valign="top" width="20.349999999999998%" headers="mcps1.1.4.1.1 "><p id="zh-cn_topic_0182200844_p1946512581606"><a name="zh-cn_topic_0182200844_p1946512581606"></a><a name="zh-cn_topic_0182200844_p1946512581606"></a>prestart</p>
</td>
<td class="cellrowborder" valign="top" width="33.410000000000004%" headers="mcps1.1.4.1.2 "><p id="zh-cn_topic_0182200844_p77340320217"><a name="zh-cn_topic_0182200844_p77340320217"></a><a name="zh-cn_topic_0182200844_p77340320217"></a>在lxcfs服务启动前将/var/lib/lxcfs目录mount到容器中</p>
</td>
<td class="cellrowborder" valign="top" width="46.239999999999995%" headers="mcps1.1.4.1.3 "><p id="zh-cn_topic_0182200844_p25281515315"><a name="zh-cn_topic_0182200844_p25281515315"></a><a name="zh-cn_topic_0182200844_p25281515315"></a>无</p>
</td>
</tr>
</tbody>
</table>

### 约束限制

-   当前只支持proc文件系统下的cpuinfo,  meminfo, stat, diskstats,  partitions，swaps和uptime文件，其他的文件和其他内核API文件系统（比如sysfs）未做隔离 。
-   安装rpm包后会在/var/lib/isulad/hooks/hookspec.json生成样例json文件，用户如果需要增加日志功能，需要在定制时加入--log配置。
-   diskstats只能显示支持cfq调度的磁盘信息，无法显示分区信息。容器内设备会被显示为/dev目录下的名字。若不存在则为空。此外，容器根目录所在设备会被显示为sda。
-   挂载lxcfs时必须使用slave参数。若使用shared参数，可能会导致容器内挂载点泄露到主机，影响主机运行 。
-   lxcfs支持服务优雅降级使用，若lxcfs服务crash或者不可用，容器内查看到的cpuinfo,  meminfo, stat, diskstats, partitions, swaps和uptime均为host信息，容器其它业务功能不受影响。
-   lxcfs底层依赖fuse内核模块以及libfuse库，因此需要内核支持fuse。
-   lxcfs当前仅支持容器内运行64位的app，如果容器内运行32位的app可能会导致app读取到的cpuinfo信息不符合预期。
-   lxcfs只是对容器cgroup进行资源视图模拟，对于容器内的系统调用（例如sysconf）获取到的仍然是主机的信息，lxcfs无法做到内核隔离。
-   lxcfs使用隔离后的cpuinfo显示的cpu信息具有如下特征：
    -   processor：从0开始依次递增。
    -   physical  id：从0开始依次递增。
    -   sibliing：固定为1。
    -   core  id：固定为0。
    -   cpu  cores：固定为1。


### 使用示例

1.  首先需要安装lxcfs和lxcfs-tools这两个包，并启动lxcfs服务。

    ```
    [root@localhost ~]# yum install lxcfs lxcfs-tools 
    [root@localhost ~]# systemctl start lxcfs
    ```

2.  容器启动完成之后查看容器内是否存在lxcfs挂载点。

    ```
    [root@localhost ~]# isula run -tid -v /var/lib/lxc:/var/lib/lxc --hook-spec /var/lib/isulad/hooks/hookspec.json --system-container --external-rootfs /home/root-fs none init
    a8acea9fea1337d9fd8270f41c1a3de5bceb77966e03751346576716eefa9782
    [root@localhost ~]# isula exec a8 mount | grep lxcfs
    lxcfs on /var/lib/lxc/lxcfs type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    lxcfs on /proc/cpuinfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    lxcfs on /proc/diskstats type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    lxcfs on /proc/meminfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    lxcfs on /proc/partitions type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    lxcfs on /proc/stat type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    lxcfs on /proc/swaps type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    lxcfs on /proc/uptime type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
    ```

3.  执行update命令更新容器的cpu和mem资源配置，然后查看容器资源。根据如下回显可知，容器资源视图显示的是容器真实资源数据而不是宿主机的数据。

    ```
    [root@localhost ~]# isula update --cpuset-cpus 0-1 --memory 1G a8
    a8
    [root@localhost ~]# isula exec a8 cat /proc/cpuinfo
    processor       : 0
    BogoMIPS        : 100.00
    cpu MHz         : 2400.000
    Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
    CPU implementer : 0x41
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0xd08
    CPU revision    : 2
    
    processor       : 1
    BogoMIPS        : 100.00
    cpu MHz         : 2400.000
    Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
    CPU implementer : 0x41
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0xd08
    CPU revision    : 2
    
    [root@localhost ~]# isula exec a8 free -m
                  total        used        free      shared  buff/cache   available
    Mem:           1024          17         997           7           8        1006
    Swap:          4095           0        4095
    ```


