2018/12/19

增大 Ubuntu 18.04 上 root lvm volume



昨天剛灌的機器今天磁碟就滿了, 怎麼可能?

一看, 原來當初給主磁碟 20G 空間 Ubuntu 18.04 只先配置 LV 4G 的空間, 難怪空間爆炸了

所以其實 PV 上空間還是夠的, 這時候就是把 LV 重新設定大小就好了

如果是用 lvextend 則會報錯:

```bash
$ sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
/etc/lvm/archive/.lvm_template_2310_1202205345: write error failed: No space left on device
```

正確步驟:

```bash
# 1. 用 lvresize
$ sudo lvresize -A n -L -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from 4.00 GiB (1024 extents) to <19.00 GiB (4863 extents)
WARNING: This metadata update is NOT backed up.
Logical volume ubuntu-vg/ubuntu-lv successfully resized.


# 2. resize ext4
$ sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 4979712 (4k) blocks long.

# 3. df 看一下
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 19540624 4050844 14634724 22% /
```

2018/12/17

增大 EBS 磁碟容量後 LVM 要做的事情



前情提要:
1. 磁碟採用 NVME 介面(t3, m5, c5, r5)
2. 原先建置 LVM 時是用整顆磁碟, 所以裝置下只會有 /dev/nvme1n1 不會有 /dev/nvme1n1p1


增大前先看一下 lvm 配置

```sh
$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/nvme1n1
VG Name VG1
PV Size 50.00 GiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 12799
Free PE 0
Allocated PE 12799

$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/VG1/DATA
LV Name DATA
VG Name VG1
LV Write Access read/write
LV Creation host, time ip-172-31-37-10, 2018-10-08 09:05:34 +0000
LV Status available
# open 1
LV Size 50.00 GiB
Current LE 12799
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0

$ sudo vgdisplay
--- Volume group ---
VG Name VG1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 50.00 GiB
PE Size 4.00 MiB
Total PE 12799
Alloc PE / Size 12799 / 50.00 GiB
Free PE / Size 0 / 0
```

在 ebs 頁面把該磁碟加大到100G後 直接跑 resize2fs 發現沒有做用

研究了一下發現需要先做 pvresize,做完後 pv 的確變成 100G 了

```sh
$ sudo pvresize /dev/nvme1n1
Physical volume "/dev/nvme1n1" changed
1 physical volume(s) resized / 0 physical volume(s) not resized

$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/nvme1n1
VG Name VG1
PV Size 100.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25599
Free PE 12800
Allocated PE 12799
```

看一下 lv,還是 50G 沒變

```sh
$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/VG1/DATA
LV Name DATA
VG Name VG1
LV Write Access read/write
LV Creation host, time ip-172-31-37-10, 2018-10-08 09:05:34 +0000
LV Status available
# open 1
LV Size 50.00 GiB
Current LE 12799
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
```

lv 也要 resize一下,這邊把它稱大到所有的可用空間 +100%FREE

```sh
$ sudo lvresize -l +100%FREE /dev/mapper/VG1-DATA
Size of logical volume VG1/DATA changed from 50.00 GiB (12799 extents) to 100.00 GiB (25599 extents).
Logical volume DATA successfully resized.
```

lv resize 完後看一下,恩 變大了

```sh
$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/VG1/DATA
LV Name DATA
VG Name VG1
LV Write Access read/write
LV Creation host, time ip-172-31-37-10, 2018-10-08 09:05:34 +0000
LV Status available
# open 1
LV Size 100.00 GiB
Current LE 25599
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0

$ sudo vgdisplay
--- Volume group ---
VG Name VG1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 100.00 GiB
PE Size 4.00 MiB
Total PE 25599
Alloc PE / Size 25599 / 100.00 GiB
Free PE / Size 0 / 0
```

不過用 df 看 還是沒變大

```sh
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VG1-DATA 51470972 48766280 67076 100% /data
```

