2017年6月28日 星期三

設定 VirtualBox VM 的 service


註冊 VM,然後列出現有的 VM。
ajax $VBoxManage registervm ~/VirtualBox\ VMs/Win7-work/Win7-work.vbox
 ajax $ VBoxManage list vms
"Win7-work" {5ca8a108-379f-410a-a1e5-ac6d46ad2ac9} 

移除 VM 的註冊。
ajax $VBoxManage unregistervm "Win7-work"

建立 /usr/lib/systemd/system/vboxvmservice@.service
[Unit]
Description=VBox Virtual Machine %i Service

[Service]
User=ajax
Group=vboxusers
ExecStart=/opt/bin/VBoxHeadless -s %i
ExecStop=/opt/bin/VBoxManage controlvm %i savestate

[Install]
WantedBy=multi-user.target


啟動 VM 的服務
ajax $sudo systemctl start vboxvmservice@Win7-work.service

列出啟動的 VM 的服務
ajax $systemctl list-units | grep vbox
vboxvmservice@Win7-work.service          loaded active running   VBox Virtual Machine Win7-work Service                                                           
system-vboxvmservice.slice                      loaded active active    system-vboxvmservice.slice 

rebuild 會幾乎把所有的 package 都重新裝一次,

2017年6月18日 星期日

megaraid 操作 -- 於 Acer Altos R360 f3 伺服器

此篇本是為 Acer 的伺服器而整理,到後來變成 megaraid 的操作整理,就把標題給改了。
-- 2020-03-07 記

新購一部 Acer Altos R360 f3 伺服器 (2016 年),整理一下相關資料,以供日後參考。
機器原本是裝 vSphere ESXi,最近想玩 Docker,就重灌 Gentoo Linux。選擇 Gentoo,因為它是滾動發行,沒有升級的問題。另外,因為要自己編 kernel,必須先收集相關的硬體資訊,不然,就無法正常開機了。

Acer Altos R360 f3 的配備

CPU Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz (family: 0x6, model: 0x4f, stepping: 0x1)
8 x 2.5" disks
Intel Integrated RAID Module RMS3CC080
Intel I350 Gigabit Network Connection

嗯,相對於買 HP 或 ASUS 的伺服器,買宏碁的伺服器的好處是,8個磁碟的 tray 都附上,可以買自己想買的磁碟,不用多花錢。

可惜透過中信局買的 Acer 伺服器,只能用 2.5" 的硬碟。而 後來買的 ASUS 伺服器則採比較聰明的作法,在 3.5" 的硬碟匣 (tray) 上的打洞,可同時裝 2.5" 的硬碟,所以後來都買 ASUS 伺服器,雖然要再另外買硬碟匣,但還是比較划算。

lspci 顯示的硬體資料

01:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)
03:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
07:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200e [Pilot] ServerEngines (SEP1) (rev 05)

dmesg 摘要

megaraid cmm: 2.20.2.7 (Release Date: Sun Jul 16 00:01:03 EST 2006)
megaraid: 2.20.5.1 (Release Date: Thu Nov 16 15:32:35 EST 2006)
megasas: 06.811.02.00-rc1
megaraid_sas 0000:01:00.0: FW now in Ready state
scsi host10: Avago SAS based MegaRAID driver
scsi 10:2:0:0: Direct-Access     Intel    RMS3CC080        4.66 PQ: 0 ANSI: 5
random: fast init done
sd 10:2:0:0: [sda] 1167966208 512-byte logical blocks: (598 GB/557 GiB)

igb: Intel(R) Gigabit Ethernet Network Driver - version 5.4.0-k
igb 0000:03:00.0: added PHC on eth0

将 megaraid 卡磁盘 raid0 改为 JBOD 模式

相關說明,參考: 将 megaraid 卡磁盘 raid0 改为 JBOD 模式
megaraid 卡使用 JBOD 模式,磁盘可以直接被系统识别,使用 smartctl 查看 SMART 信息和 直连 SAS 卡一样。
# megacli -PDList -aALL -Nolog|grep '^Firm'
Firmware state: JBOD
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up

行有時候要確定那個硬碟壞了,用 grep 的 OR 條件來找,比較快。

# megacli -PDList -aALL -Nolog | grep '^Firm\|Slot'
Slot Number: 0
Firmware state: JBOD
Slot Number: 3
Firmware state: Online, Spun Up
Slot Number: 4
Firmware state: Online, Spun Up
Slot Number: 6
Firmware state: Failed
Slot Number: 7
Firmware state: Online, Spun Up
Slot Number: 8
Firmware state: Online, Spun Up
Slot Number: 9
Firmware state: Online, Spun Up
Slot Number: 10
Firmware state: Online, Spun Up
Slot Number: 11
Firmware state: Online, Spun Up

