Android基于Docker容器的双系统多开实现和自动化部署
GitHub:https://github.com/Pangu-Immortal
本文技術涉及基于Docker容器的移動端雙系統實現系統及方法,所述系統包括相互連接的內核層及應用程序層,其中,應用程序層包括Docker模塊以及Docker模塊根據Docker創建的多個容器,所述內核層包括LSM模塊,所述LSM模塊用于對多個容器內的進程進行訪問控制。本文技術提供的基于Docker容器的移動端雙系統實現系統及方法,可有效阻止Docker容器進程對宿主機中沒有被隔離文件資源的訪問,完善了Docker容器與宿主機之間的訪問控制機制,可滿足多元場景的實用性及移動端的安全性,同時又可以省去多個移動端切換使用的復雜性。
前幾年預研加開發Android雙系統,中途用過不少開源代碼或者研讀過大牛BLOG,現開放雙系統設計原理來回報社區。
Android容器技術已在Android 6 7 8 9 10 11 12版本中分別實現并應用。
原型來自于哥倫比亞大學虛擬化實驗室的一篇論文(也有一個DEMO),后來一個以色列公司cellrox在2014年進行了商業化,2015年的時候浙大一個操作系統實驗室也出了一個DEMO(名稱叫Condroid)。
哥大論文地址:http://systems.cs.columbia.edu/projects/cells/
浙大項目地址:http://condroid.github.io/
以色列公司官網:http://www.cellrox.com/
GitHub:https://github.com/Pangu-Immortal
浙大項目本來有源碼,由于一些原因目前只剩下文檔,對Android源碼比較熟悉能復原程序。
原理:
同docker、lxc、cells原理一致,利用kernel中的namespace+cgroup來實現Android容器系統。
容器啟動:
要有一個能啟動init進程的容器管理進程,該進程是rc service服務進程(celld),負責啟動、關閉和切換容器,管理和分配容器需要的系統資源。
【技術實現步驟摘要】
基于Docker容器的移動端雙系統實現系統及方法
本文技術涉及計算機安全,具體涉及一種基于Docker容器的移動端雙系統實現系統及方法。
技術介紹
隨著科技水平的發展,移動智能終端和移動互聯網也得到了充分的進步,搭載主流移動操作系統(IOS、Android)的移動智能終端數量呈現爆炸式增長。其中,由于Android手機有著相對優勢的性價比,在市場中占有很大的比重,與此同時,Android應用為了滿足用戶的需求也呈現出爆炸式增長的趨勢。如今,很多的人士由于業務的需要,往往需要攜帶兩部或者以上的手機來適應不同的場景,比如生活和工作相分離的場景,對于一些特殊的人群(保密人員、公務員)等就一定需要考慮到安全的問題。雖然Android原生系統從底層內核到上層app應用添加了多種安全措施,確保手機系統的安全性,但是還依然存在著安全問題,比如Linux內核的攻擊,對上層app應用的攻擊。隨著惡意程序的增多,用戶的隱私及數據會受到很大的威脅。虛擬化技術是對系統硬件資源進行抽象化并進行管理,然后向上層提供統一的接口,加入虛擬化技術后,系統間的硬件的差異化就被透明化了,比如,當選擇一種操作系統時就可以不用關心底層硬件的處理器指令集。虛擬化技術的引入,慢慢解決了系統中軟硬件緊密耦合的關系,可以在同一個物理機上能夠同時運行多個操作系統實例,使得系統能夠充分利用硬件資源。目前,虛擬化技術解決方案可以在不同層次上實現,不同的實現方式和抽象層次對應的虛擬化有不同特性。按實現的技術不同,虛擬化可以分為指令級虛擬化、硬件級虛擬化、操作系統級虛擬化以及編程語言級虛擬化4種。指令級虛…
【技術保護點】
1.一種基于Docker容器的移動端雙系統實現系統,其特征在于:所述移動端雙系統實現系統包括相互連接的內核層及應用程序層,其中,應用程序層包括Docker模塊以及Docker模塊根據Docker創建的多個容器,所述內核層包括LSM模塊,所述LSM模塊分別與應用程序層內的各容器連接,用于對多個容器內的進程進行訪問控制。
【技術特征摘要】
- 1.一種基于Docker容器的移動端雙系統實現系統,其特征在于:所述移動端雙系統實現系統包括相互連接的內核層及應用程序層,其中,應用程序層包括Docker模塊以及Docker模塊根據Docker創建的多個容器,所述內核層包括LSM模塊,所述LSM模塊分別與應用程序層內的各容器連接,用于對多個容器內的進程進行訪問控制。
- 2.如權利要求1所述的基于Docker容器的移動端雙系統實現系統,其特征在于,所述LSM模塊包括:系統調用模塊,用于通過命名控制機制對容器中的進程進行定位,以判斷內核層中的進程是否是對應的容器中的進程;錯誤檢查模塊,與系統調用模塊連接,用于對容器中的進程進行錯誤檢查;數字模擬轉換器,與錯誤檢查模塊連接,用于轉換容器中的進程文件的格式;安全決策模塊,與數字模擬轉換器連接,用于判斷容器中的進程文件是否是內核層的保護文件;訪問權限判斷模塊,與安全決策模塊連接,用于根據安全決策模塊的判斷結果判斷容器中的進程是否具有訪問權限。
- 3.如權利要求2所述的基于Docker容器的移動端雙系統實現系統,其特征在于:所述系統調用模塊通過Open系統調用程序完成對容器中的進程的定位。
- 4.如權利要求2所述的基于Docker容器的移動端雙系統實現系統,其特征在于:所述安全決策模塊通過其內設置的鉤子函數判斷容器中的進程文件是否是內核層的保護文件。
- 5.如權利要求2所述的基于Docker容器的移動端雙系統實現系統,其特征在于:所述LSM模塊還包括錯誤信息返回模塊,與安全決策模塊連接,用于在容器中的進程文件不是內核層的保護文件的情況下,返回錯誤信息,并結束容器中的進程的系統調用。
文件系統:
容器的文件系統是在celld中構建,用到chroot、mount、mnt namespace等技術,android系統每個分區掛載實現機制如下:
1、根分區掛載:在主系統的data分區目錄中mount rootfs文件系統,當做容器系統的根分區。
2、system分區掛載:將主系統的system目錄mount(bind)成容器系統的system分區。
3、data分區掛載:在主系統中創建一個臨時目錄,然后把這個臨時目錄mount成容器系統的data分區。
4、sdcard掛載:原理同data分區掛載機制一致,android 6以后sdcard實現機制一直在變,這里需要注意一下是否需要變更。
5、根分區的所有文件需要主動創建或者復制,system分區則不需要。
init進程:
在celld中主動啟動init進程,當做容器系統的init根進程,在celld源碼中有如下大致步驟:
1、利用clone系統調用啟動容器系統的init進程。
2、clone系統調用需要一系列namespace標記來創建屬于容器系統的命名空間。
3、然后需要給這個init進程分配cgroup資源。
4、最后需要調用chroot函數給容器系統分配根目錄,實際上它是主系統中的一個目錄而已。
binder設備的虛擬化:
這個驅動是android系統的核心,第一步一定要把它實現好,因為所有的android service都會注冊到binder驅動中,容器系統的android service同樣會注冊到binder驅動中的,那么問題來了,相同的實名binder服務名只能注冊一次,容器系統注冊相同名稱的binder服務會產生沖突。binder驅動是一個字符設備,所以binder驅動虛擬化就是重新構造binder的數據結構,讓容器系統能在binder驅動中有其獨立的數據結構,這個驅動的源碼,在哥大的DEMO中是有的,有興趣的可以參考。此外binder驅動的虛擬化還要實現一個很重要的功能,就是容器之間能互相訪問對方的android service,這樣后續很多設備的虛擬化就可以在此基礎上實現。
display虛擬化:
顯示的虛擬化要利用容器系統間能互相訪問service才能實現,主系統運行surfaceflinger,容器系統不運行surfaceflinger,而是通過binder驅動訪問主系統的surfaceflinger,當然surfaceflinger的代碼也得調整,讓主系統和容器系統的surface互相不干涉。這個驅動的虛擬化,在哥大的demo中也有實現,不過哥大的demo是在android4.4的基礎上實現的,當時android源碼中還沒有ion這個驅動,android5.0以后有了ion這個驅動以后,哥大的display虛擬化方式是無效的,有興趣的可以看一看,它在內核中實現,簡單過程如下:
1、display虛擬化的重點在于,非當前系統也需要實時更新畫面,不能簡單粗暴的進行阻截,只是這個非當前系統的畫面要隱藏起來,不能投射到屏幕中。
2、當非當前系統使用mmap映射顯存時需要映射的是內存,將所有像素數據保存在內存中。
3、當發生系統切換時,就可以將內存中的像素數據復制到顯存當中。
input虛擬化:
觸摸屏的虛擬化,哥大的demo也有,非常精良可以看看,主要思路就是:阻截非當前系統的event事件上報,同時需要注意系統切換時容易造成“留點”問題。
網絡的虛擬化:
網絡的虛擬化有兩塊,一個是wifi的,另一個則是數據流量的,但是二者實現原理都是一樣的,有三種虛擬化方式:
1、容器系統不隔離網絡namespace,所有容器系統和主系統共享七層網絡,但會有很多問題需要解決,同時也不太安全,或者叫不太敢用,如local socket 不能同名、netlink socket ID不能相同等。
2、網絡設備運行在主系統中,利用veth網絡設備聯通容器系統和主系統,而在第三層網絡中實現路由轉發,這種方式與android原框架融合性比較好。
3、網絡設備運行在主系統中,利用veth網絡設備聯通容器系統和主系統,而在第二層網絡中實現橋接,這種方式不適合wlan,因為wifi只有p2p模式和熱點模式,不能進行橋接,數據流量是可以的。
好了,到此一個運行于手機中的容器android基本就能跑起來了,其實只要實現binder的虛擬化和display的虛擬化就能跑起來了!
基本命令
搜索可用的鏡像 FarleydeMacBook-Air:~ Farley$ docker search tutorial下載容器鏡像 docker pull learn/tutorial在docker容器中運行 docker run learn/tutorial echo "hello"在容器中安裝新的程序 docker run learn/tutorial apt-get install -y ping保存對容器的修改 FarleydeMacBook-Air:~ Farley$ docker ps -l運行docker commit,可以查看該命令的參數列表。 FarleydeMacBook-Air:~ Farley$ docker commit 然后把這個鏡像保存為learn/ping。 docker commit 58e8 learn/ping運行新的鏡像 docker run learn/ping ping www.baidu.com發布docker鏡像 docker images命令 可以列出所有安裝過的鏡像。 docker push命令 可以將某一個鏡像發布到官方網站。GitHub:https://github.com/Pangu-Immortal
總結
以上是生活随笔為你收集整理的Android基于Docker容器的双系统多开实现和自动化部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android12 Jetpack Sp
- 下一篇: Android多开和虚拟化--Docke