Rust已不支持Cent OS 6
rhel是Redhat 發布的Red Hat Enterprise Linux的簡稱,使用rhel源代碼編譯的CentOS,最新的版本是CentOS 7,于2024年停止支持。而更古老的CentOS 6,則在2020年就已經結束了。
而面對如此老舊的系統,Rust官方則早就放棄了支持。
按照rust官網上的安裝方法,執行:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
會首先返回一個curl不支持--proto
,把這行刪掉再執行,成功下載了rustup.rs,則會直接失敗在不支持的glibc版本這一步上。
通過2022年8月1日這則blog,我們知道Rust已經從1.64版本開始,明確放棄了對glibc 2.17版本、linux 3.2版本之下的支持(以前的版本是glibc 2.11、linux 2.6.32)。
而Cent OS 6的glibc的版本是2.12.1,linux的版本是2.6.32。所以,我們只能選擇rust 1.63版本。
安裝 Rust 1.63
好在Rust很良心地提供了各平臺安裝包,在歸檔里就有Rust 1.63。
因為是Linux系統,我們選擇x86_64-unknown-linux-gnu下載,放到Cent OS 6系統上。
解壓開之后,會有一個install.sh
。執行完之后,1.63版本的Rust就安裝好了。
默認地,它會安裝在/usr/local
目錄里,所以我們熟悉的cargo、rustc、rustfmt等命令,都會在/usr/local/bin
目錄里。如果/usr/local/bin
沒有在PATH環境變量的,需要加一下。
如:
export PATH=/usr/local/bin:$PATH
gcc 4.8
如果我們使用的crates也都比較老舊,這時候在CentOS 6上已經可以“比較順暢”地使用Rust開發了。
但是,現在畢竟已經是2025年了,C++已經經過了C++ 11、C++ 14、C++ 17、C++ 20以及C++ 23,就要發布C++ 26了。而CentOS 6上的gcc 還是4.4.7,連C++ 11都不支持。
好在Redhat提供了devtoolset。對于Cent OS 6來說,最簡單方便地使用devtoolset 的方法,就是直接在/etc/yum.repos.d里,手動增加一個devtoolset 2的repo文件。
[devtools-2-centos-$releasever]
name=devtools 2 for CentOS $releasever
baseurl=http://people.centos.org/tru/devtools-2/$releasever/$basearch/RPMS
gpgcheck=0
然后運行yum repolist
,就會增加一個repo,名字叫做devtoolset 2 for CentOS 6
,我們執行yum search devtoolset
,可以看到gcc、gdb、valgrind等一系列開發工具,甚至包括Emacs,都有了devtoolset 2的定制版本。
我們安裝yum install devtoolset-2-gcc
之后,會發現這些東西安裝在了目錄/opt/rh/devtoolset-2/root
里面。
為了方便,我們可以把原來的gcc備份一下,然后建一個新的軟連接,連接到devtoolset-2的gcc。
mv /usr/bin/gcc /usr/bin/gcc-4.4.7
ln -s /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/gcc
之后執行gcc -v
,就可以看到gcc 已經升級到4.8.2版本了。
雖然gcc 4.8也已經被放棄支持了,但是畢竟它支持std=c1x
啊。
rustup 切換到1.63
如果我們已經不習慣在古老的CentOS 6系統里面開發,其實我們可以進行交叉開發。
即,在一個比較新的系統里,使用rust 1.63進行開發,然后再把代碼放到CentOS 6里面進行編譯。
得益于rustup的生態,進行這項工作非常簡單。
首先,使用rustup安裝1.63版本。
rustup intall 1.63.0
其次,在我們需要使用低版本rust的項目里執行:
rustup override set 1.63.0
之后就可以舒服的在高版本的Linux里開發低版本的rust程序了。
如果切換之后,提示
error: failed to parse lock file at: /home/p/Nutstore/jt/bjagent_gbjt/Cargo.lock Caused by: lock file version `4` was found, but this version of Cargo does not understand this lock file, perhaps Cargo needs to be updated?
就是當前的rust版本不支持Cargo.lock文件的格式,備份之后刪除重試就行。
cargo 依賴
在使用rust 1.63的過程中,我還發現幾個對我造成了困擾,但是其實又比較有意思的地方。
- cargo緩存的包會影響cargo程序運行
我的項目里面依賴了fastdate這個crate,這個crate依賴的Rust版本是2024,于是在我使用了rust 1.63的項目目錄下面,連執行cargo tree
解析依賴樹都解析不了,直接停止在rust不能解析fastdate 的Cargo.toml里的editon=2024這句。
即使我在Cargo.toml里面指定使用較低版本的fastdate,仍然解決不了這個問題。cargo仍然會解析高版本的fastdate,然后停止。
我是把.cargo/registry/src/
目錄中的fastdate源碼改了,才可以執行出來cargo tree
,進而發現是其它包間接依賴高版本的fastdate,才最終在項目上解決這個問題。
- cargo解決依賴關系的時候,會使用最新版本。
比如,你的項目里面使用了一個crate叫做a,因為比較新的a需要Rust 1.64,于是你使用了比較舊的a版本,并且在Carto.toml里使用
[dependencies]
a = "=old"
嚴格限制了版本號。
但是,如果a依賴了b,cargo在構建的時候,仍然會選擇較新版本的b來構建。
于是構建失敗。
其實解決方法也很簡單,就是在Cargo.toml里,明確指定b的版本號。
- cargo提供了一個
minimal-versions
工具。
執行cargo install cargo-minimal-versions
安裝,之后執行
cargo minimal-versions check
或者cargo minimal-versions build
來測試或者構建。
但是,其實這個命令還依賴cargo-hack
工具,需要再安裝cargo install cargo-hack
。