LXD共享方案 續

2021-09-02 02:38:46 字數 2714 閱讀 3167

前面介紹了lxd,並詳細描述了使用lxd來搭建實驗室gpu共享伺服器方案,經過測試該方案完全可行。但是在最近的使用中坑了一把,lxc容器掛了,所有的容器都啟動不起來,於是開始了各種找問題。

因為啟動失敗log的資訊太少,而網上關於lxd的解決方案現在還是比較少的,google不到相關的解答,於是開始試錯。

經過各種配置測試:

取消gpu掛載

使用基礎映象啟動

使用預設配置啟動

發現使用預設配置能夠啟動所有容器,於是使用控制變數法乙個個排查自己插入的配置,最後發現nvidia.runtime: true配置是導致容器啟動不起來的元凶,最終原因是因為在某次伺服器執行了apt upgrade而更新了nvidia-container-runtime,而lxd仍然保持這3.0.1版本,不支援新版本的nvidia-container-runtime,所以在配置了nvidia.runtime: true之後,容器全部掛掉,啟動失敗。

發現問題,自然就好解決了,在lxd官網查到lxd最新版本已經是3.7.0了,而目前apt源上最新的版本是3.0.1,新版本增加了比較多的對於 nvidia gpu 的支援與設定引數,考慮手動編譯lxd 3.7.0

snap中的lxd包版本:

# sudo snap find lxd

lxd-demo-server 0+git.f3532e3 stgraber - online software demo sessions using lxd

lxd 3.7 canonical✓ - system container manager and api

nova ocata james-page - openstack compute service (nova)

satellite 0.1.2 alanzanattadev - advanced scalable open source intelligence platform

nova-hypervisor ocata james-page - openstack compute service - kvm hypervisor (nova)

可以看到snap中 lxd的版本為3.7,下面是使用安裝命令:

sudo apt install snap

snap install lxd

考慮到對於容器使用者的支援,更換了nvidia驅動和cuda版本,全部換成當前最新的版本,以支援使用者在容器中能夠跑起來最新的cuda版本(宿主機的驅動和cuda需要相容容器內的cuda版本)。同時使用一種更加簡單的方式來裝driver和cuda:

# 首先解除安裝當前cuda和驅動

sudo /usr/local/cuda-9.2/bin/uninstall_cuda_9.2.pl # 之前裝的cuda9.2

sudo

apt-get purge nvidia*

# 加入nvidia驅動源

sudo add-apt-repository ppa:graphics-drivers

sudo

apt-get update

# 查詢並安裝推薦版本(一般是最新穩定版)

ubuntu-drivers devices

sudo ubuntu-drivers autoinstall

# 安裝當前最新版本cuda10

wget

sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb

sudo apt-key adv --fetch-keys

sudo

apt-get update

sudo apt install cuda

在初始化lxd和匯入模板映象之後(參考前文),容器啟動和執行一切正常。因為經過一段時間的測試,考慮到實際問題,給使用者更友好的環境,對共享方案進行了公升級。

之前是給使用者主機許可權,發現並不是很合適,決定不讓使用者接觸到主機層,直接通過埠對映將容器裡的22埠對映到主機上,讓使用者使用ssh遠端登陸容器進行操作從而完全規避主機。

lxd裡提供了命令來繫結容器與主機的埠,於是使用乙個簡單的指令碼來一鍵進行容器的建立和埠繫結:

# container_init.sh

##############

#/bin/bash

# $1 : name

# $2 : gpu select

# $3 : port

lxc init template $1 -p $2

lxc config device add $1 sshproxy proxy listen=tcp:0.0.0.0:$3 connect=tcp:localhost:22

lxc start $1

lxc exec

$1passwd root

這只是乙個簡單的指令碼,如果需要加入更多的功能可以根據具體情況新增,目前來說夠用了。

session共享方案

session 機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構來儲存資訊。session資訊預設是以檔案的形式儲存在服務端的。當程式需要為某個客戶端的請求建立乙個 session 的時候,伺服器首先檢查這個客戶端的請求 http request 裡是否已包含了乙個 session 標識 ...

Session 共享方案

一 什麼是分布式系統?分布式系統 旨在支援應用程式和服務的開發,可以利用物理架構由多個自治的處理元素組成,不共享記憶體,通過網路傳送訊息合作。分布式系統的三個特點 多節點,訊息通訊,不共享記憶體。二 什麼是session?廣義的session 指會話控制。由於http協議是無狀態的,對於不同http...

DV Arbiter驗證方案分享(續)

前言 前回分享了arbiter驗證的基本思想 link 下面做乙個推廣。並且提供一種使用generate來做assert和cover property的方法。一 round robin arbitor的驗證。對於乙個n輸入的round robin arbitor,需要用n個counter去統計回ac...