Linux 虛擬化打機心得 Part 1

長久以來,遊戲市場對於 Linux 平台絕對是沒什麼競爭力。原生遊戲稀少之餘很多時都沒人會玩,一般遊戲開發商對個人電腦市場亦只會推出 Windows 或是 Mac 版本。因此有一段很長時間, Linux 使用者主要靠 Wine 程式模擬 Windows 環境來玩 Windows 遊戲。

近年發展可能漸趨成熟,遊戲產業出現些微變化。例如以 Wine 為底層的 PlayOnLinux 提供一鍵安裝介面簡化玩 Windows 遊戲的難度。知名遊戲平台 Stream 亦提供 Linux 客戶端;除此以外更進一步推出 Linux 發行版 StreamOS,為改善開源遊戲市場做出不少貢獻。

由於先天性的技術限制 ,Wine 效能不佳,能成功運行的遊戲並不多。Wine 開發進度緩慢目前只支援到 DirectX 9.0 c ,意味著過去數年推出的遊戲大部分都玩不了。 Value 在 Steam 上的努力確實帶動不少社群投入開源遊戲移植與開發。但相關工作有不少難度且非一朝一夕之事,要令全數遊戲支援 Linux 系統更是天方夜譚。

筆者主要使用 Linux 系統多年,工作上以至生活習慣經已無法脫離。解決辦法例如 Dual Boot 缺點是不能同時間享受兩個系統帶來的好處,另外再買一台電腦玩遊戲會太花錢又浪費空間。剛好最近家中多出一張顯示卡,如果花點時間弄弄就能在原有的 Linux 系統上玩不同的主流遊戲,Why not?

若果想法相同,下面的心得或者會適合你。

VGA Passthrough

VGA Passthrough 並非新事物,技術已經存在多年。簡單來說就是透過虛擬化技術把連接了顯示卡的插槽穿透虛擬層,直接將物理設置連接到虛擬機 (PCI Passthrough) ,實現與裸機系統相比接近零差距的效能表現。

再簡單一句話就是,在 Linux 系統上設一台 Windows 虛擬機打遊戲。

Linux 虛擬化技術

1_nFUPIlIUkFwETptGO4iFvA.png
KVM 架構圖

KVM (Kernel-Based Virtual Machine) 是一個 Linux 內核模組提供硬件全虛擬化,結合 QEMU 模擬器組成全虛擬機技術,利用 libvirt 進行虛擬設備管理。

以下是筆者的電腦規格,設備上可能有點舊,不過操作上絕無區別。唯一需要注意是使用新舊版 Ubuntu 指令是否會有不同。下面的內容主要是針對 Intel / NVIDIA 架構而設,除此以外的配備(如 AMD/ATI )在設定上會有些微不同,那部分就留待大家自行尋找。

Software
Host OS: Ubuntu 16.04.5 LTS
Hardware
CPU: Intel® Xeon(R) CPU E3–1245 V2 @ 3.40GHz × 8
Motherboard: Gigabyte GA-H77N-WIFI (LGA 1155, Intel® h77 chipset)
Memory: Kingston 16GB (2x8GB DDR3 1600Mhz)
Graphic: Gigabyte NVIDIA GTX 1050 Ti

硬件檢測

實現全虛擬化技術需要硬件支援,並非任何一台電腦都適合的,基本上查一下 CPU 和 主機板的規格就能斷定 。以 Intel 架構來說我們需要確認 VT-x VT-d 兩者有否支援。如果是知道處理器型號的話,比較簡單的就是到官方網站看規格:https://ark.intel.com/zh-tw

1_JRkKrusrd6MY3fF73raUdw.png
Intel 官方網頁會標示出 CPU 的 VT-x , VT-d 的支援狀況

至於主機板的支援情況比較模糊,還是直接在電腦上操作比較理想。

VT-x (Intel Virtualization Technology)

運行以下指令,若果回傳 vmx 則代表 CPU 支援 VT-x 技術。

> grep --color vmx /proc/cpuinfo

不過支援歸支援,能不能用有沒有打通是另一回事。

輸入下面指令,回傳 3 或 5 代表 VT-x 功能已經正常啟動:

> sudo apt-get install msr-tools -y 
> sudo modprobe msr          # load msr module
> sudo rdmsr 0x3a            # check if VT-x is enabled in UEFI

