在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

開源之夏總結runk:基于Rust的OCI runtime實現

jf_wN0SrCdH ? 來源:KataContainers ? 作者: 陳軼陽 ? 2022-11-29 15:00 ? 次閱讀

這是今年開源之夏活動中,陳軼陽同學參加 runk 項目的總結文檔,主要介紹了 runk 的由來,以及如何基于現有 kata agent 組件來實現一個標準的 OCI runtime。

1. runk背景

kata-agent是在虛擬機 (VM) 中運行的進程,作為管理容器和在這些容器中運行的進程的主管。換句話說,kata-agent是 VM 內部的一種“低級”容器運行時,因為agent根據 OCI 運行時規范生成和運行容器。但是,kata-agent沒有運行時規范中定義的 OCI 命令行界面 (CLI)。kata-runtime提供了Kata Containers運行時組件的 CLI 部分,但kata-runtime是一個容器運行時,用于創建在主機上運行的硬件虛擬化容器。

ManaSugi[1]發起了實驗性質的runk項目。runk是一個基于 Rust 的標準 OCI 容器運行時,它管理傳統的容器。runk旨在成為現有 OCI 兼容容器運行時的替代方案之一。kata-agent具有容器運行時所需的大部分功能,并且由于使用 Rust 語言實現,因此具有高性能和低內存占用的特點。runk利用kata-agent的機制來避免重新發明輪子。

目前,runk仍然是實驗性質的工具,有一部分功能還有待實現。根據 ManaSugi 提交的Proposal[2],截止到目前,runk支持的功能如下:

Feature Status
crictl
Docker
Podman
OCI commands (state/create/start/kill/delete)
runcommand
speccommand
execcommand
listcommand
pscommand
pause/resumecommands
updatecommand
eventscommand
initcommand
checkpoint/restorecommands (CRIU)
Foreground terminal mode See therunc modes[3].
Cgroups v1
Cgroups v2
Systemd Cgroups
Namespaces
no pivot_root kata-agent支持該功能,但是runk還不支持。
Capabilities
Seccomp
AppArmor WIP on#2227[4]
SELinux
Rlimit
Readonly path
Masked path
Hooks
Rootless

我在這次CCF開源夏令營中新增實現的功能有list/ps/exec/pause/resume子命令。

2. 新增子命令的作用和實現

2.1 list

list子命令用于列出當前運行的容器,列出的基本信息包括容器ID、進程PID、狀態、Bundle、創建時間、所有者。運行效果如下:

$ sudo runk list container1
ID  PID  STATUS   BUNDLE                                    CREATED                            OWNER
k1  0    stopped  /home/cyyzero/workspace/test/runk/bundle  2022-11-04 07:41:47.489394784 UTC  root

實現方式是遍歷root目錄下的所有子目錄,然后讀取state.json文件,解析出容器的基本信息并打印輸出。

2.2 ps

ps子命令用于列出容器內的進程信息。運行效果如下:

$ sudo runk ps container1
  PID TTY          TIME CMD
    1 ?        00:00:00 sh
    2 ?        00:00:00 sleep
    3 pts/0    00:00:00 ps

實現方式是首先通過cgroup來獲取容器內所有的pid;然后利用ps -ef命令搜集操作系統上所有進程的信息。最后通過pid的比對,將容器進程相關的信息打印出來。

2.3 exec

exec子命令用于在容器內執行一個新的進程,它允許指定啟動進程的命令行參數、環境變量、cwd等信息。新進程會通過setns系統調用來加入到容器的namesapce中,同時也會加入容器所在的cgroup進程集合。

它與已實現的create和run命令類似,依賴rustjail包里的LinuxContainer類。LinuxContainer類是agent啟動容器的核心類,針對每個容器會生成一個LinuxContainer實例,并通過這個對象來管理整個容器的生命周期,包括創建、啟動、停止、刪除等一系列操作。runk也依賴LinuxContainer類來啟動容器進程。目前只在兩個場景下使用:創建初始容器進程(對應create/run命令)和在已創建的容器中再啟動額外進程(對應exec命令)。針對這兩種啟動進程的方式,我抽象出了兩個類,InitContainer和ActivatedContainer,它們能夠生成ContainerLauncher類的對象來啟動進程。

運行方式如下:

# --pid-file 用于輸出啟動進程的進程號,--env用于指定環境變量,--cwd用于指定工作目錄
$ sudo runk exec --pid-file container1.pid --env ENV1=test --cwd / container1 ls -l

2.4 pause/resume

pause/resume利用了cgroup的freezer子系統,可以掛起或者恢復cgroup集合中的進程。

在cgroup_rs包中,已經封裝好了對于freezer子系統的操作,目前支持cgroup v1和cgroup v2。核心代碼如下,可以很簡單地改變容器的freezer狀態。