硬碟使用紀錄

為了省錢,使用4顆 HGST 的 SATA 1TB 硬碟,建立 RAID 6 。2017年 6月,11月中,壞掉一顆,繼續觀察中。
後來,試著把它重插回去,看起來又是正常的。下指令,結果如下

# megacli -PDList -aALL -Nolog|grep '^Firm'
Firmware state: JBOD
Firmware state: Online, Spun Up
Firmware state: Rebuild
Firmware state: Online, Spun Up
Firmware state: Online, Spun Up

查看硬碟的編號如下
# megacli -PDList -aALL -Nolog|grep -iE 'enclosure device id|slot Number'
Enclosure Device ID: 0
Slot Number: 0
Enclosure Device ID: 0
Slot Number: 3
Enclosure Device ID: 0
Slot Number: 4
Enclosure Device ID: 0
Slot Number: 6

RAID 6 壞掉一顆硬碟,查詢的狀態
# megacli -ldinfo -lALL -aALL
                                     
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 1 (Target Id: 1)
Name                :VD_24TB
RAID Level          : Primary-6, Secondary-0, RAID Level Qualifier-3
Size                : 21.830 TB
Sector Size         : 512
Is VD emulated      : Yes
Parity Size         : 10.915 TB
State               : Partially Degraded
Strip Size          : 256 KB
Number Of Drives    : 6
Span Depth          : 1
Default Cache Policy: WriteBack, ReadAhead, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAhead, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
Bad Blocks Exist: No
PI type: No PI

Is VD Cached: No

Exit Code: 0x00

下指令察看 rebuild 進度
# watch -n 30 'megacli -PDRbld -ShowProg -PhysDrv [0:4] -aALL'

