在 WSL2 中安装 Gentoo
为什么采用 WSL2 而不是 WSL1?
WSL1 孱弱的 io 性能和无法使用的 CUDA 是不可接受的,代价仅是 300MB 左右的内存消耗(如果不计cache)
况且 Windows11 直接支持了WSLg,美汁汁~(虽然我没有升级)
我们可以直接使用 WSL 提供的内核,可以省去编译内核,安装 CUDA 和挂载硬盘(编译虚拟硬盘驱动)的过程
安装 WSL2
参考 WSL2 安装教程 步骤1-4
其中步骤3可以直接运行 wsl --update
代替
如果是家庭版安装 Hyper-V 失败可以尝试另一个脚本 Install_Hyper-V.bat
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
安装 Stage 3
在 Gentoo mirror 找符合自己电脑架构的 stage3 文件
- 若要用 cuda 不建议选带 musl 的,因为 cuda 只支持 glibc
- 若要用 mingw 建议不用 clang 的,gentoo 上对 clang-mingw 支持不佳
我选了 stage3-amd64-openrc-20221002T170543Z.tar.xz
解压成 tar 放到一个文件夹里(WSL 貌似只支持 tar.gz 和 tar),运行
wsl --import <取个名字> <安装位置> <stage3 tar文件> --version 2
# 例如
wsl --import Gentoo . stage3-amd64-openrc-20221002T170543Z.tar --version 2
# wsl --set-default <名字> # 如果有多个 WSL 发行版,设为默认
稍等片刻就能拿到热腾腾的、包含stage3的 ext4.vhdx
了。接着就靠 WSL 自带的 kernel 启动我们的Gentoo!
wsl -d <名字>
配置 Stage 3
配置编译选项
nano -w /etc/portage/make.conf
# 这些设置是由自动构建此阶段的“催化”(catalyst)构建脚本设置的。
# 请查阅 /usr/share/portage/config/make.conf.example
# 以获取一个更详细的示例。
COMMON_FLAGS="-O2 -pipe -march=native"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
MAKEOPTS="-j4" # make 时使用四线程
# 注意:这个阶段是在启用了 bindist Use 标志的情况下构建的
PORTDIR="/var/db/repos/gentoo"
DISTDIR="/var/cache/distfiles"
PKGDIR="/var/cache/binpkgs"
# 这将把构建输出的语言设置为英语。在报告错误时,请保持此设置不变。
LC_MESSAGES=C
USE="-X " # 禁用图形
ACCEPT_LICENSE="*" # 允许一切证书 _(:з」∠)_
# 镜像
GENTOO_MIRRORS="https://mirrors.163.com/gentoo/ https://mirrors.aliyun.com/gentoo/"
按 Ctrl+x 保存退出
配置 Portage
# 创建repos.conf目录
mkdir --parents /etc/portage/repos.conf
# 复制 Portage 提供的 Gentoo 仓库配置文件到这个(新创建的)目录
cp /usr/share/portage/config/repos.conf /etc/portage/repos.conf/gentoo.conf
# 更新内容
emerge-webrsync
配置 CPU_FLAGS_*
一些架构(包括 AMD64/X86、ARM、PPC)有称为 CPU_FLAGS_ARCH 的 USE_EXPAND 变量(请酌情将 ARCH 替换为相关的系统架构)。
用于构建编译特定的汇编代码或其他内置函数——通常是手写的或其他额外的, 并且与要求编译器输出针对某个 CPU 功能的优化代码不同。
emerge app-portage/cpuid2cpuflags
echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags
# emerge sys-kernel/linux-firmware # 不建议,占用空间大
语言设置*
echo zh_CN.UTF-8 UTF-8 >> /etc/locale.gen
locale-gen
eselect locale list
eselect locale set <选择 zh_CN.UTF-8 UTF-8 >
echo LC_COLLATE=\"C.UTF-8\" >>/etc/env.d/02locale
. /etc/profile
env-update
其他配置
# 设置历史记录格式
echo export HISTTIMEFORMAT=\"%F %T \`whoami\` \">>/etc/profile
# sed -i.bak '/[c|C]lear/'d /etc/skel/.bash_logout # 取消注销时清屏
# 添加用户
groupadd admin
emerge app-admin/sudo dev-vcs/git
echo %admin ALL=\(ALL\) ALL >> /etc/sudoers
useradd <你的名字> -g admin
# echo min=1,1,1,1,1>> /etc/security/passwdqc.conf # 禁用密码强度检查
passwd <你的名字>
echo [user]>>/etc/wsl.conf
echo default = <你的名字> >>/etc/wsl.conf
su <你的名字>
# 解决 libcuda.so.1 is not a symbolic link
CUDAPATH=/mnt/c/Windows/System32/lxss/lib
rm $CUDAPATH/libcuda.so.1 $CUDAPATH/libcuda.so
ln -s $CUDAPATH/libcuda.so.1.1 $CUDAPATH/libcuda.so.1
ln -s $CUDAPATH/libcuda.so.1.1 $CUDAPATH/libcuda.so
~/.bashrc
# If not running interactively, don't do anything
if [[ $- != *i* ]] ; then
# Shell is non-interactive. Be done now!
return
fi
# history
HISTSIZE=100000
HISTFILESIZE=2000000
HISTIGNORE="pwd:history"
shopt -s histappend
# alias from Ubuntu
alias ll='ls -lF'
alias la='ls -A'
alias l='ls -CF'
# wsl proxy
export ip=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
alias wget="wget -c"
alias pwget="wget -e https-proxy=https://$ip:7890 -e http-proxy=http://$ip:7890 -c"
git config --global http.https://github.com.proxy socks5://$ip:7890
git config --global https.https://github.com.proxy socks5://$ip:7890
# Put your fun stuff here.
export PATH=$PATH:/usr/lib/wsl/lib
标签:
Gentoo
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现