pub fn freeze(cgroup: &cgroups::Cgroup, state: FreezerState) -> Result<()> {
    let freezer_controller: &FreezerController = cgroup
        .controller_of()
        .ok_or_else(|| anyhow!("failed to get freezer controller"))?;
    match state {
        FreezerState::Frozen => {
            freezer_controller.freeze()?;
        }
        FreezerState::Thawed => {
            freezer_controller.thaw()?;
        }
        _ => return Err(anyhow!("invalid freezer state")),
    }
    Ok(())
}

3. 遇到的特殊問題

在cgroup v1,處于frozen狀態的進程無法處理信號,所以對于kill命令,需要先將容器解除frozen狀態,然后再發送信號。詳情可以參考runc倉庫的討論[5]。

4. 測試

目前,runk除了rust自帶的單元測試外,還添加了集成測試。集成測試的目的是驗證runk的功能是否正常,以及runk與containerd的交互是否正常。集成測試的代碼在kata-containers/tests倉庫的integration/containerd/runk/runk-tests.sh文件。測試會利用containerd自帶的調試工具ctr來調用runk,比如典型的容器啟動命令如下:

# --runc-binary 用于指定runk的路徑,從而使用runk而非默認的runc作為 OCI runtime
sudo ctr run --pid-file ${PID_FILE} --rm -d --runc-binary ${RUNK_BIN_PATH}  ${CONTAINER_ID}

5. 總結展望

在runk開發的過程中,我學習到了安全容器的基本架構,閱讀了一些容器相關的源碼(kata agent/runc/youki),并輔以動手編碼,加深了對 OCI runtime 細節的了解。在參與 ·kata· 社區的定期周會以及 GitHub issue 討論中,我學習到了開源社區的工作模式,也體驗到了開源社區的友好氛圍。在未來,我希望能夠繼續參與kata社區的開發,為kata社區的發展做出貢獻。短期目標來看,我會繼續專注runk,補全其他特性的開發,并持續跟進runk的測試,最終讓runk成為一個完善的 OCI runtime。

最后,感謝一直以來給予指導和review代碼的劉斌導師(@liubin)和Manabu Sugimoto(@ManaSugi)。

6. 個人介紹

我是來自中國科學院計算機網絡信息中心的研究生陳軼陽,研究方向是超算環境的容器應用。機緣巧合下從隔壁軟件所舉辦的開源之夏活動中知道了kata社區,并最終參加了GLCC開源夏令營,并做了一點微小的工作。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 容器
    +關注

    關注

    0

    文章

    503

    瀏覽量

    22312
  • OCI
    OCI
    +關注

    關注

    0

    文章

    14

    瀏覽量

    9055
  • runtime
    +關注

    關注

    0

    文章

    17

    瀏覽量

    2249
  • Rust
    +關注

    關注

    1

    文章

    233

    瀏覽量

    6868

