2

1. 总结问题

我将如何创建CentOS 7.1905rootfs.tar以用于(适用于 Linux 的 Windows 子系统wsl --import

我还没有找到可以下载CentOS 7.1905的rootfs.tar文件以便与.wsl --import

我希望能够使用dnf命令滚动我自己的rootfs.tar,我花了一个晚上的时间搜索,尝试了各种事情。

如果有人构建了用于WSL的rootfs.tar文件,请发布。

mkosi(ubuntu utility)不行,不能用来建centos镜像,试试看。

下载.raw.tar.gz文件不起作用wsl --import,试试看。

我正在尝试在Windows .bat文件中执行以下命令,但找不到合适的rootfs.tar文件来使用,或者找不到构建文件的方法。

文件:create-rootfs.bat

rem <DistributionName> <InstallLocation> <FileName>
wsl --import centos_7.6.1905 c:\wsl\centos\7.6.1905 g:\downloads\cent\centos\rootfs.tar

2. 提供背景,包括您已经尝试过的内容。

我花了一个晚上阅读文档,尝试了各种dnf咒语,但没有运气。那里没有示例,有推荐dnfmkosi的地方,以及这些地方的链接,但没有实际的、具体的示例有效。


4. 描述预期和实际结果,包括任何错误消息。

我想建立一个CentOS 7.6.1905的rootfs.tar文件,用于.wsl --import

我正在寻找有效的、经过尝试和证明的实际示例。

4

2 回答 2

2

在这里,我们可以自己制作 CentOS rootfs tarball。如果您在机器上安装了真正的 Linux 发行版,这将更容易。但是在这里我们下载一个现成的 docker tarball (tar.xz) 并将其转换为 tar.gz,因为 WSL 用于bsdtar提取和安装发行版。对于此过程,WSL 中应该有一个预安装的发行版。运行该发行版并以文件夹中的 root 用户身份执行以下步骤/root以保持文件权限不变。

  • 打开这个CentOS docker git 存储库,转到最新的 CentOS 版本分支(不是 master),下载centos-7-docker.tar.xz文件。

  • 将 XZ 存档重新打包到 GZIP 存档中:xz -d -c centos-7-docker.tar.xz | gzip -c -2 > centos-7-docker.tar.gz

  • 将该 tar.gz 文件夹移动到 Windows 驱动器:mv test.tar.gz /mnt/c/MyFolder

  • 将该 tar.gz 文件导入为新发行版:wsl.exe --import CentOS MyFolder test.tar.gz

  • 验证发行版是否已安装:wsl.exe --list -v

  • 启动容器并登录:wsl.exe -d CentOS

dnf未安装在此 docker 文件中。所以,使用rpmyum安装它,yum install dnf. 确保 Windows 防火墙不会阻止它。有关更多发行版,您可以查看我的WslInstall存储库。

于 2019-07-09T06:37:32.800 回答
1

可以将 CentOS 云 QCOW2 映像转换为 rootfs.tar.gz。

此类 QCOW2 图像可在此处找到:https ://cloud.centos.org/centos/

这是一个执行转换的示例脚本(需要qemu-utils安装):

#!/bin/bash

# Environment variables for the CentOS cloud image
ARCH="x86_64"
OS_VER="7"
ROOTFS_VER="2003"
ROOTFS_FN="CentOS-${OS_VER}-${ARCH}-GenericCloud-${ROOTFS_VER}.qcow2"
ROOTFS_URL="http://cloud.centos.org/centos/${OS_VER}/images/${ROOTFS_FN}"

# Environment variables for Yuk7's wsldl
LNCR_BLD="20040300"
LNCR_ZIP="icons.zip"
LNCR_NAME="CentOS"
LNCR_FN=${LNCR_NAME}.exe
LNCR_ZIPFN=${LNCR_NAME}${OS_VER}.exe
LNCR_URL="https://github.com/yuk7/wsldl/releases/download/${LNCR_BLD}/${LNCR_ZIP}"

# Waits until a file appears or disappears
# - $1   File path to wait for its existence
# - [$2] The string 'a' to wait until the file appears, or 'd' to wait until the file disappears
# - [$3] Timeout in seconds
waitFile() {
  local START=$(cut -d '.' -f 1 /proc/uptime)
  local MODE=${2:-"a"}
  until [[ "${MODE}" = "a" && -e "$1" ]] || [[ "${MODE}" = "d" && ( ! -e "$1" ) ]]; do
    sleep 1s
    if [ -n "$3" ]; then
      local NOW=$(cut -d '.' -f 1 /proc/uptime)
      local ELAPSED=$(( NOW - START ))
      if [ $ELAPSED -ge "$3" ]; then break; fi
    fi
  done
}

# Create a work dir
mkdir wsl
cd wsl

# Download the CentOS cloud image and Yuk7's WSLDL
wget --no-verbose ${ROOTFS_URL} -O ${ROOTFS_FN}
wget --no-verbose ${LNCR_URL} -O ${LNCR_ZIP}

# Extract the CentOS WSL launcher
unzip ${LNCR_ZIP} ${LNCR_FN}

# Clean up
rm ${LNCR_ZIP}

# Mount the qcow2 image
sudo mkdir mntfs
sudo modprobe nbd
sudo qemu-nbd -c /dev/nbd0 --read-only ./${ROOTFS_FN}
waitFile /dev/nbd0p1 "a" 30
sudo mount -o ro /dev/nbd0p1 mntfs

# Clone the qcow2 image contents to a writable directory
sudo cp -a mntfs rootfs

# Unmount the qcow2 image
sudo umount mntfs
sudo qemu-nbd -d /dev/nbd0
waitFile /dev/nbd0p1 "d" 30
sudo rmmod nbd
sudo rmdir mntfs

# Clean up
rm ${ROOTFS_FN}

# Create a tar.gz of the rootfs
sudo tar -zcpf rootfs.tar.gz -C ./rootfs .
sudo chown "$(id -un)" rootfs.tar.gz

# Clean up
sudo rm -rf rootfs

# Create the distribution zip of WSL CentOS
mkdir out
mkdir dist
mv -f ${LNCR_FN} ./out/${LNCR_ZIPFN}
mv -f rootfs.tar.gz ./out/
pushd out
zip -r ../dist/CentOS${OS_VER}.zip ./*
popd

# Clean up
rm -rf out

我还维护其他 CentOS 版本的脚本,以及准备导入的rootfs.tar.gz文件:https ://github.com/mishamosher/CentOS-WSL

于 2020-07-23T08:43:11.313 回答