无法打开“/root/CentOS-7-x86_64-Minimal-1611.iso”:权限被拒绝

无法打开“/root/CentOS-7-x86_64-Minimal-1611.iso”:权限被拒绝

尝试使用 virt-install 在 CentOS 7 主机上创建 CentOS 7 来宾虚拟机会生成以下错误:

Could not open '/root/CentOS-7-x86_64-Minimal-1611.iso': Permission denied

需要采取哪些具体步骤来解决此错误,以便能够成功安装 CentOS 7 来宾虚拟机?

详情如下所示:


重现错误的步骤:

首先,我iso从centos镜像下载了文件:

[root@remote-host ~]# wget http://centos.mbni.med.umich.edu/mirror/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso
--2017-03-13 12:52:53--  http://centos.mbni.med.umich.edu/mirror/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso
Resolving centos.mbni.med.umich.edu (centos.mbni.med.umich.edu)... 141.214.186.162
Connecting to centos.mbni.med.umich.edu (centos.mbni.med.umich.edu)|141.214.186.162|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 713031680 (680M) [application/octet-stream]
Saving to: ‘CentOS-7-x86_64-Minimal-1611.iso’

100%[============================================================================================================================>] 713,031,680 14.2MB/s   in 50s

2017-03-13 12:53:43 (13.5 MB/s) - ‘CentOS-7-x86_64-Minimal-1611.iso’ saved [713031680/713031680]

接下来,我运行了以下安装命令,结果出现错误:

[root@remote-host ~]# virt-install \
> --name centos7 \
> --ram 2048 \
> --disk path=/dev/mapper/centos-third,size=242 \
> --vcpus 1 \
> --os-type generic \
> --os-variant generic \
> --network bridge=virbr0 \
> --graphics none \
> --console pty,target_type=serial \
> --cdrom ./CentOS-7-x86_64-Minimal-1611.iso
WARNING  CDROM media does not print to the text console by default, so you likely will not see text install output. You might want to use --location. See the man page for examples of using --location with CDROM media

Starting install...
ERROR    internal error: qemu unexpectedly closed the monitor: 2017-03-13T19:58:02.701397Z qemu-kvm: -drive file=/root/CentOS-7-x86_64-Minimal-1611.iso,format=raw,if=none,id=drive-ide0-0-1,readonly=on: could not open disk image /root/CentOS-7-x86_64-Minimal-1611.iso: Could not open '/root/CentOS-7-x86_64-Minimal-1611.iso': Permission denied
Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
  virsh --connect qemu:///system start centos7
otherwise, please restart your installation.
[root@remote-host ~]#

为了评估权限问题,我查看了该目录的内容,如下:

[root@remote-host ~]# ls -al
total 696356
dr-xr-x---.  4 root root      4096 Mar 13 12:52 .
dr-xr-xr-x. 24 root root      4096 Mar 13 12:00 ..
-rw-------.  1 root root      2365 Mar 12 11:14 anaconda-ks.cfg
-rw-------.  1 root root      1091 Mar 13 12:13 .bash_history
-rw-r--r--.  1 root root        18 Dec 28  2013 .bash_logout
-rw-r--r--.  1 root root       176 Dec 28  2013 .bash_profile
-rw-r--r--.  1 root root       176 Dec 28  2013 .bashrc
drwxr-xr-x.  4 root root        36 Mar 13 12:42 .cache
-rw-r--r--.  1 qemu qemu 713031680 Dec  5 15:44 CentOS-7-x86_64-Minimal-1611.iso
drwxr-xr-x.  3 root root        17 Mar 13 10:52 .config
-rw-r--r--.  1 root root       100 Dec 28  2013 .cshrc
-rw-r--r--.  1 root root       129 Dec 28  2013 .tcshrc

尽管我知道root应该能够访问任何其他用户的文件,但我尝试将用户更改为root并重新运行命令,如下所示:

[root@remote-host ~]# chown root:root CentOS-7-x86_64-Minimal-1611.iso                                                                                       [root@remote-host ~]# ls -al
total 696356
dr-xr-x---.  4 root root      4096 Mar 13 12:52 .
dr-xr-xr-x. 24 root root      4096 Mar 13 12:00 ..
-rw-------.  1 root root      2365 Mar 12 11:14 anaconda-ks.cfg
-rw-------.  1 root root      1091 Mar 13 12:13 .bash_history
-rw-r--r--.  1 root root        18 Dec 28  2013 .bash_logout
-rw-r--r--.  1 root root       176 Dec 28  2013 .bash_profile
-rw-r--r--.  1 root root       176 Dec 28  2013 .bashrc
drwxr-xr-x.  4 root root        36 Mar 13 12:42 .cache
-rw-r--r--.  1 root root 713031680 Dec  5 15:44 CentOS-7-x86_64-Minimal-1611.iso
drwxr-xr-x.  3 root root        17 Mar 13 10:52 .config
-rw-r--r--.  1 root root       100 Dec 28  2013 .cshrc
-rw-r--r--.  1 root root       129 Dec 28  2013 .tcshrc
[root@remote-host ~]# virt-install --name centos7 --ram 2048 --disk path=/dev/mapper/centos-third,size=242 --vcpus 1 --os-type generic --os-variant generic --network bridge=virbr0 --graphics none --console pty,target_type=serial --cdrom ./CentOS-7-x86_64-Minimal-1611.iso
WARNING  CDROM media does not print to the text console by default, so you likely will not see text install output. You might want to use --location. See the man page for examples of using --location with CDROM media