簡單 3 行指令看似複雜,背後意思其實是在查閱 CPU MSR 寄存器的值; 地址 0x3a (IA32_FEATURE_CONTROL) 控制 Intel VT-x 功能的開關。

注意 VT-x 功能必需在 BIOS 設成啟用,若果以上指令回傳其他數值不妨到這𥚃檢查一下再重試。

1__QnQncTIdhLgtWyBM2jJ3Q
BIOS VTx 設定

IOMMU

 

1_lYWkCsMmqqVPgYmFT1zTbw.png
IOMMU功能啟動後系統的運作結構

IOMMU(Input/Output Memory Management Unit)是北橋技術的一部分,實現例子有 VT-d (Intel Virtualization Technology for Directed I/O) 或是 AMD-Vi (AMD’s I/O Virtualization Technology),其作用是實踐I/O虛擬化,能夠將不同的物理I/O設備分配到虛擬機或與虛擬機群共用。上面提到的 VGA Passthrough 技巧就是透過 IOMMU 達成。

同樣地,Vt-d 功能需要在 BIOS 中啟用 ,預設是關閉的。若果你找不到這個設定,很大可能代表這張主機板沒有 Vt-d 功能。必須換一張有 Vt-d 功能的主機板才能繼續下面各部分。

1_rYSFxUAk82flWJuRHoC_tg.jpeg
BIOS VT-d 設定

在 Ubuntu 中啟用 IOMMU

打開 /etc/default/grub 尋找下面這個變數,在引號最後位置添加intel_iommu=on

GRUB_CMDLINE_LINUX_DEFAULT="…"

例子:

# 添加前
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# 添加後
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"

輸入 update-grub 更新 grub 設置後重啟電腦。

檢查 IOMMU 啟用狀態

網上普遍方法是查閱系統啟動訊息,筆者發現很多教學都是用下面這個方法來確認,但其實不準確甚至可以說是錯誤的。

> dmesg | grep -i iommu
DMAR: IOMMU enabled …

這個方法實際上只是在系統啟動時檢查 grub 是否帶有 “intel_iommu=” 參數,除此以外別無其它用意。正確的做法應該是這樣:

dmesg | grep "Directed I/O"
0_-48j7vu0WA_KBgp4

無法成功打開的朋友們很抱歉,這代表該設備不具備全虛擬化能力,你可以嘗試更換一下處理器或者主機板。重點是必需通過這一關才能繼續下一個部分。

開機模式

近代電腦的開機模式 (Boot Mode) 通常是用 UEFI 模式而非舊有的 Legacy BIOS。除非特別原因,否則安裝主流 Linux Distros 例如 Ubuntu,在一般情況下預設會以 UEFI 模式安裝。

驗證方法相當簡單,如果以 UEFI 啟動系統會掛載 efi 目錄,否則就是以 Legacy BIOS 啟動。用下面指令查一下該目錄是否存在:

ls /sys/firmware/efi

在接下來的內容會以 UEFI 模式進行,若發現系統用的是 Legacy BIOS,你可能需要找方法設成 UEFI。
事實上顯示卡亦需確認是否 UEFI-Ready。由於驗證方法比較麻煩,而且近年大部分的都支援 UEFI,選用主流顯示卡應該沒有問題,超過八年以上的才有需要核實一下。

上面提到的兩種啟動模式,其實都有機會達成目的。如果你的顯示卡太舊不妨嘗試以 Legacy BIOS 方式操作,設定上有些微不同且步驟較多,詳細要自行到網上搜索。

圖像處理器

要成功 VGA Passthrough,電腦設備必需要有至少 2 個圖像處理器,簡單達成方法有:

  1. 2張外置顯示卡
  2. 1張外置顯示卡,1個內置顯示的處理器

用指令確認系統是不是偵測到 2 個 VGA :

lspci | grep VGA

0_dB7y_lv8ax7Nx2ll.png
偵測出 2 個圖像控制器

(1)憑肉眼相信已經可以確認,所以上面方法是為(2)而設。這一步主要是了解正在使用的處理器是否具有內置顯示能力。除了可以從官方網站確認之外,在電腦上直接操作也行。另外這個方法對 (1) 亦適用。

如果 CPU 內置圖像處理器,Intel 官方網站會列出其規格

到這𥚃硬件檢測的部分就結束了。如果上面沒問題代表硬件已經準備就緒,剩下的都是軟件問題。