原文標題:開源之夏總結 runk:基于 Rust 的 OCI runtime 實現

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦

    Rust GUI實踐Rust-Qt模塊

    Rust-Qt 是 Rust 語言的一個 Qt 綁定庫,它允許 Rust 開發者使用 Qt 框架來創建跨平臺的圖形界面應用程序。Qt 是一個跨平臺的應用程序框架,它提供了一系列的工具和庫,可以幫助
    的頭像 發表于 09-30 16:43 ?1850次閱讀

    Rust 語言中的 RwLock內部實現原理

    中的 RwLock 的內部實現原理、常用接口的使用技巧和最佳實踐。 RwLock 的內部實現原理 基本概念 RwLock 是一種讀寫分離的鎖,允許多個線程同時讀取共享數據,但只允許一個線程寫入數據。通過這種方式,可以避免讀寫操作之間的競爭,從而提高并發性能。 在
    的頭像 發表于 09-20 11:23 ?1043次閱讀

    如何在STM32 (Cortex M3)和GD32(RISC-V)上用Rust開發

    RUST HAL 實現剛好是華科本科生寫的,恰好我也是華科的研究生,太巧了 ;)所以用 rust 開發嵌入式不需要重復實現相同的功能,使用開源
    發表于 06-21 10:38

    關于Runtime的應用

    可以參看Apple開源Runtime代碼 和Rumtime編程指南 。 本文總結一些其常用的方法。 1 新建測試Demo 我們先創建一個測試Demo如下圖,其中TestClass是一個測試類
    發表于 09-25 15:10 ?0次下載
    關于<b class='flag-5'>Runtime</b>的應用

    如何構建可以支持Runtime模塊的自定義Substrate鏈

    substrate和并發runtime模塊是用rust開發的,rust是一種靜態類型語言,具有內存安全特性,提供速度和可靠性。 這是一個在區塊鏈開發中經常被忽視的主題,但對于采用是至關重要
    發表于 09-18 10:15 ?833次閱讀

    2022 開源|EMQ 三大開源項目開發圓滿收官

    今年暑假,EMQ 攜手開源,與高校學生開展了一場精彩紛呈的開源之旅。開源
    的頭像 發表于 11-23 16:02 ?879次閱讀
    2022 <b class='flag-5'>開源</b><b class='flag-5'>之</b><b class='flag-5'>夏</b>|EMQ 三大<b class='flag-5'>開源</b>項目開發圓滿收官

    橋CAM開源硬件

    電子發燒友網站提供《橋CAM開源硬件.zip》資料免費下載
    發表于 02-03 09:21 ?0次下載
    <b class='flag-5'>夏</b>橋CAM<b class='flag-5'>開源</b>硬件

    如何在同步的Rust方法中調用異步代碼呢?

    在同步的 Rust 方法中調用異步代碼經常會導致一些問題,特別是對于不熟悉異步 Rust runtime 底層原理的初學者。
    的頭像 發表于 03-17 09:18 ?2377次閱讀

    rust語言基礎學習: 智能指針Cow

    Rust中與借用數據相關的三個trait: Borrow, BorrowMut和ToOwned。理解了這三個trait之后,再學習Rust中能夠實現寫時克隆的智能指針Cow。
    的頭像 發表于 05-22 16:13 ?3160次閱讀

    基于Rust語言的高可靠、開源嵌入式Hypervisor

    Rust-Shyper 是北京航空航天大學計算機學院王雷教授團隊設計開發的虛擬機監控器,該系統基于 Rust 語言,實現了一個高可靠、嵌入式 Hypervisor。2023 年 2 月 15 日
    的頭像 發表于 05-24 16:31 ?2082次閱讀
    基于<b class='flag-5'>Rust</b>語言的高可靠、<b class='flag-5'>開源</b>嵌入式Hypervisor

    runtime 的一些對比選型和應用

    ? 01 概述 盡管 Tokio 目前已經是 Rust 異步運行時的事實標準,但要實現極致性能的網絡中間件還有一定距離。為了這個目標,CloudWeGo Rust Team 探索
    的頭像 發表于 05-26 15:48 ?921次閱讀
    <b class='flag-5'>runtime</b> 的一些對比選型和應用

    谷歌開源內部Rust Crate審計結果

    Rust 可以輕松地將代碼封裝和共享到 crate 中,crate 是可重用的軟件組件,就像其他語言中的包一樣。我們擁抱廣泛的開源 Rust crate 生態系統,既利用了谷歌以外編寫的 crates,也發布了我們自己的幾個
    的頭像 發表于 05-29 11:10 ?960次閱讀

    開源2023】聊?聊開源以及項目的進展(rt-thread上用CI來驗證軟件包的編譯情況)

    前言 開源是什么? ?先來簡單介紹?下開源。? 開源
    的頭像 發表于 08-24 20:05 ?1183次閱讀

    如何在同步的 Rust 方法中調用異步代碼 | Tokio 使用中的幾點教訓

    在同步的 Rust 方法中調用異步代碼經常會導致一些問題,特別是對于不熟悉異步 Rust runtime 底層原理的初學者。
    的頭像 發表于 12-24 16:23 ?1656次閱讀

    AI推理框架軟件ONNX Runtime正式支持龍架構

    近日,知名AI推理框架開源社區ONNX Runtime正式發布支持龍架構的版本1.17.0。
    的頭像 發表于 03-12 12:23 ?748次閱讀
    AI推理框架軟件ONNX <b class='flag-5'>Runtime</b>正式支持龍架構
    主站蜘蛛池模板: 天天插天天色 | 色老头网址 | 韩国三级观影久久 | 国产精品第九页 | 久久精品国产99精品最新 | 三级视频在线 | 亚洲精品老司机综合影院 | 五月婷婷丁香综合 | 俺来也俺来也天天夜夜视频 | 成人a网 | 五月婷婷俺也去开心 | japanese 69hdxxxx日本| 欧美片欧美日韩国产综合片 | 久久777国产线看观看精品卜 | 97人人射| 热re99久久精品国99热 | 成人久久久精品乱码一区二区三区 | 九色综合九色综合色鬼 | 色黄视频| 美女骚网站 | a一级黄 | 免费在线h视频 | 国产色视频一区 | 女张腿男人桶羞羞漫画 | 中文字幕不卡免费高清视频 | 老湿影院免费体验区 | 免费永久视频 | 国产在线视频欧美亚综合 | 色多多a | 久久国产乱子伦精品免费看 | 一区二区三区四区在线免费观看 | 喷潮白浆直流在线播放 | 亚洲成人免费观看 | 欧美三级网 | 男女同床爽爽视频免费 | 四虎永久影院 | 人人搞人人搞 | 男人和女人做免费做爽爽视频 | 丁香六月综合激情 | 天天躁日日躁成人字幕aⅴ 天天躁夜夜躁 | 91中文在线 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品