Starting install...
ERROR    internal error: qemu unexpectedly closed the monitor: 2017-03-13T20:06:07.525792Z qemu-kvm: -drive file=/root/CentOS-7-x86_64-Minimal-1611.iso,format=raw,if=none,id=drive-ide0-0-1,readonly=on: could not open disk image /root/CentOS-7-x86_64-Minimal-1611.iso: Could not open '/root/CentOS-7-x86_64-Minimal-1611.iso': Permission denied
Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
  virsh --connect qemu:///system start centos7
otherwise, please restart your installation.
[root@remote-host ~]#

[root@remote-host ~]# virsh --connect qemu:///system start centos7
error: failed to get domain 'centos7'
error: Domain not found: no domain with matching name 'centos7'

[root@remote-host ~]#

如您所见,我遇到了同样的错误。 还需要做什么来解决此错误,以便来宾虚拟机能够成功安装?

答案1

您还启用了 SELinux(这很好),但 ISO 的上下文也可能阻止 qemu 读取它。

尝试将 ISO 移动到/tmp.如果单个文件上下文合适,qemu 应该有权读取 /tmp 中的文件。

如果将 ISO 移动到 后,qemu 仍然无法访问该 ISO /tmp,请检查 的内容/var/log/audit/audit.log以查看其中是否记录了任何访问冲突。

例如,要查看 SELinux 上下文,将 ISO 移动到 后/tmp,请使用ls -lZ /tmp/

这不会告诉您程序访问文件的上下文应该是什么,但会显示当前的上下文。将此文件的其他文件(程序已经可以访问)的上下文进行比较应该可以帮助您缩小可以设置此文件的上下文的范围。

在这种情况下,只要 ISO 位于 qemu 有权访问的目录中,您就可以设置 ISO 的上下文,以便 qemu 可以读取它chcon -t virt_content_t <filename>.iso

答案2

目录 ,/root具有权限 ,0550以及所有者和组所有者 , root。它还有一个 SELinux 上下文,如.in所示dr-xr-x---.。只有组内的用户root才能读取和执行/root目录中的文件。此外,只要 SELinux 强制执行,错误的 SELinux 上下文就会阻止文件访问。换句话说,即使目录权限是0777(允许所有用户进行所有访问),qemu 用户也无法读取该文件,除非另外正确设置了 SELinux 上下文。用于ls -lZ显示 SELinux 上下文。以下是/root目录的默认结果。

dr-xr-x---. root root system_u:object_r:admin_home_t:s0 root

正如我们所看到的,admin_home_t不是virt_image_t或其他一些允许的 SELinux 上下文。

还有更多方法可以做到这一点,例如使用 FTP 或 Web 服务器,如下所示。

使用网络服务器

yum install -y httpd
systemctl enable httpd
mkdir /var/www/html/centos
mount -o loop centos.iso /mnt
cp -a /mnt/. /var/www/html/centos
chcon -R --reference=/var/www/html /var/www/html/centos
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
systemctl restart httpd
umount /mnt

这样,使用-l http://x.x.x.x/pub/centos而不是--cdrom.

使用 FTP 服务器

yum install -y vsftpd
systemctl enable vsftpd
mkdir /var/ftp/pub/centos
mount -o loop centos.iso /mnt
cp -a /mnt/. /var/ftp/pub/centos
chcon -R -t public_content_t /var/ftp/
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
systemctl restart vsftpd
umount /mnt

这样,使用-l ftp://x.x.x.x/pub/centos而不是--cdrom.

简而言之,只需更正权限和 SELinux 上下文,或者使用替代方法,其中两种方法如上所述。

答案3

我尝试在 Centos 6.9 服务器上创建虚拟机时遇到错误(操作系统文件 (windows 10) 的权限被拒绝),我将文件从 dvd 复制到节点 (/virt) 上的目录,我检查了上下文/etc/libvirt/qemu并将 dir 的上下文更改为/virt预期的内容:

$ ls -lZ
-rw-r--r--. root root system_u:object_r:virt_etc_t:s0  qemu.conf

$ls -lz 
drwxr-xr-x. root root system_u:object_r:virt_etc_rw_t:s0 virt

我通过添加上下文类型来做到这一点:

semanage -a -t virt_etc_rw_t '/virt(/.*)?'

然后,

$ restorecon -RFvv /virt
127  semanage fcontext -l qemu
145  semanage fcontext -a -t virt_etc_rw_t '/virt(/.*)?'
210  history | grep semanage

[root@centos libvirt]# history | grep restore
146  restorecon -RFvv /virt

然后我就可以毫无问题地使用 ISO 文件了。

相关内容