跑 resize2fs 後就正常了

```sh
$ sudo resize2fs /dev/mapper/VG1-DATA
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/mapper/VG1-DATA is mounted on /data; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 7
The filesystem on /dev/mapper/VG1-DATA is now 26213376 (4k) blocks long.

$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VG1-DATA 103077152 48774260 49568340 50% /data
```

2018/10/14

臺北市政府違反勞動法令公布專區


[臺北市政府違反勞動法令公布專區](https://bola.gov.taipei/News_Content.aspx?n=7C26DE8810A680AC&sms=EBEC4546C77557A3&s=94390C8160186CB5)

[臺北市政府勞動局-公開資料線上查詢系統(違反勞動基準法)](http://web2.bola.taipei/bolasearch/chhtml/page/20)

2018/10/13

在 Raspberry Pi 上看 CPU 溫度



手上剛好有兩台樹莓派, 一台有接風扇 一台沒接

心血來潮想看看這樣溫度可以差多少

指令如下

```shell
/opt/vc/bin/vcgencmd measure_temp
```

有風扇的

```shell
/opt/vc/bin/vcgencmd measure_temp
temp=37.6'C
```

無風扇的

```shell
/opt/vc/bin/vcgencmd measure_temp
temp=48.3'C
```

差了將近有10度阿...看來還是把風扇接上好了(雖然現在已進入秋天惹)


其實 vcgencmd 還有許多功能, 例如看 cpu頻率, gpu記憶體, 工作電壓, ...等等

可以透過以下指令查看
```shell
/opt/vc/bin/vcgencmd commands
```

2018/10/11

macOS 中解決 SSH 連線 key exchange method 與 cipher 問題



之前在公司連一台電腦時候出現了

```
Unable to negotiate with 3.3.2.3 port 014: \
no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
```

原因是這種 key exchange method 的安全性比較低, 所以 macOS 預設沒有開啟

只要在 ssh_config 加上就好了

```
$ head ~/.ssh/config
KexAlgorithms +diffie-hellman-group1-sha1
```

加完後出現了不一樣的訊息

```
Unable to negotiate with 3.3.2.3 port 014: \
no matching cipher found. \
Their offer: aes128-cbc,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc
```

看來是 cipher 也少了,aes256-cbc 比較安全些, 那就加上它吧

```
$ head ~/.ssh/config
KexAlgorithms +diffie-hellman-group1-sha1
Ciphers +aes256-cbc
```

這樣就可以成功 ssh 進去了

2018/10/10

解決升級 Ubuntu 18.04 (bionic) 後 256MB RAM 的機器開不了機



Ubuntu 18.04 出來也半個月了

一直想嘗試看看, 雖然說我都用 server 版本 基本上沒什麼差

趁著國慶假期 手癢升級了手邊的一台只有 256MB RAM 的 VM

升級前當然先把套件都升到最新

```
sudo apt update
sudo apt upgrade
sudo autoremove
```

然後就是重頭戲了 -- 開始升級

```
sudo do-release-upgrade
```

過程中會問你四次左右的 y/n 都是選 y 就對了

升級完開機之後 出現了悲劇

```
kernel panic not syncing out of memory and no killable processes
```

嘗試著加大 RAM 到 384MB 是可以開機的

於似乎開始找解決辦法

試過把舊版 linux-kernel 都移除, grub 重裝都不太行

最後找到了這篇

https://askubuntu.com/questions/956737/end-kernel-panic-not-syncing-out-of-memory-and-no-killable-processes/956742

```
cd /lib/modules/4.15.0-36-generic
sudo find . -name *.ko -exec strip --strip-unneeded {} +
sudo update-initramfs -c -k 4.15.0-36-generic
```

重新調整 RAM 為 256MB

登登登 正常開機進去了

不過目前 pppoeconf 設定開機自動撥 pppoe 的功能似乎是失效的 要再想辦法解決了

2018/09/29

macOS 如何清除 dns cache


在 windows 系統中可以透過 `ipconfig /flushdns` 來清除 dns cache

那麼在 macOS 中要怎麼清除呢?

很簡單

```
sudo killall -HUP mDNSResponder
```

2018/09/27

分離 git repository 中某個資料夾並獨立為一個 repository



由於歷史因素, 公司以前只開一個 repository, 用資料夾分不同的 applications

然後現在要導入自動化, 總不能每次都下載那一大包 source code 吧

所以想辦法看有沒有可以把某個資料夾獨立成一個 repository 並且 commit log 都可以保留的辦法

當然, 我可以把該資料夾手動複製然後創立新的 repository 並且 commit 上去

但是這樣就會遺失過往的 commit log

於似乎找了一下有沒有其他方法

git 這麼神, 當然有

1. 先建立好要獨立的 repository, 以 bitbucket 為例 git@bitbucket.org:user/sub-folder-project1

2. 下載原先大 repository, 並切換到要分離的資料夾的上層目錄

```shell
$ git clone git@bitbucket.org:user/huge-project
$ cd huge-project/path/to/sub-folder-project1
$ cd ..
```

3. 開始執行 git 指令分開 sub-folder-project1

```shell
# git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME BRANCH-NAME
$ git filter-branch --prune-empty --subdirectory-filter sub-folder-project1 develop
```

4. 將分離出來的 sub-folder-project1 加上遠端資訊並且 push

```shell
$ git remote add subproject1 git@bitbucket.org:user/sub-folder-project1
$ git push -u origin develop
```

這樣就大功告成了啊~~

不過原本的 huge-project 的 develop 就會因此而亂掉, 若還需要繼續使用的話, 建議砍掉重新 clone 一份


參考: [https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/](https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/)

2018/09/04

深入了解 ansible 中 tags 使用方式


我們先新增一個 role

包含了四個檔案 main.yml, all.yml, deploy.yml, other.yml

每個 task 檔 都會執行 3 個 task 分別是 無 tag(all tag) deploy tag, other tag

並且 main.yml 會用 include 的方式載入剩餘三個 task 檔

為了方便說明我用 ABC DEF GHI JKL 取名 task

main.yml

```yaml
---

- name: A
debug:
msg: 'all tag in main.yml'

- name: B
debug:
msg: 'deploy tag in main.yml'
tags:
- deploy

- name: C
debug:
msg: 'other tag in main.yml'
tags:
- other

- name: X
include: all.yml

- name: Y
include: deploy.yml
tags:
- deploy

- name: Z
include: other.yml
tags:
- other

```

all.yml

```yaml
---

- name: D
debug:
msg: 'all in all.yml'

- name: E
debug:
msg: 'deploy in all.yml'
tags:
- deploy

- name: F
debug:
msg: 'other in all.yml'
tags:
- other

```

deploy.yml

```yaml
---

- name: G
debug:
msg: 'all in deploy.yml'

- name: H
debug:
msg: 'deploy in deploy.yml'
tags:
- deploy

- name: I
debug:
msg: 'other in deploy.yml'
tags:
- other

```

other.yml

```yaml
---

- name: J
debug:
msg: 'all in other.yml'

- name: K
debug:
msg: 'deploy in other.yml'
tags:
- deploy

- name: L
debug:
msg: 'other in other.yml'
tags:
- other

```

playbook則是用不同方式上 tags

```yaml
#!/usr/bin/env ansible-playbook
---

- hosts: localhost
gather_facts: no
roles:
- { role: role-tags }

- hosts: localhost
gather_facts: no
tags:
- deploy
roles:
- { role: role-tags }

- hosts: localhost
gather_facts: no
roles:
- { role: role-tags, tags: [ "deploy" ] }


```

執行 playbook 時也加入 tags 參數看看結果如何

1. playbook 完全不加 tags

```bash
ansible-playbook site.tags.yml # 結果:ABCDEFGHIJKL全部執行
ansible-playbook site.tags.yml --tags=deploy # 結果:BEGHIK
ansible-playbook site.tags.yml --tags=other # 結果:CFIJKL
ansible-playbook site.tags.yml --tags=gg # 結果:全部不會執行
```

2. 在 playbook 加 deploy tag

```bash
ansible-playbook site.tags.yml # 結果:ABCDEFGHIJKL全部執行
ansible-playbook site.tags.yml --tags=deploy # 結果:ABCDEFGHIJKL全部執行
ansible-playbook site.tags.yml --tags=other # 結果:CFIJKL
ansible-playbook site.tags.yml --tags=gg # 結果:全部不會執行
```

3. 在 playbook 的 role 上加 deploy tag

```bash
ansible-playbook site.tags.yml # 結果:ABCDEFGHIJKL全部執行
ansible-playbook site.tags.yml --tags=deploy # 結果:ABCDEFGHIJKL全部執行
ansible-playbook site.tags.yml --tags=other # 結果:CFIJKL
ansible-playbook site.tags.yml --tags=gg # 結果:全部不會執行
```

23的 --tags=deploy 結果跟我預想的不太一樣

我原本以為加在 playbook 上的 tag 是用來過濾我要執行哪些 roles/tasks

很顯然的他也是上 tag 而且是對以下所有 roles/tasks 標記

如此一來, 就可以了解如果你真的要過濾的話 在執行 playbook 加上 --tags 才會是過濾, 其他加在檔案的都為了之後過濾用的標記



補充:

可以在執行 playbook 時加上 --list-tasks 去看哪些 task 被加了什麼標記例如
```shell
$ ansible-playbook site.tags.yml --list-tasks

playbook: site.tags.yml

play #1 (localhost): localhost TAGS: []
tasks:
role-tags : A TAGS: [deploy]
role-tags : B TAGS: [deploy]
role-tags : C TAGS: [deploy, other]
role-tags : D TAGS: [deploy]
role-tags : E TAGS: [deploy]
role-tags : F TAGS: [deploy, other]
role-tags : G TAGS: [deploy]
role-tags : H TAGS: [deploy]
role-tags : I TAGS: [deploy, other]
role-tags : J TAGS: [deploy, other]
role-tags : K TAGS: [deploy, other]
role-tags : L TAGS: [deploy, other]
```

2018/08/10

如何將 elasticsearch 資料設定 TTL



一開始在研究 elasticsearch 時 沒想太多就直接拿來用

隨著時間過去, 資料累積愈來愈多, 開始有了需要將資料 TTL 的功能

於是開始研究有沒有這樣的功能

首先我們需要了解的技能有:
1. reindex
2. index template
3. date math index name with index alias
4. rollover index


第一步驟: 將原先的 index 重新命名

由於為了讓其他 get api 在設定 TTL 後還可以正常運作, 在這邊需要做這樣的動作, 原因是 index A 之後會變成 alias A

```
// reindex
POST _reindex
{
  "source": {
    "index": "game"
  },
  "dest": {
    "index": "game_old"
  }
}

// 刪除原 index
DELETE game
```



第二步驟: 建立 index template

讓之後建立的 index 自動設定一些內部參數

```
PUT _template/game-template
{
  "index_patterns": ["game-*"],
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "aliases" : {
    "game-query" : {},
    "game" : {}
  },
  "mappings" : {
  }
}
```



第三步驟: 建立日期格式的 index 名稱

依據現在的時間建立 index 並且給予 write 的 alias,讓之後寫資料可以利用這個 alias 去寫

```
// <game-{now/d}-000001>
PUT /%3Cgame-%7Bnow%2Fd%7D-000001%3E
{
  "aliases": {
    "game-write": {}
  }
}
```



第四步驟: 定期跑 rollover index

定期建立新的 index, 並將過時的 index 刪除

```
// 每天跑一次
POST /game-write/_rollover
{
  "conditions": {
    "max_age": "1d"
  }
}

// 每天刪除舊資料
DELETE /game-YYYY.MM.dd-*
```

隱藏步驟: 如果要搬移舊資料, 則這時候再利用 reindex 功能建立

```
// reindex
POST _reindex
{
  "source": {
    "index": "game_old",
    "query": {
      "range": {
        "createdDate": {
          "gte": particularDate.getTime(),
          "lt": particularDate.getTime() + 86400000
        }
      }
    }
  },
  "dest": {
    "index": "game-YYYY.MM.dd-000001"
  }
}

// 全部搬移完後就可以刪除 game_old 了
DELETE /game_old
```

2018/05/19

在nginx啟動時不需要輸入密碼



我們在產生 https 的憑證 private key 大部分都會輸入密碼再多一層保護

在 nginx 1.7.3 之前 每次重啟 nginx 就會跳出要輸入 pem 密碼

如果是多個 sites 共用一把 key 的話就要輸入 n 次....

幸好在 1.7.3 之後支援了這個 directive

```
ssl_password_file
```

這樣在啟動 nginx 時就不用輸入密碼了

2018/05/15

了解 /etc/group

markdown

```sh
$ cat /etc/group
admin:x:100:admin
--1-- 2 -3- --4--
```

1. 群組名稱
2. 密碼
3. 群組id (gid)
4. 成員清單

2018/01/30

如何使用 << EOF 達到傳遞多行文字



在寫 shell script 時

常常會需要傳遞或是寫入多行文字

這時候 `<<EOF` 就可以派上用場了

用法1:

```sh
$ cat <<EOF > a.txt
'use strict';

const A='1';
console.log(A);
EOF
```

用法2:

# 從檔案讀取
$ sfdisk /dev/xvdb > xvdb-table

# 用 <<EOF 方式

```sh
$ sfdisk /dev/xvdb <<EOF
label: dos
label-id: 0xffffffff
device: /dev/xvdb
unit: sectors

/dev/xvdb1 : start=        2048, size=    209713152, type=83
EOF
```

EOF只是一個標示,可以改成MOA,結果是一樣的

```sh
$ cat <<MOA > a.txt
'use strict';

const A='1';
console.log(A);
MOA
```

另外,有時候寫在 shell 檔案執行時會出錯

可以加上""包起來

例如:

```sh
#!/bin/sh
cat <<"EOF" > a.txt
'use strict';

const A='1';
console.log(A);
EOF
```

在樹莓派(raspbian) 安裝 docker


廢話不多說

一行指令打天下

```sh
$ curl -sSL https://get.docker.com | sh
```

2018/01/29

如何在 ubuntu/macOS/raspbian 下安裝 docker compose



隨著進入了 docker 的世界,碰到愈來愈多東西

終於用上了 docker compose

不過常常在新系統安裝好 docker 後會發現不能使用 docker-compose

原來這個東西是要另外安裝的

依據[官方](https://docs.docker.com/compose/install/#install-compose)的文件

以下範例適合 ubuntu/macOS

```sh
# 下載
$ sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 加上執行權限
$ sudo chmod +x /usr/local/bin/docker-compose
```

這樣就可以盡情的使用 docker-compose up 了


如果是在樹莓派 raspbian 下的話就比較麻煩了

這邊提供用pip安裝的方法

```sh
# 安裝 pip
$ sudo apt-get install python-pip
# 或 pip3
$ sudo apt-get install python3-pip

# 利用 pip 安裝 docker-compose
$ sudo pip install docker-compose
# 或 pip3
$ sudo pip3 install docker-compose

# 跑完就可以使用了
$ docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
```

參考:

https://github.com/docker/compose/

https://docs.docker.com/compose/install/

https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-16-04