Every 30.0s: megacli -PDRbld -ShowProg -PhysDrv [0:...  Mon Mar  2 10:08:42 2020

Rebuild Progress on Device at Enclosure 0, Slot 4 Completed 6% in 1 Minutes.

Exit Code: 0x00

讓 LED 閃爍 (LED blink)

Syntax: megacli -PdLocate <-start|-stop> -physdrv[<enclosure#>:<disk#>] -a<adapter#>

In this example we will locate disk 0 on adapter 0:
[root@localhost MegaCli]# megacli -PdLocate -start -physdrv[252:0] -a0
 Adapter: 0: Device at EnclId-252 SlotId-0 — PD Locate Start Command was successfully sent to Firmware
 Exit Code: 0x00
 [root@localhost MegaCli]# 
相關資料及指令,參考 LSI MegaRAID SAS
在 github 上,有原作者寫的 megaclisas-status,可供週期性檢查 disk array 的狀態。

關掉/開啟 BEEP 聲

在 rebuild 時,關掉聲音
# megacli -AdpSetProp AlarmSilence -a0
  Adapter 0: Set alarm to Silenced success.
  Exit Code: 0x00

Enable 警告聲音
# megacli -AdpGetProp AlarmDsply -a0
  Adapter 0: Alarm Status is Enabled
  Exit Code: 0x00

查詢警告聲音的設定
# megacli -AdpGetProp AlarmDsply -a0
  Adapter 0: Alarm Status is Enabled
  Exit Code: 0x00

警告聲的代碼: Controller beep codes

Consistency Check 

不時就會看到硬碟的燈一直在閃,原來它會定時在背後執行 Consistency Check。查看 Consistency Check 目前正在進行的工作
# megacli -LDCC -ShowProg -lall -aall 

To see next scheduled Consistency Check time,預設一個星期執行一次。
# megacli -AdpCcSched -Info -aALL
                                     
Adapter #0

Operation Mode: Concurrent
Execution Delay: 168
Next start time: 03/07/2020, 03:00:00
Current State: Active
Number of iterations: 21
Number of VD completed: 1
Excluded VDs          : None
Exit Code: 0x00
Consistency Check 有兩種 mode, concurrent mode 及 sequencial mode,可以自己更改。Note: After change mode from disable to concurrent/sequencial, the next scheduled CC time will become year 2135, you have to set next scheduled run time again.

也可以更改 Consistency Check delay interval, Consistency Check Rate,亦可 manually start Consistency Check。

取得 Consistency Check Rate
# megacli -AdpGetProp CCRate -aALL
Adapter 0: Check Consistency Rate = 30% ##default 
If you get an error like "Consistency Check suspended on VD. . .", you can resume like so:
# MegaCli64 -LDCC -resume -lall -aall
At the end, if you want check Adapter properties, here is it
# MegaCli64 -AdpAllInfo -aALL

2017年6月11日 星期日

使用 Docker 架設 Git server

** 不能使用 port 10080,此 port 已有特定用途。 

** 第一次啟動後,可以設密碼,預設管理者是 root

目標,透過反向代理來存取 git。雖然可以很輕易的架一個VM,但也是很煩,就透過反向代理來存取Docker 上架設的 Git server,會省事很多。

就用最多人用的吧 https://github.com/sameersbn/docker-gitlab
參考官網的「Deploy to a subdirectory (relative url root)」的段落。

有中文的說明,看起來更快些
https://jigsawye.com/2015/09/25/gitlab-ce-in-docker/

開始,沒有懸念的,直接拉最新版的吧。另外,需要用到 postgresql 和 redis,就一起拉下來吧。
docker pull sameersbn/postgresql 
docker pull sameersbn/redis
docker pull sameersbn/gitlab

拉下來的 image 的大小,gitlab 大約 1.288GB,postgresql 約 231.5 MB,redis 約 203.4 MB。

先用手動啟動吧,成功後,再來調設定檔。
啟動 PostgreSQL container:
root #docker run --name gitlab-postgresql -d \
    --env 'DB_NAME=gitlabhq_production' \
    --env 'DB_USER=gitlab' --env 'DB_PASS=password' \
    --volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \
    sameersbn/postgresql:latest

啟動 Redis container:
root #docker run --name gitlab-redis -d \
    --volume /srv/docker/gitlab/redis:/var/lib/redis \
    sameersbn/redis:latest

最後啟動 Gitlab container。這邊要注意我除了照原文件之外,還額外加上 GITLAB_HOST,因為我的建置環境不在本機上,所以要加上該環境的 ip,否則 user 的大頭貼會是死圖。另外指令中的 long-and-random-alpha-numeric-string 請替換成一組隨機字串,可以使用 pwgen -Bsv1 64 來產生,看起來大概像這樣,7rfL2VSJ8s3kfNpbsPlcH73rXgFQ9QDFXzrtrBkMPm8GnvfCm5t6KRP2qpnn9fjT。執行指令如下。
root # docker run --name gitlab -d \
    --link gitlab-postgresql:postgresql --link gitlab-redis:redisio \
    --publish 10022:22 --publish 10080:80 \
    --env 'GITLAB_HOST=10.161.81.162' \
    --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
    --env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string' \
    --env 'GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string' \
    --env 'GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string' \
    --volume /srv/docker/gitlab/gitlab:/home/git/data \
    sameersbn/gitlab:latest

設定 systemd 的啟動程序,參考此網址
https://github.com/sameersbn/docker-gitlab/issues/237


補上 docker-compose.yml:
version: '2'

services:
  redis:
    restart: always
    image: sameersbn/redis:latest
    command:
    - --loglevel warning
    volumes:
    - /srv/docker/gitlab/redis:/var/lib/redis:Z

  postgresql:
    restart: always
    image: sameersbn/postgresql:9.6-2
    volumes:
    - /srv/docker/gitlab/postgresql:/var/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm

  gitlab:
    restart: always
    image: sameersbn/gitlab:9.2.5
    depends_on:
      - redis
      - postgresql
    ports:
      - "10080:80"
      - "10022:22"
    volumes:
      - /srv/docker/gitlab/gitlab:/home/git/data:Z
    environment:
      - DEBUG=false

      - DB_ADAPTER=postgresql
      - DB_HOST=postgresql
      - DB_PORT=5432
      - DB_USER=gitlab
      - DB_PASS=password
      - DB_NAME=gitlabhq_production

      - REDIS_HOST=redis
      - REDIS_PORT=6379

      - GITLAB_PORT=10080
      - GITLAB_SSH_PORT=10022
      - GITLAB_RELATIVE_URL_ROOT=/git
      - GITLAB_SECRETS_DB_KEY_BASE=Lzzcp5Vrmh3Lg4B9Mwj8v4Gj3zs7dHN6vMr8HMLxJVqrS2kXhdjQdpMnWNZxP6pz
      - GITLAB_SECRETS_SECRET_KEY_BASE=hTNCdbHw5hz9nmKJvmtB7HhNSfdjzXxMPnfKnDwvbRxdTw4GzcWWzlnTxhDHpVx2
      - GITLAB_SECRETS_OTP_KEY_BASE=7rfL2VSJ8s3kfNpbsPlcH73rXgFQ9QDFXzrtrBkMPm8GnvfCm5t6KRP2qpnn9fjT


嗯,使用 docker-composer,不需設定  systemd

Linux Shell 使用

使用 shell 的一些指令,可以省下很多功夫。尤其是網路和 Google 大神的幫忙,可以找到很多神奇的作法。
# docker ps -a | grep -i 'Exit' | awk '{print $1}' | xargs docker rm
移除停止的 docker container



網誌存檔