以下是我的 dockerfile 檔案,內容特別簡單
FROM cr.loongnix.cn/library/debian:buster
WORKDIR /root
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
apt-transport-https \
ca-certificates \
curl \
git \
wget \
tzdata \
openssh-client \
xz-utils \
libicu67
RUN wget http://ftp.loongnix.cn/dotnet/8.0.7/8.0.7-1/pkg/dotnet-sdk-8.0.107-linux-loongarch64.tar.xz
RUN mkdir dotnet && tar -xvf dotnet-sdk-8.0.107-linux-loongarch64.tar.xz -C dotnet
RUN ln -s /root/dotnet/dotnet /usr/bin/dotnet
我這裡的 cr.loongnix.cn/library/debian:buster
的 docker image Id 是 70fcf9ce129a,屬於龍芯舊世界版本
以上 dockerfile 在 2024.11.01 時能正常構建且構建出來的 docker image 可以在龍芯舊世界裡使用。以上的 dockerfile 的使用方法是在龍芯舊世界裝置上,用 docker build 一下即可。特別說明,要在龍芯舊世界裝置上,用 docker build 一下,因為 cr.loongnix.cn/library/debian:buster
裡面使用的就已經是龍架構的舊世界的系統了,在其他 CPU 架構上的裝置是無法直接跑起來的
如果大家不想自己構建,可以發郵件向我要 dockerimage-loongarch64-abi1.0-dotnet-sdk-8.0.107-debian-buster.8346c670d9f6.tar 檔案,這個檔案就是我用以上 dockerfile 構建出來的
以下是我的踩坑記錄:
一些概念
- 龍芯新舊世界: 舊世界與新世界 - 咱龍了嗎?
業界共識是遲早龍芯都會進入新世界,即可能後續的 cr.loongnix.cn/library/debian:buster
會是屬於新世界的。儘管現在似乎龍芯準備將 cr.loongnix.cn
當成舊世界倉庫,將 lcr.loongnix.cn
和 https://hub.docker.com/u/loongarch64
當成新世界倉庫
但必須說明的是,我沒有從龍芯任何文件找到說一定會將 cr.loongnix.cn
當成舊世界倉庫的說法,只是從 龍芯雲 https://loongson-cloud-community.github.io/Loongson-Cloud-Community/ 文件找到以下描述,從而進行推測而已:
cr.loongnix.cn 容器映象倉庫, 適用於核心版本 < 5.10的作業系統,如龍蜥8.8、龍芯debian10等。容器映象原始碼倉庫:https://github.com/Loongson-Cloud-Community/dockerfiles
lcr.loongnix.cn 容器映象倉庫,適用於核心版本>=5.10的作業系統,如尤拉22.03、尤拉24.03、龍蜥23版本等。容器映象原始碼倉庫:https://github.com/Loongson-Cloud-Community/docker-library
再根據 https://github.com/Loongson-Cloud-Community/docker-library/blob/b14dda076c0deadebe0a949a8603f07c8cc922cb/README.md 文件的以下內容證明至少 lcr.loongnix.cn 是新世界倉庫
適用於上游(abi2.0)作業系統的映象原始碼倉庫,對應的映象倉庫是lcr.loongnix.cn
如 舊世界與新世界 - 咱龍了嗎? 文件說明,上游(abi2.0)作業系統屬於新世界,而 abi1.0 屬於舊世界
想要在舊世界執行,就需要找到正確的舊世界倉庫。根據上文描述,在 docker hub 上找到的,預計都屬於新世界,而不是舊世界
在龍芯舊世界 kylin-2403 sp1 安裝 docker
我只借到一臺寶貴的龍芯裝置,這臺是 3A6000 的裝置,搭載了 kylin-2403 sp1 麒麟系統。系統版本資訊內容如下
$ uname -a
Linux lindexi-pc 5.4.18-116-generic #105-KYLINOS SMP Fri Jun 21 14:09:22 UTC 2024 loongarch64 loongarch64 loongarch64 GNU/Linux
$ uname -r
5.4.18-116-generic
$ cat /etc/kylin-version/kylin-system-version.conf
[SYSTEM]
os_version = 2403
update_version = 2403
quality_version =
$ cat /etc/.kyinfo
[dist]
name=Kylin-Desktop-EDU
milestone=V10
arch=loongarch64
beta=False
time=2024-09-14 12:27:59
dist_id=Kylin-Desktop-V10-SP1-2403-update1-EDU-Release-20240914-LoongArch64-2024-09-14 12:27:59
[servicekey]
key=0389218
[os]
to=
term=2025-12-18
$ cat /etc/debian_version
bullseye/sid
CPU 資訊如下
$ cat /proc/cpuinfo | grep name
model name : Loongson-3A6000
我的 docker 安裝方法:
先下載安裝 docker-ce-cli:https://pkg.loongnix.cn/loongnix/pool/main/d/docker-ce/docker-ce-cli_20.10.3-7.1_loongarch64.deb
$ wget https://pkg.loongnix.cn/loongnix/pool/main/d/docker-ce/docker-ce-cli_20.10.3-7.1_loongarch64.deb
$ sudo dpkg -i docker-ce-cli_20.10.3-7.1_loongarch64.deb
此時 docker 尚未啟動,執行將會提示 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
錯誤,需要再按照 https://bbs.loongarch.org/d/80-docker-buildx-compose 提供的方法進行安裝 docker ce 版本
# docker binaries
$ wget https://github.com/wojiushixiaobai/docker-ce-binaries-loongarch64/releases/download/v24.0.2/docker-24.0.2.tgz
$ tar -xf docker-24.0.2.tgz
$ cp docker/* /usr/local/bin/
# systemd
$ wget https://raw.githubusercontent.com/jumpserver/installer/9dfdfad3d71759483f12a90d62c609ba6f64bc46/scripts/docker/docker.service -O /etc/systemd/system/docker.service
啟動 docker:
$ systemctl start docker
此時執行 sudo docker ps
如能看到以下輸出內容,則證明安裝成功
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
接下來嘗試構建上文提供的 dockerfile 檔案
# 先使用 cd 進入到 dockerfile 檔案所在目錄
$ sudo docker build -t t1 .
構建完成之後,試試進入 docker image 裡面。以上命令列將構建出 t1:latest
的 docker image
$ sudo docker run -it t1
進入 docker 容器之後,試試輸入 dotnet --info
和 dotnet nuget --version
測試 dotnet 是否部署成功
root@0957d906898b:~# dotnet --info
.NET SDK:
Version: 8.0.107
Commit: 1bdaef7265
Workload version: 8.0.100-manifests.43c23f91
Runtime Environment:
OS Name: Loongnix
OS Version: 20
OS Platform: Linux
RID: linux-loongarch64
Base Path: /root/dotnet/sdk/8.0.107/
.NET workloads installed:
Workload version: 8.0.100-manifests.43c23f91
There are no installed workloads to display.
Host:
Version: 8.0.7
Architecture: loongarch64
Commit: dbda949b78
.NET SDKs installed:
8.0.107 [/root/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 8.0.7 [/root/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 8.0.7 [/root/dotnet/shared/Microsoft.NETCore.App]
Other architectures found:
None
Environment variables:
Not set
global.json file:
Not found
Learn more:
https://aka.ms/dotnet/info
Download .NET:
http://www.loongnix.cn/zh/api/dotnet
Loongson's .NET version:
8.0.107-1
root@0957d906898b:~# dotnet nuget --version
NuGet Command Line
6.8.1.32767
如能夠完成上述步驟,則證明已經成功完成
以下是記錄我過程中的一些踩坑點:
其實核心踩坑點是由於龍芯新舊世界的存在,讓我不能確定在網上找到的文章屬於新世界還是舊世界,再加上我開始對龍芯新舊世界沒有概念或概念混亂,導致我踩坑比較多
docker 源
針對舊世界,不能使用 lcr.loongnix.cn 和 docker hub 源,這兩個源都不符合舊世界的預期
也即如 loongsongd/debian10_loongarch64_x64:mini
等 docker image 都是不符合預期的。其中 loongsongd/debian10_loongarch64_x64:mini
存在比較大的問題是似乎容器裡面已經開了 qemu 模擬了,但各個程序,如 bash 等都是非龍架構的,導致執行必定失敗
docker ce 的安裝
不能使用通用的 docker ce 版本,本身龍芯使用的是 龍架構。敲黑板,龍架構的地位和 x86、x86_64 是等同的,即大家可以說,世界上的 CPU 架構有: x86、x64、arm、arm64、龍架構、MIPS
請必須明確的是龍架構是一個獨立的架構,不是 MIPS 架構,細節請參閱: 龍芯自主指令集LoongArch為什麼是全新指令集,和MIPS不同在哪兒?- 闢謠 - 嗶哩嗶哩
更多請參考: 如何稱呼龍架構? - 咱龍了嗎?
這就是為什麼需要使用龍架構版的 docker ce 的原因了。再疊加新舊世界的影響,就需要使用龍架構的舊世界的 docker ce 包
官方提供的 https://pkg.loongnix.cn/loongnix/pool/main/d/docker-ce/docker-ce_20.10.3-7.1_loongarch64.deb
需要有 containerd.io 依賴,不太好裝。這就是為什麼我去使用論壇提供的安裝方法的原因
但是由於 https://bbs.loongarch.org/d/80-docker-buildx-compose 論壇上提供的內容比較舊了,一些連結,如 https://raw.githubusercontent.com/jumpserver/installer/master/scripts/docker.service
已經 404 了,需要更新
更新之後的命令如下,和上文給出的相同
# docker binaries
$ wget https://github.com/wojiushixiaobai/docker-ce-binaries-loongarch64/releases/download/v24.0.2/docker-24.0.2.tgz
$ tar -xf docker-24.0.2.tgz
$ cp docker/* /usr/local/bin/
# systemd
$ wget https://raw.githubusercontent.com/jumpserver/installer/9dfdfad3d71759483f12a90d62c609ba6f64bc46/scripts/docker/docker.service -O /etc/systemd/system/docker.service
哪個才是龍芯官方 GitHub 組織
- https://github.com/Loongson-Cloud-Community :官方組織
- https://github.com/Loongson-Community : 非官方的社群組織
- https://github.com/loongson :非官方的社群組織
根據 容器映象倉庫 - 龍芯開源社群 提及的原始碼倉庫為 : https://github.com/Loongson-Cloud-Community ,可認為 Loongson-Cloud-Community 為官方組織
基本上只有官方組織在維護 abi1.0 舊世界,其他組織都是在做新世界。新世界的 dotnet 是在龍芯社群組織裡面的,詳細請看 https://github.com/loongson-community/dotnet-unofficial-build
dotnet 找不到 icu 不支援多語言
執行 dotnet --info
的報錯如下
root@55154e73f795:~# dotnet --info
Process terminated. Couldn't find a valid ICU package installed on the system. Please install libicu (or icu-libs) using your package manager and try again. Alternatively you can set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support. Please see https://aka.ms/dotnet-missing-libicu for more information.
at System.Environment.FailFast(System.String)
at System.Globalization.GlobalizationMode+Settings..cctor()
at System.Globalization.CultureData.CreateCultureWithInvariantData()
at System.Globalization.CultureData.get_Invariant()
at System.Globalization.CultureInfo..cctor()
at System.Globalization.CultureInfo.get_CurrentUICulture()
at System.TimeZoneInfo.GetUtcStandardDisplayName()
at System.TimeZoneInfo.CreateUtcTimeZone()
at System.TimeZoneInfo..cctor()
at System.DateTime.get_Now()
at Microsoft.DotNet.Cli.Program.Main(System.String[])
Aborted (core dumped)
透過 apt search libicu 可知道在龍芯源上帶了 libicu67 和 libicu63 版本
root@55154e73f795:~# apt search libicu
...
libicu63/Debian 63.1-6+deb10u1.lnd.1 loongarch64
International Components for Unicode
libicu67/Debian 67.1-7.lnd.1 loongarch64
International Components for Unicode
...
只需在 dockerfile 帶上 libicu67
的安裝即可解決在龍芯裝置上 dotnet 找不到多語言丟擲異常的問題,帶上之後的 dockerfile 安裝內容如下,以下程式碼和本文一開始給出的 dockerfile 內容相同
RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
apt-transport-https \
ca-certificates \
curl \
git \
wget \
tzdata \
openssh-client \
xz-utils \
libicu67
以上的 ca-certificates
也是必要項,詳細請參閱 修復 Debian 安裝 dotnet 失敗 depends on ca-certificates
更多多語言相關,請參閱: Globalization config settings - .NET - Microsoft Learn
dotnet 軟連結
- 應該使用
ln -s
軟連結的方式,否則將會遇到Error: [/usr/bin/host/fxr] does not exist
錯誤。詳細請看 徹底明白Linux硬連結和軟連結-linux硬連結和軟連結區別 - 軟連結過程中,不應該使用相對路徑,即
ln -s ./dotnet/dotnet /usr/bin/dotnet
也是錯誤的,將會提示bash: /usr/bin/dotnet: Too many levels of symbolic links
錯誤
詳細請看 製作一個能構建 dotnet AOT 的 gitlab ruuner 的 Debian docker 映象
為何不使用 dotnet deb 包
從 http://ftp.loongnix.cn/dotnet/8.0.7/8.0.7-1/deb/dotnet-sdk-8.0_8.0.107-1_loongarch64.deb 下載的包是需要帶依賴的,透過 dpkg -e 獲取 control 檔案,可見如下內容
Depends: dotnet-runtime-8.0 (>= 8.0.7), dotnet-targeting-pack-8.0 (>= 8.0.7), dotnet-apphost-pack-8.0 (>= 8.0.7), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-8.0 (>= 8.0.7), aspnetcore-targeting-pack-8.0 (>= 8.0.7)
這裡有比較多依賴包,不如直接使用 tar.xz 包
x86_64 配合 qemu 模擬執行龍架構 docker
結論: 不可行
能夠跑起來龍架構舊世界的 docker 容器,但是 QEMU 模擬有些坑,導致 dotnet 有些功能不能符合預期工作。且執行效能很低
現在我的需求是不能按照 X86模擬龍芯與編譯 .NET CoreCLR - 痴者工良 - 部落格園 部落格提供的方法進行,此部落格裡面使用的是 MIPS 的,非龍架構的,不符合本文的需求。但依然感謝大佬幫忙踩坑
先準備好一臺 x86_64 的 debian 12 的裝置,接著按照通用的方法安裝上 docker 和相關工具,推薦一切按照預設的來。我這裡就因為擔心磁碟空間問題,踩了一個坑,詳細請看 docker中無法使用sudo命令,提示沒有root許可權或者檔案系統掛載沒有nosuid選項_an nfs file system without root privileges?-CSDN部落格
官方 docker 安裝方法: https://docs.docker.com/engine/install/debian/
為了能夠使用上龍芯舊世界的 QEMU 需要使用特別的版本,我的夥伴 lsj 告訴我說 QEMU 有核心和使用者態的部分,不僅僅只是靠底層模擬龍架構指令,還需要一些使用者態的支援,使用者態部分的支援就和新舊世界 ABI1.0 和 ABI2.0 有關係
特別感謝 lsj 教會了我這個方法
從 GitHub 上找到了 zhangguanzhang 大佬貼出來的龍芯官方的qemu提交人給的版本,以及 msojocs 大佬的測試結果,即可知道,可以使用如下命令進行部署
$ sudo docker run --rm --privileged zhangguanzhang/qemu-user-static --reset -p yes
拉取 zhangguanzhang/qemu-user-static
需要到 docker io 拉取,如果大家拉不下來,可以發郵件向我要 zhangguanzhang_qemu-user-static.335cfbcdcc6d.tar 檔案,我透過網盤給你
完成上述步驟之後,即可拉取舊世界的包,如以下命令
docker pull cr.loongnix.cn/library/debian:buster-slim
預期會提示以下警告
WARNING: The requested image's platform (linux/loong64) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
有以上警告是非常正確的事情,因為就是要拉取龍架構的,不匹配當前的 amd64 架構的
試試此時繼續使用以下命令看能否進入到容器裡
docker run -it cr.loongnix.cn/library/debian:buster-slim
如能夠進入到容器,再使用 ls /lib64
命令,如輸出的是 ld.so.1
則證明確實是舊世界
root@ff641f574628:~# ls /lib64
ld.so.1
以上就是在 amd64 裝置上,使用 QEMU 執行龍芯舊世界的 docker 的方法
我開始使用 https://gitee.com/michael0066/qemu-loongarch64-static.git 的方式做,但似乎這樣做出來的是新世界的。在這裡踩坑,感謝 lsj 的幫助,才讓我找到正確的方法
嘗試繼續在裡面打上 dotnet 的支援,如以下命令
root@ff641f574628:~# wget http://ftp.loongnix.cn/dotnet/8.0.7/8.0.7-1/pkg/dotnet-sdk-8.0.107-linux-loongarch64.tar.xz
root@ff641f574628:~# mkdir dotnet && tar -xvf dotnet-sdk-8.0.107-linux-loongarch64.tar.xz -C dotnet
root@ff641f574628:~# ln -s /root/dotnet/dotnet /usr/bin/dotnet
此時使用 dotnet --info
都是能正常輸出的,證明 dotnet 能夠最基礎在此容器裡執行
root@ff641f574628:~# dotnet --info
.NET SDK:
Version: 8.0.107
Commit: 1bdaef7265
Workload version: 8.0.100-manifests.43c23f91
Runtime Environment:
OS Name: Loongnix
OS Version: 20
OS Platform: Linux
RID: linux-loongarch64
Base Path: /root/dotnet/sdk/8.0.107/
.NET workloads installed:
Workload version: 8.0.100-manifests.43c23f91
There are no installed workloads to display.
Host:
Version: 8.0.7
Architecture: loongarch64
Commit: dbda949b78
.NET SDKs installed:
8.0.107 [/root/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 8.0.7 [/root/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 8.0.7 [/root/dotnet/shared/Microsoft.NETCore.App]
Other architectures found:
None
Environment variables:
Not set
global.json file:
Not found
Learn more:
https://aka.ms/dotnet/info
Download .NET:
http://www.loongnix.cn/zh/api/dotnet
Loongson's .NET version:
8.0.107-1
然而當輸入 dotnet --help
或 dotnet nuget --version
時,卻有異常提示
root@ff641f574628:~# dotnet --help
System.IO.IOException: Not enough storage is available to process this command. : 'NuGet-Migrations'
at System.Threading.Mutex.CreateMutexCore(Boolean initiallyOwned, String name, Boolean& createdNew)
at System.Threading.Mutex..ctor(Boolean initiallyOwned, String name)
at NuGet.Common.Migrations.MigrationRunner.Run(String migrationsDirectory)
at NuGet.Common.Migrations.MigrationRunner.Run()
at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.Configure()
at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel, IAspNetCertificateSentinel aspNetCertificateSentinel, IFileSentinel toolPathSentinel, Boolean isDotnetBeingInvokedFromNativeInstaller, DotnetFirstRunConfiguration dotnetFirstRunConfiguration, IEnvironmentProvider environmentProvider, Dictionary`2 performanceMeasurements)
at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, TimeSpan startupTime, ITelemetry telemetryClient)
at Microsoft.DotNet.Cli.Program.Main(String[] args)
錯誤資訊如下
System.IO.IOException: Not enough storage is available to process this command. : 'NuGet-Migrations'
at System.Threading.Mutex.CreateMutexCore(Boolean initiallyOwned, String name, Boolean& createdNew)
at System.Threading.Mutex..ctor(Boolean initiallyOwned, String name)
at NuGet.Common.Migrations.MigrationRunner.Run(String migrationsDirectory)
at NuGet.Common.Migrations.MigrationRunner.Run()
at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.Configure()
at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel, IAspNetCertificateSentinel aspNetCertificateSentinel, IFileSentinel toolPathSentinel, Boolean isDotnetBeingInvokedFromNativeInstaller, DotnetFirstRunConfiguration dotnetFirstRunConfiguration, IEnvironmentProvider environmentProvider, Dictionary`2 performanceMeasurements)
at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, TimeSpan startupTime, ITelemetry telemetryClient)
at Microsoft.DotNet.Cli.Program.Main(String[] args)
透過 GitHub 大佬的分析,可以定位到是 https://github.com/NuGet/NuGet.Client/blob/3ab7d1462029e0b211a88040c952c9b8a679708d/src/NuGet.Core/NuGet.Common/Migrations/MigrationRunner.cs#LL23C17-L23C73 這句程式碼丟擲的。也看到 Stephen Toub 大佬在 GitHub 的如下內容分析
Mutex on Linux needs to perform a variety of I/O operations, including creating a file on disk and creating a pthreads mutex; it's possible one of those is failing for some reason.
That error string looks like https://github.com/dotnet/runtime/blob/622277e02da5517aaeaa322be27079822b4d33e2/src/coreclr/pal/src/misc/errorstrings.cpp#L71, which is used in a variety of places. For example, it'll be used in https://github.com/dotnet/runtime/blob/622277e02da5517aaeaa322be27079822b4d33e2/src/coreclr/pal/src/synchobj/mutex.cpp#L791 if the operation encounters an EPERM errno from pthread_mutex_init.
但是無論是以下哪個帖子的內容,都幫不到忙
- https://github.com/dotnet/runtime/issues/80619
- https://github.com/termux/termux-packages/issues/516#issuecomment-2109348032
- https://github.com/NuGet/Home/issues/12365#issuecomment-1463016158
- https://github.com/dotnet/runtime/issues/91987#issuecomment-2236418465
- https://gist.github.com/pchalamet/7c17be4cb4e74c7cacf36f94bf62b4ea
其中有人說可能是 root 許可權的問題,於是我就在不斷倒騰各種許可權,但依然失敗。第二天 lsj 告訴我說可能是 QEMU 哪些模擬不正確,讓我試試在龍芯物理裝置上跑跑看
於是我就在 debian 裡面,使用 docker image save 儲存到本地,然後傳到龍芯物理裝置上,使用 docker image load 命令載入起來
接著再在龍芯物理裝置上使用 docker run -it 方式進入容器,嘗試各種 dotnet 命令都沒有問題。由於使用的是相同的 docker image 因此可以證明是在 debian 12 上使用 QEMU 模擬不正確導致的問題,而不是製作出來的 docker image 有問題或 dotnet 有問題
透過在龍芯物理裝置上的對比,就可以瞭解到在 debian 12 上使用 QEMU 模擬不正確,導致了 dotnet 許多基礎命令不可用
由於我使用的是 GitHub 上 zhangguanzhang 大佬貼出來的龍芯官方的qemu提交人給的版本,既沒有程式碼且我也不懂。於是我就放棄了走模擬這條路
參考文件
- 如何稱呼龍架構? - 咱龍了嗎?
- 舊世界與新世界 - 咱龍了嗎?
- 龍芯自主指令集LoongArch為什麼是全新指令集,和MIPS不同在哪兒?- 闢謠 - 嗶哩嗶哩
- 龍芯雲 https://loongson-cloud-community.github.io/Loongson-Cloud-Community/
- 容器映象倉庫 - 龍芯開源社群
- Loongnix作業系統源
- https://hub.docker.com/u/loongarch64
- bash: xz: command not found - CSDN文庫
- Linux tar 命令解壓tar.xz檔案 - myfreax
- apt 與 apt-get — Linux 中軟體包管理工具的區別 — AWS
- dotnet 基於 debian 建立一個 docker 的 sdk 映象
- 修復 Debian 安裝 dotnet 失敗 depends on ca-certificates
- 製作一個能構建 dotnet AOT 的 gitlab ruuner 的 Debian docker 映象
- .net - A fatal error occurred. The folder [/usr/share/dotnet/host/fxr] does not exist - Stack Overflow
- Troubleshoot .NET package mix ups on Linux - .NET - Microsoft Learn
- Globalization config settings - .NET - Microsoft Learn
- X86模擬龍芯與編譯 .NET CoreCLR - 痴者工良 - 部落格園
- X86模擬龍芯與編譯 .NET CoreCLR - 痴者工良 - 部落格園
- dockerfile-新增使用者並賦予sudo許可權以及指定密碼_dockerfile sudo-CSDN部落格
- 【零基礎入門Docker】Dockerfile中的USER指令以及dockerfile命令詳解_docker_arthas777-雲原生
- Linux下建立普通使用者遇到的問題及解決辦法_安裝linux忘記建立普通使用者-CSDN部落格
- linux給普通使用者分配root許可權_linux給多使用者root許可權-CSDN部落格
- linux給使用者新增root許可權方法總結-騰訊雲開發者社群-騰訊雲
- docker容器以ROOT賬號登入(獲取ROOT許可權/ROOT密碼) - cn2024 - 部落格園
- docker中無法使用sudo命令,提示沒有root許可權或者檔案系統掛載沒有nosuid選項_an nfs file system without root privileges?-CSDN部落格
- sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges? · Issue #1100 · docker/for-linux
- sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges? - CSDN文庫
- [daily][centos][sudo] sudo 報錯 - toong - 部落格園
- https://docs.docker.com/engine/install/debian/
- https://gitee.com/michael0066/qemu-loongarch64-static.git
- x86 架構執行 其他架構映象-騰訊雲開發者社群-騰訊雲
- Debian 12 / Ubuntu 24.04 安裝 Docker 以及 Docker Compose 教程 - 燒餅部落格