待續 –

Advertisements

ISCSI 設定筆記 (2): Ubuntu 上使用 Initiator 連接 ISCSI Target

尋找指定 IP 的 ISCSI Server 所提供的 ISCSI Target :

iscsiadm -m discovery -t sendtargets -p 172.0.0.1

顯示基本連接設定:

iscsiadm -m node -p 172.0.0.1 -o show

更改設定的格式如下:

iscsiadm -m node -p 172.0.0.1 -o update -n <name> -v <value>

或者

iscsiadm -m node -p 172.0.0.1 --op=update --name=<name> --value=<value>

設定成以用戶登錄:

iscsiadm -m node -p 172.0.0.1 -T "iqn.2013-8.com.osiutino:target0" -o update -n node.session.auth.authmethod -v CHAP
iscsiadm -m node -p 172.0.0.1 -T "iqn.2013-8.com.osiutino:target0" -o update -n node.session.auth.username -v username
iscsiadm -m node -p 172.0.0.1 -T "iqn.2013-8.com.osiutino:target0" -o update -n node.session.auth.password -v password

開機自動連接這個 target:

iscsiadm -m node -p 172.0.0.1 -o update -n node.conn[0].startup = automatic

手動登錄:

iscsiadm -m node -p 172.0.0.1 --login

出現以下訊息代表登錄成功

Logging in to [iface: default, target: iqn.2013-8.com.osiutino:target0, portal: 172.0.0.1,3260] (multiple)
Login to [iface: default, target: iqn.2013-8.com.osiutino:target0, portal: 172.0.0.1,3260] successful.

手動登出:

iscsiadm -m node -p 172.0.0.1 --logout

若果剛才入登錄成功,在終端機中輸入以下指令即可查閱該 target 的磁碟資訊:

 fdisk -l 

SAN/iSCSI/open-iscsi – Debian Wiki

Ubuntu 12.04 LTS – Configure iSCSI Initiator : Server World

Ubuntu 12.04 LTS – Configure iSCSI Target : Server World

ISCSI 設定筆記 (1): Ubuntu 上架設 ISCSI Server

最近改動一下備份方案,打算掛載多個 iscsi targets 作備份之用,並且順便寫份筆記做個記錄。

利用 ssh 連接到 ubuntu server ,輸入以下指令找出建立 iscsi target 的磁碟:

fdisk -l

輪出如下:

Disk /dev/sda: 256.1 GB, 256060514304 bytes
255 heads, 63 sectors/track, 31130 cylinders, total 500118192 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000cca3d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758   500117503   249807873    5  Extended
Partition 2 does not start on physical sector boundary.
/dev/sda5          501760   500117503   249807872   8e  Linux LVM

Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
81 heads, 63 sectors/track, 382818 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000abc

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048  1953525167   976761560   83  Linux

在 sdb1 上建立 physical volume :

pvcreate /dev/sdb1

查看一下 server 上 physical volume(s) 的資訊:

pvdisplay

新增 1 個 volume group:

vgcreate vg_target0 /dev/sdb1

如同 pvdisplay, 輸入以下指令即可查看 本機 volume group(s) 資訊:

vgdisplay

新增 1 個 100Gb 的 logical volume:

lvcreate -L 100G -n lv_target0 vg_target0

查看這個 LV:

lvdisplay

修改這個設定檔:

vim /etc/iet/ietd.conf

加入以下設定資料:

Target iqn.2013-8.com.osiutino:target0
	LUN 0 Path=/dev/vg_target0/lv_target0,Type=blockio	
	initiator-adress 172.0.0.2
	incominguser username password
	alias LUN1

重啟服務以載入新設定:

service iscsitarget restart

Using iSCSI On Ubuntu 10.04 (Initiator And Target) | HowtoForge – Linux Howtos and Tutorials

酷爾的家: 在Ubuntu 使用 iSCSI Initiator

鳥哥的 Linux 私房菜 — 網路磁碟裝置:iSCSI伺服器

remotely connect to Matlab

Prepare two machines. In my case:

  • remote machine (ubuntu 13.04 x64)
  • local machine ( macbook air with Mac OS X 10.8 )

Basic Setup

  1.  Install Matlab application to Ubuntu Desktop.
  2.  By typing the following command in the terminal on the Mac, Matlab would be started in client-side.

ssh -X REMOTE-HOST “matlab -desktop”

