Typically, it will check /lib, /usr/lib as default library folder while running.
But if your program is using library from another folder,
you should specify it use -L option in gcc:
gcc -Wall hello.c -L/usr/local/lib/x86_64-linux-gnu -lhello -o hello
It will load libhello.so in /usr/local/lib/x86_64-linux-gnu folder
But I still get error after running above command.
To fix it:
$ sudo ldconfig /usr/local/lib/x86_64-linux-gnu
Then build again, it can run successfully.
2019年8月27日 星期二
2019年8月26日 星期一
Install pip3 on ubuntu16.04
1. Get get-pip.py on https://bootstrap.pypa.io/get-pip.py
2. Run sudo python3.5 get-pip.py --prefix=/usr/local/
It will install pip packages in /usr/local folder
3. Then you can check packages are up-to-date by command:
pip install --upgrade pip setuptools wheel
Reference:
https://packaging.python.org/tutorials/installing-packages/#requirements-for-installing-packages
2. Run sudo python3.5 get-pip.py --prefix=/usr/local/
It will install pip packages in /usr/local folder
3. Then you can check packages are up-to-date by command:
pip install --upgrade pip setuptools wheel
Reference:
https://packaging.python.org/tutorials/installing-packages/#requirements-for-installing-packages
2019年8月19日 星期一
Usage of Linux csplit
csplit是將一個文件分成數個小區塊的工具
如果有個檔案text內容為:
Title 1
aaa
bbb
Title 2
ccc
ddd
Title 3
eee
fff
想根據"Title"來分段:
$ csplit text -s -f title -b "%02d.log" /Title/ {*}
-s: 靜默模式
-f: 產生的檔名的前綴, 這邊為titlexxx
-b: 產生的檔名的後綴, 這邊為xxx00.log
/Title/: Parse用來分段的pattern
{*}: 執行pattern的次數, {1}為找一次, *為找到沒有為止
執行結束後會產生幾個檔案:
title00.log title01.log title02.log title03.log
通常會發現第一個檔案(title00.log)是空的
因為第一個檔案存的是第一個Title之前的資料,
如果text內容如下:
zzz
Title 1
aaa
bbb
...
那title00.log內容就會是zzz
其他依序如下
title01.log:
aaa
bbb
title02.log:
ccc
ddd
title03.log:
eee
fff
注意檔案內容不會包含pattern
如果有個檔案text內容為:
Title 1
aaa
bbb
Title 2
ccc
ddd
Title 3
eee
fff
想根據"Title"來分段:
$ csplit text -s -f title -b "%02d.log" /Title/ {*}
-s: 靜默模式
-f: 產生的檔名的前綴, 這邊為titlexxx
-b: 產生的檔名的後綴, 這邊為xxx00.log
/Title/: Parse用來分段的pattern
{*}: 執行pattern的次數, {1}為找一次, *為找到沒有為止
執行結束後會產生幾個檔案:
title00.log title01.log title02.log title03.log
通常會發現第一個檔案(title00.log)是空的
因為第一個檔案存的是第一個Title之前的資料,
如果text內容如下:
zzz
Title 1
aaa
bbb
...
那title00.log內容就會是zzz
其他依序如下
title01.log:
aaa
bbb
title02.log:
ccc
ddd
title03.log:
eee
fff
注意檔案內容不會包含pattern
2019年8月3日 星期六
[工作] Setup docker image時出現no space
最近發現在setup docker時會出現no space然後失敗
稍微查了一下發現
docker setup後會存放在/var/lib/docker目錄下
這個目錄占了我大概70G的空間(setup許多docker的結果)
而我的kernel只分配100G左右
幾乎被占滿了
目前好像沒有好方法
只能盡量把沒用到的image刪一刪了
還有之後有用docker的話
重新建系統可能考慮把root空間加大了
稍微查了一下發現
docker setup後會存放在/var/lib/docker目錄下
這個目錄占了我大概70G的空間(setup許多docker的結果)
而我的kernel只分配100G左右
幾乎被占滿了
目前好像沒有好方法
只能盡量把沒用到的image刪一刪了
還有之後有用docker的話
重新建系統可能考慮把root空間加大了
2019年8月1日 星期四
2019年7月23日 星期二
[工作] iSCSI配置 並搭配OCFS2達到多台共享
前陣子實驗了一下iSCSI, 做個筆記
以下都是最陽春的配置
iSCSI主要分為target跟initiator
iSCSI target: 分享空間資源(server)
Package: sudo apt install tgt
iSCSI initiator: 連到target並且使用資源(client)
Package: sudo apt install open-iscsi
Target配置:
裝完package後, 修改config
# vim /etc/tgt/targets.conf
ex.
<target iqn.2019-07.ric.builder1:builderiscsi>
backing-store /dev/nvme0n1
</target>
這裡我使用的iqn為: iqn.2019-07.ric.builder1:builderiscsi
並且加入一顆磁碟到target
然後重啟服務
# systemctl restart tgt
使用command查看狀態, 看看新增的target有沒有被加入
(同常為LUN1 ~ LUNX)
#tgt-admin --show
沒問題的話target設定完成
Ininiator配置:
一樣裝完package後, 修改config
修改initiator的iqn, 每個initiator必須唯一
# vim /etc/iscsi/initiatorname.iscsi
ex.
InitiatorName=iqn.2019-07.ric:iscsi
接下來做discovery, 偵測target
# iscsiadm -m discovery -t sendtargets -p 192.168.100.254
192.168.100.254:3260,1 iqn.2019-07.ric.builder1:builderiscsi
偵測完後開始進行連線
# iscsiadm -m node -T iqn.2019-07.ric.builder1:builderiscsi --login
登入後cat /proc/partition或是fdisk -l會看到多的device,
可以對它做fdisk跟mkfs, 切partition跟建立filesystem
注意第一台initiator做完之後其他台就不用做了
接下來就能使用這個檔案系統了
ex.
mount /dev/sdb1 /mnt/test
使用上有幾個問題:
1. initiatorA新增檔案後, initiatorB並不會馬上看到檔案,
需要umount後再mount才看得到
2. initiatorA跟initiatorB同時寫入檔案,
有很大的機會發生檔案毀損
因為SAN本身設計並不是用來共享檔案的,
iSCSI意思是SCSI protocol over IP,
對每個initiator來說就是多一個SCSI硬碟做讀寫,
並不會知道其他initiator做了什麼事
解決方案: 透過clustered filesystem
這裡透過OCFS2來處理,
OCFS2透過daemon監控每個node的狀態,
達到node間同步跟避免同時寫入時造成毀損
Package: ocfs2-tools ocfs2-tools-dev
裝完package後, 一樣編輯config
# vim /etc/ocfs2/cluster.conf
ex.
cluster:
node_count = 2
name = ocfs2
node:
number = 0
cluster = ocfs2
ip_port = 7777
ip_address = 192.168.100.2
name = machine1
node:
number = 1
cluster = ocfs2
ip_port = 7777
ip_address = 192.168.100.3
name = machine2
其中name必須與cat /etc/hostname一樣
編輯完後啟動o2cb
# service o2cb load
# service o2cb configure
# service o2cb online
接著建立掛載ocfs2檔案系統
mkfs.ocfs2 /dev/sdb1
mount -t ocfs2 /dev/sdb1 /mnt/test
在每一台initiator都做一樣的動作(mkfs只須做一次)
可以試著在initiatorA建立檔案測試
然後看initiatorB是否立即同步
這方式可以達到同步跟同時寫入
不過缺點是OCFS2不支援overlayfs upper...
參考資料:
http://www.voidcn.com/article/p-wmzavzze-xe.html
https://blog.51cto.com/nosmoking/1873507
http://linux.vbird.org/linux_server/0460iscsi.php#server
以下都是最陽春的配置
iSCSI主要分為target跟initiator
iSCSI target: 分享空間資源(server)
Package: sudo apt install tgt
iSCSI initiator: 連到target並且使用資源(client)
Package: sudo apt install open-iscsi
Target配置:
裝完package後, 修改config
# vim /etc/tgt/targets.conf
ex.
<target iqn.2019-07.ric.builder1:builderiscsi>
backing-store /dev/nvme0n1
</target>
這裡我使用的iqn為: iqn.2019-07.ric.builder1:builderiscsi
並且加入一顆磁碟到target
然後重啟服務
# systemctl restart tgt
使用command查看狀態, 看看新增的target有沒有被加入
(同常為LUN1 ~ LUNX)
#tgt-admin --show
沒問題的話target設定完成
Ininiator配置:
一樣裝完package後, 修改config
修改initiator的iqn, 每個initiator必須唯一
# vim /etc/iscsi/initiatorname.iscsi
ex.
InitiatorName=iqn.2019-07.ric:iscsi
接下來做discovery, 偵測target
# iscsiadm -m discovery -t sendtargets -p 192.168.100.254
192.168.100.254:3260,1 iqn.2019-07.ric.builder1:builderiscsi
偵測完後開始進行連線
# iscsiadm -m node -T iqn.2019-07.ric.builder1:builderiscsi --login
登入後cat /proc/partition或是fdisk -l會看到多的device,
可以對它做fdisk跟mkfs, 切partition跟建立filesystem
注意第一台initiator做完之後其他台就不用做了
接下來就能使用這個檔案系統了
ex.
mount /dev/sdb1 /mnt/test
使用上有幾個問題:
1. initiatorA新增檔案後, initiatorB並不會馬上看到檔案,
需要umount後再mount才看得到
2. initiatorA跟initiatorB同時寫入檔案,
有很大的機會發生檔案毀損
因為SAN本身設計並不是用來共享檔案的,
iSCSI意思是SCSI protocol over IP,
對每個initiator來說就是多一個SCSI硬碟做讀寫,
並不會知道其他initiator做了什麼事
解決方案: 透過clustered filesystem
這裡透過OCFS2來處理,
OCFS2透過daemon監控每個node的狀態,
達到node間同步跟避免同時寫入時造成毀損
Package: ocfs2-tools ocfs2-tools-dev
裝完package後, 一樣編輯config
# vim /etc/ocfs2/cluster.conf
ex.
cluster:
node_count = 2
name = ocfs2
node:
number = 0
cluster = ocfs2
ip_port = 7777
ip_address = 192.168.100.2
name = machine1
node:
number = 1
cluster = ocfs2
ip_port = 7777
ip_address = 192.168.100.3
name = machine2
其中name必須與cat /etc/hostname一樣
編輯完後啟動o2cb
# service o2cb load
# service o2cb configure
# service o2cb online
接著建立掛載ocfs2檔案系統
mkfs.ocfs2 /dev/sdb1
mount -t ocfs2 /dev/sdb1 /mnt/test
在每一台initiator都做一樣的動作(mkfs只須做一次)
可以試著在initiatorA建立檔案測試
然後看initiatorB是否立即同步
這方式可以達到同步跟同時寫入
不過缺點是OCFS2不支援overlayfs upper...
參考資料:
http://www.voidcn.com/article/p-wmzavzze-xe.html
https://blog.51cto.com/nosmoking/1873507
http://linux.vbird.org/linux_server/0460iscsi.php#server
2019年7月2日 星期二
訂閱:
文章 (Atom)