Speed Up

Using the default setting would produce  poor performance if it is over 3G connection. Thus, it is recommended to apply the following optimization.

  • Switch to server-side and then create a file call java.opts  with a statement -Dsun.java2d.pmoffscreen=false  under the home directory, or simply run this command:

echo “-Dsun.java2d.pmoffscreen=false” > ~/java.opts

  • we can use SSH with compression and a faster encryption algorithm , blowfish which make the application smoother.

ssh -c arcfour,blowfish-cbc -Y -C -X REMOTE-HOST -p PORT “matlab -desktop”

SSH login without password

  1. run the following command in server-side and client-side to generate SSH key :

    ssh-keygen -t rsa

  2. import the client’s public key to the server:

    cat .ssh/id_rsa.pub | ssh REMOTE-HOST ‘ cat >> .ssh/authorized_keys’

Trouble Shooting

matlab: command not found

This error means  the PATH variable is not pointed to it. You have two options to solve such problem.

  • Create a symbolic link in /usr/local/bin and point to the executable binary of Matlab , in my case which is  “/usr/local/MATLAB/R2013a/bin/matlab”.

ln -s /usr/local/bin/matlab “/usr/local/MATLAB/R2013a/bin/matlab”

  • Run the program with absolute path.

ssh -X REMOTE-HOST “/usr/local/MATLAB/R2013a/bin/matlab -desktop”

Demo

References

C Plus / Add: Speeding up Matlab over X11 Forwarding

linux – Remotely Connect to Matlab – Stack Overflow

Linux X11 Connection Rejected Because of Wrong Authentication Error and Solution

Nexmo SMS API ( CSharp Library )

最近因為Project 關係,需要即時通知使用者最新情況,想到了最近流行的 WhatApp, Line 可惜並非 OpenSource 。由於不過是私人Project ,玩玩而已。搜了一陣子,發現 Nexmo 這個恩物。Nexmo  是 個 SMS Service 可以用來收發短訊,重要的是提供了API 。雖然是收費的,但剛註冊成會員後,馬上有EUR$ 2 可以使用。一個訊息收費是 EUR$ 0.013 ,這至少可以用150多次。由於我需求不大,間中可能發一兩個而已,這EUR$ 2足夠我用很久了。 Pre-built Libraries只提供以下語言:

PHP /Ruby / Node.js/ Python/ Perl/ Java

官方沒提供 .Net Library ,只可自已動手做啊! 目前功能非常陽春 ,只支援 JSON 格式

Nexmo-CSharp-lib  Sample Screenshot

在 ubuntu 11.10  mono 2.10 環境下運作亦相當正常。稍後會附上 source code。

Source Code : https://github.com/siutin/Nexmo-CSharp-lib

相關連結:

Nexmo – Introduction – Before you get started
CodeIgniter 透過 Nexmo 傳送簡訊 Mobile Messaging | 小惡魔 – 電腦技術 – 工作筆記 – AppleBOY
用 Nexmo 送簡訊 | Gea-Suan Lin’s BLOG

如何將PC 轉成 VM

最近買了acer aspire one 255e 代替了那台用了差不多快6年的eeepc 901,然後這個越用越慢的東西被我封塵了一個多月。這台SSD應該要快掛了,於是今天便做個備份,把整台機轉成VM。

在 host PC 上安裝 VMware vCenter Conveter ,以remote machine 方式連接 eeepc 901 不成功,似乎是出現了permission problem。

google 了一下,找到了出現相同問題的朋友

http://communities.vmware.com/thread/286339

根據mediawideCasaDelGato的解決方法,我在eeepc 上使用  VMware vCenter Conveter 以local machine 方式做轉換,並且mapping drive 把VM 放到host PC 上。

此時出現另一個問題

FAILED: Undable to create a VSS snapshot of the source volume(s). Error 2147754758 (0x80042306).

解決方法如下:

1. 啓動服務   Microsoft Software Shadow Copy Provider Service  , Volume Shadow Copy Service

2. 把source machine 的 Harddisk 格式轉成  NTFS

本來以為沒問題了,到了98%郤又出現問題:

FAILED : Unable to find the system volume,reconfiguration is not possible.

這個原來是 boot.ini 出問題,因為轉到了vm machine 設備都不同了,要打開它做修改。

這時最好掛上這個 vmdk file 到已有的VM,再做修改。

完成了!!!