Jex’s Note

Rsync 指令

本機同步資料夾

/tmp/destination/ 為主要, 將 /tmp/source/ 同步

rsync -avr --delete /tmp/destination/ /tmp/source/
  • -a, –archive archive mode; equals -rlptgoD (no -H,-A,-X)
  • -v, –verbose increase verbosity
  • -r, –recursive recurse into directories
  • –delete delete extraneous files from destination dirs
  • -e, –rsh=COMMAND specify the remote shell to use

將本機資料夾複製到遠端 projects/ 下

rsync -ae "ssh -p 9022" test jex@106.185.77.26:/home/jex/note/projects/

將遠端的 test 資料夾 sync 到 /tmp

rsync -av -e ssh jex@example.com:~/test/ /tmp
  • 注意!! test 資料夾後面一定要加/
  • 以上指令不會將 tmp 有但 test 沒有的檔案做刪除, 如果要與 test 完全一樣, 加上 --delete 參數即可

將本地的資料夾 sync 到遠端

rsync -av -e ssh /tmp/test jex@example.com:/tmp

同上, 不過指定金鑰

rsync -av -e "ssh -i .ssh/aws-me-tokyo.pem" ~/test ubuntu@my_web:/tmp

如果來源資料夾有些檔案刪除再去做同步後,目的資料夾是不會刪掉的原本存在的檔案,除非加上 --delete

同步到遠端, 指定 port

rsync -av --delete --checksum --rsh=/usr/bin/ssh /tmp jex:/tmp -e "ssh -p 3333"

-c, –checksum skip based on checksum, not mod-time & size

以 ssh rsync 到遠端, 如果資料夾不存在自動建立

rsync -avr --rsh='ssh -p41111' reporting/ jx@my-base:/home/m/reporting/
/usr/bin/rsync -rlpvz --delete --exclude-from=/tmp/exclude_file --checksum --rsh=/usr/bin/ssh /home/jex/code/ jex@remoteServer.com:/var/www/code -e "ssh -p 1234"

exclude

rsync -av --exclude 'modules/qq' --exclude 'modules/cc'  /home/jex/index /tmp/

exclude file

rsync -av --exclude-from=$HOME/exclude_file /home/jex/index /tmp/

$HOME/exclude_file :

.git
.gitignore
.htaccess

Linux 常用指令

Console 快捷鍵

畫面

  • Ctrl + l : 清畫面, 等於指令 clear
  • Ctrl + z : 暫時停止程式(將該工作放到背景) (fg 1, fg 2 拿回)
  • Ctrl + c : 終止正在執行的程式
  • Ctrl + s : 停止輸出到畫面上(類似 Scroll Lock, ex: cat xxx 需暫停時使用)
  • Ctrl + q : 回復輸出到畫面上(恢復Ctrl+S的輸出)
  • Ctrl + d : 結束輸入(如果您在 shell 下,就會跳出該 shell)

刪除

  • Ctrl + w : 刪除游標前一段指令,依空白為段落
  • Ctrl + u : 刪除游標前的字
  • Ctrl + k : 刪除游標後的字
  • Ctrl + h : Backspace 鍵功能
  • Ctrl + d : Del 鍵功能

移動

  • Ctrl + a : 游標移到最前面
  • Ctrl + e : 游標移到最後面
  • Ctrl + f : 往右移一個字元, 相當右鍵
  • Ctrl + b : 往左移一個字元, 相當左鍵

指令

  • Ctrl + x 接著按 Ctrl + e : 可以使用 vim 寫入 script 讓他一次執行
  • Ctrl + r : 尋找之前輸入過的指令
  • Ctrl + p : 上一個指令, 相當上鍵
  • Ctrl + n : 下一個指令, 相當下鍵
  • Ctrl + i : 同 Tab
  • Ctrl + v + Tab : 輸入 Tab (空白)
  • Ctrl + j : 同 Enter
  • Ctrl + t : 相近兩個字元互換位置
  • Ctrl + - : undo
  • Ctrl + v : 再加上要輸入特殊字元, ex: 先按 Ctrl-V 再按 Ctrl-C 會出現 ^C 而不是中斷

其他

  • Alt + f : 到此行的後一個字
  • Alt + b : 到此行的前一個字
  • Alt + d : 刪除游標之後的一個單字
  • ESC + t : 最後 兩個 “單字” 互換位置
  • set -o : 可以列出所有 Mode
  • set -o vi : 可以用 vi 操作法來操作 Bash Shell(用此 Mode 上述的快速鍵即無作用)
  • set -o emacs : Bash 預設就是此 Mode.

使用者

線上使用者

$ who
webadmin pts/0        Apr 20 17:51 (61.58.172.120)
root     pts/1        Apr 20 18:46 (61.58.172.120)

$ w
18:46:50 up 103 days, 22 min,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
webadmin pts/0    180-176-112-131. 18:40    0.00s  0.00s  0.00s w

目前使用者

whoami

current user’s bash pid

  • $$: Specified by POSIX and always remains the value of the original shell process.
  • BASHPID: Subshell’s pid

explain:

$ echo $(echo $BASHPID $$)      $$       $BASHPID
              25680    16920    16920    16920
#             |        |        |        |
#             |        |        |        -- $BASHPID outside of the subshell
#             |        |        -- $$ outside of the subshell
#             |        -- $$ inside of the subshell
#             -- $BASHPID inside of the subshell

ref: https://unix.stackexchange.com/questions/62231/bashpid-and-differ-in-some-cases

印出當下執行指令的 pid

$ ll /proc/self & echo $!
[1] 20424
20424
lrwxrwxrwx 1 root root 0 Dec 12 06:34 /proc/self -> 20424
[1]+  Done                    ls --color=auto -la /proc/self

自動建立階層目錄 recursive mkdir

mkdir -p /var/www/log/website

-p, –parents no error if existing, make parent directories as needed

md5

md5 test.txt
MD5 (test.txt) = b79a5759ca168122b9ebd1b57e4a883b

或

md5sum test.txt

ls

顯示目錄下的檔案權限, 擁有者..等等

ls -l

檔案大小那邊會換算成我們習慣的方式(G, M, K)

ls -lh
drwxr-xr-x 15 webadmin root 4.0K Mar 19 21:09 application
drwxr-xr-x  6 webadmin root 4.0K Apr  7 21:25 assets

顯示目錄下的檔案(包含隱藏檔)

ls -a

ls | more    # 分頁 q : 離開
ls | less    # 分頁 (操作如同vim,但不需要加ctrl)
             # d : 下12筆,
             # b、w : 上一頁,
             # f : 下一頁,
             # j 、e : 下一筆,
             # g : 回到第一筆,
             # k : 上一筆,
             # h : help

顯示檔案的inode id

$ ls -ia
1451762 .           1443270 .mysql_history  1576628 assets
1451760 ..          1443190 .php_history    1443160 djfl
1577046 .cache      1443425 .ssh            1443313 index.php
1443151 .git        1576655 .vim            1443315 license.txt
1443307 .gitconfig  1442269 .viminfo        1576661 system
1443272 .gitignore  1443276 .vimrc          1577048 test
1443312 .htaccess   1576553 application     1576831 user_guide

檔案型別, identifiers:

    • : regular file
  • d : directory
  • c : character device file (Character and block device files allow users and programs to communicate with hardware peripheral devices.). Provides a serial stream of input or output. Your terminals are classic example for this type of files.
  • b : block device file (Block devices are similar to character devices. They mostly govern hardware as hard drives, memory, etc.)
  • s : local socket file (Local domain sockets are used for communication between processes. Generally, they are used by services such as X windows, syslog and etc.)
  • p : named pipe (Similarly as Local sockets, named pipes allow communication between two local processes. They can be created by the mknod command and removed with the rm command.)
  • l : symbolic link (With symbolic links an administrator can assign a file or directory multiple identities. Symbolic link can be though of as a pointer to an original file.)

pwd

目前目錄位置

$ pwd
/home/ec2-user/my_project

如果是連結檔, 加上-P可以顯示真實路徑

$ pwd -P
/home/apps/src/my_project

cd

如果是連結檔, 加上-P可以進入到真實路徑

$ cd -P my_project/

tail

tail -f -n 100 log-2013-06-21.php     #當檔案發生變動時印出檔尾末100行

限制字數

tail -f log-2017-10-12.php | cut -c -80

scp 遠端複製檔案

一般用法 : 將本機檔案

$ scp .tmux.conf username@example.com:~/.tmux.conf

指定 port

scp -P 4123 remote_user@192.168.37.21:~/test/t.txt t.txt

使用vim為預設編輯器

export EDITOR=vim
export VISUAL=vim

chown

改變群組及擁有者

drwxr-xr-x 4 root     root 4096 Apr 20 18:46 test1        #原本擁有者及群組都是root

$ chown webadmin:webadmin test1                           #將擁有者及群組都改為webadmin
drwxr-xr-x 4 webadmin webadmin 4096 Apr 20 18:46 test1    #結果擁有者及群組都是webadmin

省略群組, 只會改擁有者

drwxr-xr-x 4 webadmin root 4096 Apr 20 18:46 test1          #原本擁有者為webadmin,群組為root

$ chown root test1                                          #只輸入root(省略群組)
drwxr-xr-x 4 root     root 4096 Apr 20 18:46 test1          #結果只會修改擁有者,群組不變

chgrp

drwxr-xr-x 4 webadmin webadmin 4096 Apr 20 18:46 test1      #原本群組為webadmin

$ chgrp root test1                                          #將群組改為root
drwxr-xr-x 4 webadmin root 4096 Apr 20 18:46 test1          #結果群組改為root了

chmod

改為 777

drwxr-xr-x 4 webadmin root 4096 Apr 20 18:46 test1          #原本權限為755

$ chmod 777 test1                                           #將權限改為777
drwxrwxrwx 4 webadmin root 4096 Apr 20 18:46 test1          #結果權限被改為777了

全部加上執行權限 (a+x)

-rw-r--r-- 1 webadmin root   20 Apr 21 11:18 test.php       #原本

$ chmod +x test.php                                         #全部都加上執行權限
-rwxr-xr-x 1 webadmin root   20 Apr 21 11:18 test.php       #結果

只有 user 加上執行權限

-rw-rw-rw- 1 webadmin root   20 Apr 21 11:18 test.php       #原本

$ chmod u+x test.php                                        #只有擁有者加上執行權限
-rwxrw-rw- 1 webadmin root   20 Apr 21 11:18 test.php       #結果
  • u 代表 user
  • g 代表 group
  • o 代表 others
  • a 代表 all

watch -n 1

每秒執行一次

watch -n 1 cat filename
watch -n 1 tail -5 /etc/projid
watch -n 1 'netstat -ant | grep "ESTABLISHED" | wc -l'

-n, –interval seconds to wait between updates

locale 列出語言檔

locale -a

screen

  • screen: 進入 screen 模式
  • screen -ls: screen list
  • screen -r: 連回 screen
  • screen -r 70346: 連回 screen 叫 70346 的 screen
  • ctrl + a + d: 離開 screen, 保持 screen 在背景運作
  • ctrl + a + t: 顯示目前系統的時間與負載狀況
  • ctrl + a + ?: 說明
  • ctrl + a + x: 鎖定螢幕
  • ctrl + a + C: 清除內容

視窗

  • ctrl + a + c: 建立新視窗
  • ctrl + a + n: 切換下一個視窗
  • ctrl + a + p: 切換上一個視窗
  • ctrl + x + shift + [ : 交換視窗位置
  • ctrl + a + w: 視窗 list
  • ctrl + a + ": 視窗 list 並且可以選擇要到哪一個
  • ctrl + a x 2: 切換到上次的視窗
  • ctrl + a + k: 關閉目前的視窗

分割視窗

  • ctrl + a + S: 水平分割視窗
  • ctrl + a + Q: 關閉分割視窗
  • ctrl + a + tab: 切換分割視窗

copy mode

  • ctrl + a + ESC or ctrl + a + [: 進入 copy mode
  • 第一次按空白鍵是複製的起點, 第二次按空白鍵是複製的結尾
  • ctrl + a + ]: 將複製的東西貼上

tmux

  • ctrl + b + " — split pane horizontally.
  • ctrl + b + % — split pane vertically.
  • ctrl + b + arrow key — switch pane.
  • Hold Ctrl+b, don’t release it and hold one of the arrow keys — resize pane.
  • ctrl + b + c — create a new window.
  • ctrl + b + n — move to the next window.
  • ctrl + b + p — move to the previous window.

ref: more shortcuts

uname

顯示作業系統

$ uname
Linux

顯示作業系統版本

$ uname -a
Linux ip-10-0-11-161 4.4.35-33.55.amzn1.x86_64 #1 SMP Tue Dec 6 20:30:04 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

顯示幾位元

$ uname -m
x86_64 = 64 bit

i686 = 32 bit

test

test -e /dmtsai

[1] 關於某個檔名的『檔案類型』判斷,如 test -e filename 表示存在否

  • -e 該『檔名』是否存在?(常用)
  • -f 該『檔名』是否存在且為檔案(file)?(常用)
  • -d 該『檔名』是否存在且為目錄(directory)?(常用)
  • -b 該『檔名』是否存在且為一個 block device 裝置?
  • -c 該『檔名』是否存在且為一個 character device 裝置?
  • -S 該『檔名』是否存在且為一個 Socket 檔案?
  • -p 該『檔名』是否存在且為一個 FIFO (pipe) 檔案?
  • -L 該『檔名』是否存在且為一個連結檔

[2] 關於檔案的權限偵測,如 test -r filename 表示可讀否 (但 root 權限常有例外)

  • -r 偵測該檔名是否存在且具有『可讀』的權限?
  • -w 偵測該檔名是否存在且具有『可寫』的權限?
  • -x 偵測該檔名是否存在且具有『可執行』的權限?
  • -u 偵測該檔名是否存在且具有『SUID』的屬性?
  • -g 偵測該檔名是否存在且具有『SGID』的屬性?
  • -k 偵測該檔名是否存在且具有『Sticky bit』的屬性?
  • -s 偵測該檔名是否存在且為『非空白檔案』

[3] 兩個檔案之間的比較,如: test file1 -nt file2

  • -nt (newer than)判斷 file1 是否比 file2 新
  • -ot (older than)判斷 file1 是否比 file2 舊
  • -ef 判斷 file1 與 file2 是否為同一檔案,可用在判斷 hard link 的判定上。 主要意義在判定,兩個檔案是否均指向同一個 inode 哩!

[4] 關於兩個整數之間的判定,例如 test n1 -eq n2

  • -eq 兩數值相等 (equal)
  • -ne 兩數值不等 (not equal)
  • -gt n1 大於 n2 (greater than)
  • -lt n1 小於 n2 (less than)
  • -ge n1 大於等於 n2 (greater than or equal)
  • -le n1 小於等於 n2 (less than or equal)

[5] 判定字串的資料

  • test -z string 判定字串是否為 0 ?若 string 為空字串,則為 true
  • test -n string 判定字串是否非為 0 ?若 string 為空字串,則為 false。

註: -n 亦可省略

  • test str1 = str2 判定 str1 是否等於 str2 ,若相等,則回傳 true
  • test str1 != str2 判定 str1 是否不等於 str2 ,若相等,則回傳 false

[6] 多重條件判定,例如: test -r filename -a -x filename

  • -a (and)兩狀況同時成立!例如 test -r file -a -x file,則 file 同時具有 r 與 x 權限時,才回傳 true。
  • -o (or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r 或 x 權限時,就可回傳 true。
  • ! 反相狀態,如 test ! -x file ,當 file 不具有 x 時,回傳 true

Cat

Append one file to another

cat d.txt >> q.txt

顯示檔案內容及行數

cat -n phpinfo.php

whereis

尋找檔案

$ whereis bin
bin: /usr/local/bin

whereis 利用曾經找過的系統資訊內的資料去找檔案,所以速度會很快 * 不過,如果 whereis 找不到的話,並不代表該檔案真的不存在!

系統資訊

系統訊息

$ cat /etc/*release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.04
DISTRIB_CODENAME=raring
DISTRIB_DESCRIPTION="Ubuntu 13.04"
NAME="Ubuntu"
VERSION="13.04, Raring Ringtail"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 13.04"
VERSION_ID="13.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

看系統內核等信息

$ uname -a
Linux virtualBox 3.8.0-30-generic #44-Ubuntu SMP Thu Aug 22 20:52:24 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

查看系統資訊

$ more /proc/version
Linux version 2.6.32-042stab059.7 (root@rh6-build-x64) (gcc version 4.4.6 201203
05 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Tue Jul 24 19:12:01 MSK 2012

等同 cat /proc/version

查看目前Linux版本

$ cat /etc/issue
Ubuntu 12.04.1 LTS \n \l

顯示linux版本

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.1 LTS
Release:        12.04
Codename:       precise

pstree

  • pstree
  • pstree {USER NAME}
  • pstree {PID}

arguments:

  • p: show pid
  • a: show hierarchy

列出此 pid 下的 process tree

$ pstree 18082
-+= 18082 jex bash /Users/jex/projects/test/run.sh
 \--- 18083 jex ./test_pid

顯示所有partition

sudo fdisk -l

其他

  • sudo shutdown -r now :重開機
  • sudo reboot : 重開機
  • sudo shutdown -h now : 關機
  • top : cpu 使用率
  • ps -l : 僅觀察自己的 bash 相關程序

背景執行

放入背景

ctrl + z

看背景有哪些程式在執行

$ jobs
[1] + Stopped                    vim test

叫出第一個背景的程式

$ fg %1

停止在背景執行的第一個程式

$ kill -9 %1
$ jobs
[1] + Killed                     vim test

強制中斷 process

kill

kill 11372 (pid)
    -9       KILL (non-catchable, non-ignorable kill)

killall (kill processes by name)

killall redis

查看 Process 是否執行中(其實就是看有沒有 pid)

pidof redis
  • SIGHUP (1) - terminal line hangup
  • SIGINT (2) - interrupt program
  • SIGQUIT (3) - quit program
  • SIGKILL (9) - kill program
  • SIGTERM (15) - software termination signal
  • SIGSTOP (17) - stop (cannot be caught or ignored)
  • SIGTSTP (18) - stop signal generated from keyboard

lsusb

列出連接 usb 的週邊設備

$ lsusb
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

apropos

apropos searches a set of database files containing short descriptions of system commands for keywords and displays the result on the standard output.

$ apropos awk
a2p(1)                   - Awk to Perl translator
awk(1)                   - pattern-directed scanning and processing language
English(3pm)             - use nice English (or awk) names for ugly punctuation variables
a2p(1)                   - Awk to Perl translator
awk(1)                   - pattern-directed scanning and processing language

cpu info

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz
stepping        : 7
microcode       : 0x70a
cpu MHz         : 1799.999
cache size      : 20480 KB
(...略...)

Memory info

$ free -h
             total       used       free     shared    buffers     cached
Mem:          3.8G       3.2G       646M         0B       1.1G       1.3G
-/+ buffers/cache:       914M       3.0G
Swap:         4.0G       121M       3.9G

cpu core count

nproc
或
cat /proc/cpuinfo | grep process

cpu information

lscpu
或
cat /proc/cpuinfo

wc 程序從標準輸入流或文件列表讀取文件,並生成一個或多個下列統計信息

  • wc -l <文件名> 輸出行數統計
  • wc -c <文件名> 輸出位元組數統計
  • wc -m <文件名> 輸出字元數統計
  • wc -L <文件名> 輸出文件中最長一行的長度
  • wc -w <文件名> 輸出單詞數統計

count line

netstat -ant | grep "ESTABLISHED" | wc -l
wc -l import.txt

count file characters

wc -c off.xml

less color

ls --color | less

結果 :

ESC[0mESC[01;34mc1ESC[0m
ESC[01;34mc2ESC[0m
ESC[01;34mc3ESC[0m

加上 -R, 結果就會有顏色了

 --color | less -R

-R or –RAW-CONTROL-CHARS : Like -r, but only ANSI “color” escape sequences are output in “raw” form. Unlike -r, the screen appearance is maintained correctly in most cases.

sudo command not found

有時候拿 sudo 去執行某些指令時, 會發生此問題, 因為 sudo 並沒有設定那些指令的路徑, 把它加上去即可

sudo env PATH=$PATH

檔案字尾出現 windows 換行符號 ^M

因為 windows 與 linux 字尾符號不同的關係, 可藉由 dos2unix 修正

基本用法

dos2unix t1.php t2.php t3.php

修正所有檔案(recursive)

find . -type f -exec dos2unix {} \;

或用 vim 修正, 但僅限於可以看到 ^M 在字尾

:%s/\r//g

如果用 vim 開啟看不到 ^M 在字尾要改用

sed -i 's/\r$//' wrap-trim.log

cowsay

jex@jex:/tmp$ echo "Hello World!" | cowsay
 ______________
< Hello World! >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

jex@jex:/tmp$ echo "????????????" | cowthink
 ______________
( ???????????? )
 --------------
        o   ^__^
         o  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ulimit

設定每個 user 能使用的資源 e.g. 開檔數量

  • -a : 列出所有 user 的限制
  • -H : Hard limit 絕對不能超過這個值
  • -S : Soft limit 可以超過,但會有警告
  • -d : process 可使用的最大容量
  • -f : 不加參數會回傳限制的大小,加上數值會設定 process 可以建立的最大檔案的容量 (單位: Kbytes)
  • -p : 可用 pipe 的數量
  • -l : 可用於 lock 的記憶體量
  • -t : 可使用的最大 CPU 時間 (秒)
  • -u : 某一 User 可使用的最大 process 數量
  • -n : Specifies the limit on the number of file descriptors a process may have

To set the size of core dumps to unlimited, use:

ulimit –c unlimited

uptime

server 總共執行多久了

 10:53:24 up 34 days,  7:47,  1 user,  load average: 0.09, 0.06, 0.06

load average 代表是系統的平均負荷

後面的3個數字分別代表 1, 5, 15 分鐘。0 CPU 空閒, 1 代表 cpu 滿載, 數值有可能會大於 1

tee

將標準輸出分流出來, 不會影斷原本的標準輸出

$ echo 'Hello World' | tee t1.txt
Hello World
$ cat t1.txt
Hello World

-a: 累加, 而不是覆寫

date

輸出 timestamp

date +%s

timestamp to datetime

date -d @1481605585
Tue Dec 13 05:06:25 UTC 2016

datetime to timestamp

date -d '2018/05/09 09:30:30' +"%s"
date -d 'TZ="UTC+9" 2018-07-04 02:53:06' +%s   // 會幫你把 datetime +9 再轉成 timestamp
date -d 'TZ="UTC-9" 2018-07-04 02:53:06' +%s   // 如果 datetime 是日本時間, 再轉成 timestamp 這樣才對

開機自動執行

/etc/rc.d/rc.local :

touch /var/lock/subsys/local   # 原本就存在的,新增的寫在下面
/etc/init.d/nginx start
/etc/init.d/php-fpm start

lsof

欄位說明請參考: http://man7.org/linux/man-pages/man8/lsof.8.html

$ sudo lsof /dev/ptmx
[sudo] password for jex_lin:
COMMAND     PID         USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd       1134         root    5u   CHR    5,2      0t0   86 /dev/ptmx

檔案刪除了, 空間卻沒有被釋放, 還是被維持 open 的狀態, 所以空間釋放不了, 用這個指令查可以把它找出來, 再把這個 process kill 掉就行了

sudo lsof | grep deleted

my-monitor    8172  9770       root  156r      REG              202,1 1359484070     276282 /home/apps/example/test.log (deleted)
my-monitor    8172  9770       root  163r      REG              202,1 1359484070     276282 /home/apps/example/test.log (deleted)
my-monitor    8172  9770       root  191r      REG              202,1 1359484070     276282 /home/apps/example/test.log (deleted)
my-monitor    8172  9770       root  212r      REG              202,1 1359484070     276282 /home/apps/example/test.log (deleted)
my-monitor    8172  9770       root  214r      REG              202,1 1359484070     276282 /home/apps/example/test.log (deleted)
my-monitor    8172  9770       root  226r      REG              202,1 1359484070     276282 /home/apps/example/test.log (deleted)

free up memory

linux:

echo 3 > /proc/sys/vm/drop_caches
  • 1: pagecache
  • 2: dentries and inodes
  • 3: 1 + 2

mac:

sudo purge

hexdump: 將檔案(一般檔案或 binary) 輸出成 16 進制

-C 輸出三列(文字偏移量,16進制,ASCII)

hexdump -C test.txt
00000000  30 31 32 33 34 35 36 37  38 39 41 42 43 44 45 46  |0123456789ABCDEF|
00000010  47 48 49 4a 4b 4c 4d 4e  4f 50 51 52 53 54 55 56  |GHIJKLMNOPQRSTUV|
00000020  57 58 59 5a 0a                                    |WXYZ.|
00000025

最後的 0a 是換行字元, 可用 ASCII 對應表來看

xxd: 將檔案輸出成 16 進制或 2 進制

不加參數, 輸出成 16 進制

xxd test.txt
0000000: 3031 3233 3435 3637 3839 4142 4344 4546  0123456789ABCDEF
0000010: 4748 494a 4b4c 4d4e 4f50 5152 5354 5556  GHIJKLMNOPQRSTUV
0000020: 5758 595a 0a                             WXYZ.

-b 輸出成 2 進制

xxd -b test.txt
0000000: 00110000 00110001 00110010 00110011 00110100 00110101  012345
0000006: 00110110 00110111 00111000 00111001 01000001 01000010  6789AB
000000c: 01000011 01000100 01000101 01000110 01000111 01001000  CDEFGH
0000012: 01001001 01001010 01001011 01001100 01001101 01001110  IJKLMN
0000018: 01001111 01010000 01010001 01010010 01010011 01010100  OPQRST
000001e: 01010101 01010110 01010111 01011000 01011001 01011010  UVWXYZ
0000024: 00001010

最後的 00001010 = Hexadecimal 0a 是換行字元

Symbolic Link

ln -s {source_path} {destination_path}

e.g.

ln -s /tmp/QQ /tmp/cc

readlink/realpath: Find out the real path of a symbolic link

  • realpath {path}
  • readlink {path}

e.g.

readlink -f /proc/self/

pushd/popd: very useful command to allow you to roam the directory.

pushd /tmp          # put current path in FIFO Queue and go to /tmp
popd                # go to that path that comes from FIFO Queue

Redirections (重定向)

  • 1> = >: 標準輸出 redirection, 因為輸出的 fd 為1, 所以可省略
  • 1>> = >>: 累加 redirection
  • 2>: 錯誤輸出 redirection
  • 0<<: 標準輸入 redirection
  • -: 標準輸入
  • 2>&1: stderr 重定向 stdout (merge)
  • 1>&2 or >&2: stdout 重定向 stderr (merge)
  • << STRING: 結束的輸入字串
  • echo "hello": This text is shoved into the stdin of the program ‘echo’
  • echo < file.txt: Redirects file.txt to the stdin of the program ‘echo’.
    • < redirects the stdout of ‘the program on the right’ to the stdin of ‘the program on the left’
  • ps | grep <userid>: Redirects ps’s stdout to grep’s stdin
  • ls . > output.txt = ls . 1> output.txt: Redirects the stdout of ls . to a file. If this file already existed, it is overwritten.
  • ls . 2> error.txt: Redirects the stderr of ls . to a file.
  • ls . >> output.txt: The same as >, but if the file already existed, stdout will be appended to the end of the file (instead of overwriting it).
  • program 2>&1 output.txt: Merges program’s stderr with its own stdout.
    • 2>&1: merges stderr with stdout
    • &>: has the same effect
  • program &> /dev/null: Redirects both stderr and stdout to /dev/null (a special file which magically makes things disappear).

ref: http://wanggen.myweb.hinet.net/ch4/ch4.html#redirection

SSH 連到本機的VirtualBox

讓本機的 putty 可以連進 VirtualBox 裡

  1. 開啟你的 windows 命令列輸入 ipconfig ,乙太網路卡 VirtualBox Host-Only Network: 的 IPv4 位址 那欄,假設是192.168.0.100,先記下來
  2. 開啟你的 linux terminal 輸入 ifconfig ,找到 inet addr,假設是10.0.3.11,先記下來
  3. 開啟VitualBox左上角機器設定值→網路→連接埠傳送
  4. 將你記下來的 IP 填上去。(主機IP是填windows IP,客體IP是填VirtualBox裡的Ubuntu IP)

     協定 : TCP
     主機IP : 192.168.0.100
     主機連接埠 : 22
     客體IP : 10.0.3.11
     客體連接埠 : 22
    
  5. 接下來打開 putty 連到 virtualBox

  6. Host Name (or IP address) 輸入 :192.168.0.100 (putty:要連的是主機ip)
  7. Port : 22

本機瀏覽器顯示 VirtualBox 裡 http server 結果

  1. 開啟VitualBox左上角機器設定值→網路→連接埠傳送
  2. 填入你的IP資訊,與上面設定幾乎一樣,但有兩部份需要更改

     協定 : TCP
     主機IP : 192.168.0.100
     主機連接埠 : 80
     客體IP : 10.0.3.11
     客體連接埠 : 80
    
  3. 本機網頁執行 http://192.168.0.100/ 即可

本機連到 virtualBox 裡的 samba

[1] 網路→介面卡→附加到選擇「僅限主機」介面卡

[2] virtualBox裡的主機要重新取得ip :

sudo service networking restart
ifconfig

[3] 就可以在本機連到virtualBox裡的samba :

\\ip\share

virtualbox 開多個 instance 並串成區網

將一個已安裝完 openssh-server ubuntu 的主機複製 3 份, 並且每台網路都設定 -> 網路 -> 附加到 橋接介面卡

再將每台主機開機並且指定不同的固定 IP (注意不要和本機的 Lan IP 重覆)

/etc/network/interfaces :

iface eth0 inet static
address 192.168.1.3
netmask 255.255.255.0

並且重啟 sudo service networking restart

這時候 本機及各主機就可以直接 ssh 到各主機了, 而不必透過 NAT 做 Port Forwarding 了

參考來源: 夯哥

S.M.A.R.T 相關指令

介紹

可以檢測你的硬碟健康狀態

Installation

sudo apt-get install smartmontools

當硬碟不支援時顯示 Unavailable :

jex@jex-VirtualBox [stp:1] { /var/www  }$ sudo smartctl -i /dev/sda1
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-19-generic] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     VBOX HARDDISK
Serial Number:    VB47e46d42-bbe471de
Firmware Version: 1.0
User Capacity:    8,589,934,592 bytes [8.58 GB]
Sector Size:      512 bytes logical/physical
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   6
ATA Standard is:  ATA/ATAPI-6 published, ANSI INCITS 361-2002
Local Time is:    Fri May 17 10:08:11 2013 CST
SMART support is: Unavailable - device lacks SMART capability.

To check if the device has SMART capability:

己打開會顯示:

jex_lin@jex { ~  }$ sudo smartctl -i /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital RE3 Serial ATA
Device Model:     WDC WD5002ABYS-18B1B0
Serial Number:    WD-WCASY6863830
LU WWN Device Id: 5 0014ee 2ade88ff2
Add. Product Id:  DELL▒
Firmware Version: 02.03B04
User Capacity:    500,107,862,016 bytes [500 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    7200 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS (minor revision not indicated)
SATA Version is:  SATA 2.5, 3.0 Gb/s
Local Time is:    Mon May 13 13:51:20 2013 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

沒打開smart會顯示 Disabled:

jex_lin@jex { /usr/sbin  }$ sudo smartctl -i /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Western Digital RE3 Serial ATA
Device Model:     WDC WD5002ABYS-18B1B0
Serial Number:    WD-WCASY6863830
LU WWN Device Id: 5 0014ee 2ade88ff2
Add. Product Id:  DELL▒
Firmware Version: 02.03B04
User Capacity:    500,107,862,016 bytes [500 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    7200 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS (minor revision not indicated)
SATA Version is:  SATA 2.5, 3.0 Gb/s
Local Time is:    Mon May 13 16:04:42 2013 CST
SMART support is: Available - device has SMART capability.
SMART support is: Disabled

If SMART is not enabled, it can be enabled by doing:

打開:

jex_lin@jex { ~  }$ sudo smartctl -s on /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.

沒打開:

jex_lin@jex { /usr/sbin  }$ sudo smartctl -s off /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Disabled. Use option -s with argument 'on' to enable it.

check device

jex_lin@jex { ~/jex (master) }$ sudo smartctl -P show /dev/sda
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-25-generic] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

ATA device successfully opened

Use 'smartctl -a' (or '-x') to print SMART (and more) information

Test the device health :

  1. Short (runs tests that have a high probability of detecting device problems)
  2. Extended (or Long; a short check with complete disk surface examination)
  3. Conveyance (identifies if damage incurred during transportation of the device)

To view the device’s available tests and the time it will take to perform each test do:

打開:

jex_lin@jex { ~  }$ sudo smartctl -c /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
General SMART Values:
Offline data collection status:  (0x85) Offline data collection activity
                                        was aborted by an interrupting command from host.
                                        Auto Offline Data Collection: Enabled.
Self-test execution status:      ( 248) Self-test routine in progress...
                                        80% of test remaining.
Total time to complete Offline
data collection:                ( 9480) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        ( 112) minutes.
Conveyance self-test routine
recommended polling time:        (   5) minutes.
SCT capabilities:              (0x303f) SCT Status supported.
                                        SCT Error Recovery Control supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

沒打開會顯示SMART Disabled:

jex_lin@jex { /usr/sbin  }$ sudo smartctl -c /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
SMART Disabled. Use option -s with argument 'on' to enable it.
(override with '-T permissive' option)

To run the tests do:

smartctl -t short /dev/<device>
smartctl -t long /dev/<device>
smartctl -t conveyance /dev/<device>

Results

To view the test’s overall health status (compiled from all tests):

jex_lin@jex { ~  }$ sudo smartctl -H /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

PASSED表示硬碟健康狀態良好 Failure表示硬碟有問題

To view the test’s result errors:

jex_lin@jex { ~  }$ sudo smartctl -l selftest /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
1  Extended offline    Completed without error       00%        95         -
2  Short offline       Completed without error       00%        94         -

To view the test’s detailed results:

sudo smartctl -a /dev/sda1

或使用↓顯示部份資訊

sudo smartctl -A /dev/sda1

If no errors are reported the device is likely healthy. If there are a few errors this may or may not indicate a problem and should be investigated further. When a device starts to fail it is recommended to backup the data and replace it.

ID#

  • This ID for the attribute is displayed as a decimal number in this report but other reports may display it in its native hexadecimal format.

Attribute Name

  • The human readable description of the ID#

Flag

  • This is a hexadecimal description of the purposes of this attribute combined so they can be represented by a number.
  • For example is it for performance, error rates or pre-fail or some combination of these and others.

Value

  • This is a normalized version of the data that starts at its best possible value (like 200 for this attribute) and then decreases as it gets worse (now 192 for this attribute).

Worst

  • The worst that the Value has ever been.
  • Note that some vendors firmware may actually increase the “Worst” value for some rate-type Attributes.

Threshold (THRESH)

  • These are defined by the vendor.
  • The threshold for the Value. Once the Value goes below this, the drive will consider it to be FAILED for this attribute and depending on the attribute (like this one) the whole drive will be considered to be failing and warnings will be sent to backup and replace it.

Type

  • A human readable version of the Flag value but not as detailed.
  • Note that if an Attribute is of type ‘Pre-fail’, it does not mean that your disk is about to fail! It only has this meaning if the Attribute’s current Normalized value is less than or equal to the threshold value.

Updated

  • How often the attribute’s value is updated.
  • Some SMART attributes values, that are updated only during off-line data collection activities are labeled “Offline” in column “UPDATED”.

When Failed

  • If there was a failure where the value reached or went below the threshold value, the power-on lifetime is displayed here (usually in hours )
  • If the Attribute’s current “Normalized value” is less than or equal to the threshold value, then the attribute is marked with “FAILING_NOW” in column WHEN_FAILED.

Raw Value

  • The raw non-normalized value of the attribute.
  • Please keep in mind that the conversion from RAW value to a quantity with physical units is not specified by the SMART standard! smartctl only reports the different Attribute types, values, and thresholds as read from the device. It does not carry out the conversion between “Raw” and “Normalized” values: this is done by the disk’s firmware.
  • In most cases, the values printed by smartctl are sensible. For example the temperature Attribute generally has its raw value equal to the temperature in Celsius. However in some cases vendors use unusual conventions. For example the Hitachi disk on my laptop reports its power-on hours in minutes, not hours. Some IBM disks track three temperatures rather than one, in their raw values. Have a look at our wiki pages on topic SMART attributes.

狀態:

  • Worst = 曾經發生過最壞時的值
  • Value = 目前的值
  • Threshold = 門檻值,超過此值代表硬碟瑕疵已超過容許的範圍
  • T.E.C. = 一個預估你的硬碟壽命的日期

補充:

參數說明:

  • -h 顯示參數說明及範例
  • -V 顯示版本等相關資訊
  • -i 顯示該硬碟的相關資訊(包括是否啟動 SMART)
  • -a 顯示硬碟所有相關資訊
  • -H 顯示硬碟 SMART 健康狀況 (健康 PASSED、生病 FAILED)
  • -c 顯示硬碟支援的檢查、測試項目
  • -A 顯示硬碟檢查後的相關屬性值 (例如 194 Temperature_Celsius 最後值為 HDD 溫度)
  • -l TYPE 顯示硬碟檢查後 Log (TYPE: error, selftest, selective, directory)
  • -t TEST 執行硬碟測試 (TEST: offline, short, long, conveyance, select,M-N pending,N afterselect,on afterselect,off)
  • -X 放棄執行硬碟測試

中斷背景檢測硬碟:

jex_lin@jex { ~  }$ sudo smartctl -X /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Abort SMART off-line mode self-test routine".
Self-testing aborted!

顯示硬碟錯誤log:

jex_lin@jex { ~  }$ smartctl -l error /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
Smartctl open device: /dev/sda1 failed: Permission denied
jex_lin@jex { ~  }$ sudo smartctl -l error /dev/sda1
smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.7.4-1-ARCH] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Error Log Version: 1
No Errors Logged

-d指定設備類型,例如: ata, scsi, marvell, sat, 3ware,N

$ smartctl -s on -d ata /dev/sdb

disk判斷項目 :

假設 exec() 第3參數為 $is_fail

  1. 有安裝但不支援,$is_fail = 0 (解析第2參數判斷Unavailable)
  2. 有安裝但沒打開,$is_fail = 0 (解析第2參數判斷Disabled)
  3. 沒安裝smart,$is_fail = 1
  4. disk路徑亂打(/devx/sda8),$is_fail = 1 or 127
  5. 指定不存在的disk (/dev/sda8),$is_fail = 2

參考來源:

https://sites.google.com/site/lab586/linuxnote/hddchecktip https://wiki.archlinux.org/index.php/SMART http://space.itpub.net/12823785/viewspace-504042 http://www.weithenn.org/cgi-bin/wiki.pl?Smartmontools-%E6%AA%A2%E6%9F%A5%E6%B8%AC%E8%A9%A6%E7%A1%AC%E7%A2%9F%E5%A3%BD%E5%91%BD http://southdogs.blogspot.tw/2008/05/smart.html http://www.adminii.com/486.html http://html5.litten.com/accessing-and-assessing-a-hard-drives-s-m-a-r-t-data/ http://sourceforge.net/apps/trac/smartmontools/wiki/Howto_ReadSmartctlReports_ATA

PHP - Exec() 執行系統指令

介紹

exec() 是用來執行 linux 指令的,並且可以透過它取得執行結果

分析 exec('ls -l 2>&1', $result, $is_fail)

[1] 首先第一個參數是 command line,執行的是ls -l指令

[2] 第二個參數是當執行成功才會有值,失敗則不會有值

原本執行錯誤時 $result 是不會有值的,但當 command line 加上2>&1就可以將錯誤訊息回傳給 $result

[3] 第三個參數為狀態碼,簡單來說就是執行成功為 0,非 0 則是失敗

  • 1 : Catchall for general errors
  • 2 : Misuse of shell builtins (according to Bash documentation)
  • 126 : Command invoked cannot execute
  • 127 : “command not found”
  • 128 : Invalid argument to exit

不要完全相信以上表的錯誤訊息, 建議要取得準確的錯誤訊息還是加上2>&1比較好

exec(‘sudo …..’), 使用 sudo 執行指令

[1] apache 預設執行身份在 /etc/apache2/envvars

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

[2] 原本是在 /etc/apache2/apache2.conf :

有些 linux 的 apache 的預設執行身份不像 ubuntu 是用變數,而是直接寫死在這的, 所以 ubuntu 的 apache2.conf 會再去 load envvars,取得 user 身份 :

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

[3] 執行權限設定在 /etc/sudoers , apache 預設的 http user 是 www-data

如果要用 sudoexec 執行特定指令

www-data ALL=(ALL) NOPASSWD: /usr/sbin/smartctl,/usr/bin/php

允許執行所有指令:

www-data ALL=(ALL) NOPASSWD:ALL

為了讓 exec() 執行 sudo 時不需要輸入密碼,否則 exec() 沒辦法執行

[4] 例如執行 smartctl 指令:

echo exec("sudo -u www-data sudo smartctl -i /dev/sda1");

如果 apache 預設的執行 user 是 www-data (例如: 步驟 1 預設執行 user 是 www-data),則可以省略寫成:

echo exec("sudo smartctl -i /dev/sda1");

參考來源:

Dd 指令

(最後更新: 2016-04-14)

介紹

用來複製或轉換為一個檔案

假設目前系統環境只有一顆硬碟,當初安裝時沒有多切,但不想要重新再切,所以以dd產生一個檔案,並且利用這個檔案所佔的空間去模擬一個磁碟

[1] 產生一個50M的檔案

sudo dd if=/dev/sda1 of=~/virtual2.img bs=1M count=50

[2] 將這個檔案切成磁碟

cfdisk virtual2.img

選logical

[3] 格式化成XFS

sudo mkfs.xfs virtual2.img -f

[4] mount它,-o pquota是xfs特有的參數不需理會,可以將xfs改成你熟悉的ext4

sudo mount -t xfs ~/virtual2.img ./test -o pquota

xfs的 folder quota 正常:)

swap 指令

  • 通常安裝主機都會設定 swap
  • 但如果沒有 swap 或要增加 swap 可自行設定

sudo swapon -a

sudo swapoff -a

釋放 swap

sudo swapoff -a
sudo swapon -a

查看 swap 狀態

swapon -s

另種方式看 Swap 的狀態

$ free -m
             total       used       free     shared    buffers     cached
Mem:           992        711        281          0         83        418
-/+ buffers/cache:        209        782
Swap:            0          0          0

建立/增加 swap

建立 1G swap

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

掛載這個 Swap

sudo mkswap /swapfile
sudo swapon /swapfile

Swap 確實設定好了

swapon -s
Filename                                Type            Size    Used    Priority
/dev/xvdb                               partition       262140  133804  -1
/swapfile                               file            1048572 0       -2


$ free -m
             total       used       free     shared    buffers     cached
Mem:           992        896         95          0         18        660
-/+ buffers/cache:        217        775
Swap:         1023          0       1023

確寶每一次 swap 都會被啟動

/etc/fstab :

/swapfile   none         swap    sw      0       0

為了避免太差的效能, swappiness 應該設定 10, 可以讓 swap 作為緊急緩衝區, 預防用光記憶體導致 crash

echo 10 | sudo tee /proc/sys/vm/swappiness
echo vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf

設定正確權限給 swap file

sudo chown root:root /swapfile
sudo chmod 0600 /swapfile

ref : https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-12-04

Vim 快捷鍵

Command Line

  • vim http://www.google.com : 開啟google原始碼
  • vim -p qq.php cc.php : 用tabe顯示,用gt切換下一個tabe
  • vim -O qq.php cc.php : 垂直分割顯示
  • vim -o qq.php cc.php : 水平分割顯示
  • vim -u NONE cc.php : 不要進行初始化直接開啟檔案 (對開大檔會快很多)

新增、刪除、插入

  • O : 在游標那行的上一行插入新的一行
  • o : 在游標那行的下一行插入新的一行
  • I : 在該行的第一個字元進入插入模式
  • i : 在游標前進入插入模式
  • A ( = $ + a) : 在該行的最後一個字元進入插入模式
  • a : 在游標後進入插入模式
  • C : 刪除游標後的字串並進入到insert模式
  • cc : 刪除該行並進入到insert模式(保留縮排)
  • 1cj : 刪除游標該行及下一行共2行並進入插入模式
  • D : 刪除游標後的字串
  • dd : 刪除整行
  • 2dd : 刪除下列2行
  • 10dh : 向左刪除10個字元
  • d0 : 刪除游標位置前的字元
  • d^ : 刪除游標位置前的字元(保留縮排)
  • d$ : 刪除游標位置到最後一個字元
  • de : 刪除游標位置到區塊的最後一個字元
  • db : 向前刪除區塊單字
  • dw : 向後刪除區塊單字
  • x : 刪除游標所在的字元
  • X : 向前刪除字元
  • s : 刪除游標那個字元並進入 insert 模式
  • S : 同 cc
  • 10x : 刪除游標後的5個字元
  • J : 將游標所在列與下一列的資料結合成同一列
  • 3J : 將下兩行包含游標該行共3行合併成一行
  • d0 : 游標所在處向前刪除到第0格
  • d^ : 游標所在處向前刪除到縮排處停止
  • diw : 刪除游標上的單字
  • ciw : 刪除游標上的單字並進入insert模式
  • cw : 刪除在單字上游標以後字串
  • ci' : 刪除單引號內的字串並進入insert模式
  • ci" : 刪除雙引號內的字串並進入insert模式
  • ci( : 刪除括號內的內容並進入insert模式
  • ci[ : 刪除中括號內的內容並進入insert模式
  • ci{ : 刪除大括號內的內容並進入insert模式
  • ci< : 刪除<(內容)>並進入insert模式
  • ca' : 刪除單引號內的字串及單引號並進入 insert 模式
  • di' : 刪除單引號內的字串
  • dst : 刪除 html 標籤, 但內容會保留
  • dit : 刪除 html 標籤內容, 但標籤會保留
  • cit : 刪除 html 標籤內容, 並進入 insert 模式
  • 6i6a + 任意字串 : 6 次 * 任意字串
  • d/a : 刪到 a 為止
  • guu : 整行變小寫
  • gUU : 整行變大寫
  • g~~ : 整行大小寫交換

複製、剪下、貼上

  • shift + Insert : (insert模式下)將系統剪貼簿貼上游標位置。
  • ctrl + v : 對區塊共同做編輯
  • ctrl + v 選取後按c : 把選取的字刪掉並進入insert模式
  • V(select whole line) + y : 相當於 ctrl + c
  • v(select area) + y : 相當於 ctrl + c
  • P : 貼上於目前游標的上一行
  • p : 貼上於目前游標的下一行,相對於 ctrl + v
  • y1G : 複製游標所在列到第一列的所有資料
  • y0 : 複製游標所在的那個字元到該行行首的所有資料
  • y$ : 複製游標所在的那個字元到該行行尾的所有資料
  • yy : 複製游標所在的那一行
  • 20yy : 複製 20 行
  • Y : 複製游標所在的那一行
  • :m+ : 把目前這一行往下移動一行
  • :m-2 : 把目前這一行往上移動一行
  • shift + insert : 在insert模式貼上滑鼠複製的東西
  • [p : 貼到游標前
  • ]p : 貼到游標後
  • dip : 刪除最外層的tag及裡面的所有內容
  • yiw : 複製單字
  • yi' : 複製單引號內的字串
  • vi' : 選取單引號內的字串並進入visual模式
  • " + a + y + i + ' : 將單引號的內容(不包含單引號)存進暫存a
  • " + a + y + a + ' : 將單引號的內容(包含單引號)存進暫存a
  • v + ^ + y : 複製從游標到最前面的字串
  • vitp : 貼在 HTML Tag 裡
  • :2y : copy 第 2 行
  • :2,7y : copy 第 2 ~ 7 行

Visual模式

  • ~ : 在visual模式已選取下,切換大 / 小寫
  • U : 在visual模式已選取下,轉成大寫
  • u : 在visual模式已選取下,轉成小寫
  • viw : 選取游標上的單字並進入visual模式。(v = visual, i = inside, w = word)
  • vit : 選取<tag>裡面的內容並進入visual模式。例: <a href='#'>(選取這一塊)</a>
  • vat : 選取<tab>全部內容包含<tag>本身,並進入visual模式(a = around)。選取<a ..(略)..>內容</a>整段
  • vip : 選取最外層的tag及裡面的所有內容並進入visual模式
  • ggVG : 全選
  • = : 在visual模式己選取下,自動縮排

游標移動

  • # : 向前搜尋游標上相同的單字。或按N 往下 n 往上
  • * : 向後搜尋游標上相同的單字
  • % : 在() {} 上會切換到相對應的上
  • [ + { : 在括號裡游標會移到 {
  • ] + } : 在括號裡游標會移到 }
  • [ + ( : 在括號裡游標會移到 (
  • ] + ) : 在括號裡游標會移到 )
  • 0 : 游標移到最前
  • ^ : 游標移到最前(保留縮排)
  • $ : 標移到最後
  • :1212G: 游標移到第12行
  • H : 移動到該頁第一行
  • M : 移動到該頁中間那一行
  • L : 移動到該頁最後一行
  • 1Ggg : 移動到檔案的第一行
  • G : 移動到檔案的最後一行
  • w : 移動到下一個單字, 2w 移到下兩個單字
  • W : 跳下一個單字比w更遠
  • b : 移動到前一個單字、與w相反
  • e : 移動到目前單字的最後一個字
  • t + a : 找到 a 的前一格
  • fa : 往下移動找到 a 。按;移到下一個
  • Fa : 往上找到 a 。按;移到下一個
  • 3fa : 移動到往後的第三個a的位置
  • 4j : 往下移動4行
  • 4k : 往上移動4行
  • 4h : 往左移動4格
  • 4l : 往右移動4格
  • ctrl + o : 回覆到上一個游標的位置(按太多會到你上一個編輯的檔案)
  • ( : 跳到上一個區塊的第一行或最後一行
  • ) : 跳到下一個區塊的第一行或最後一行
  • [[ : 跳到上一個區塊的第一行
  • ]] : 跳到下一個區塊的第一行
  • { : 跳到上一個區塊的最後一行
  • } : 跳到下一個區塊的最後一行
  • + : 移動到非空白區的下一列(保留縮排)
  • - : 移動到非空白區的上一列(保留縮排)
  • mx : 記下目前的為止為 x
  • 'x : 回到 x 這個位置
  • '' : 回到最後的 jump點
  • ctrl + i : 回到後一個 jump 點
  • ctrl + o : 回到前一個 jump 點

畫面移動

  • ctrl + f : 下一頁 ( = Page Up)
  • ctrl + b : 上一頁 ( = Page Down)
  • ctrl + d : 下半頁
  • ctrl + u : 上半頁
  • ctrl + y : 畫面移上一行
  • ctrl + e : 畫面移下一行
  • zz : 移動畫面置中游標
  • zb : 移動畫面置底游標
  • zt : 移動畫面置頂游標
  • zl : 畫面向右水平移動一格
  • zL : 畫面向右水平移動半個畫面
  • zh : 畫面向左水平移動一格
  • zH : 畫面向左水平移動半個畫面
  • zs : 根據目前的游標位置將畫面水平移動到最左
  • ze : 根據目前的游標位置將畫面水平移動到最右

在分割視窗時讓其他視窗一起 scrolling down

對每個視窗下 :set scb (:set scrollbind 縮寫), 然候再測試是否 work (ctrl + e)

取消的話對其中一個下 :set scb! (:set noscrollbind 縮寫) 就可以解除了

搜尋、取代

  • /abc : 向下搜尋abc
  • ?abc : 向上搜尋abc
  • n : 下一筆搜尋結果
  • N : 上一筆搜尋結果
  • :35,44g/uid/ : 在 33 到 44 行之間搜尋 uid
  • :100,200s/vbird/VBIRD/g : 在 100 到 200 行之間搜尋 vbird 並取代為 VBIRD
  • :1,$s/word1/word2/g : 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2
  • :1,$s/word1/word2/gc : 且在取代前顯示提示字元給使用者確認 (confirm) 是否需要取代
  • :%s/phpindo/phpinfo/g : 取代。%s = 1,$s
  • :101,201s/phpindo/phpinfo/g : 取代 101~201 行
  • gd : 在程式的變數上循序按下 gd,可以找到 local declaration 的位置
  • gD : 同上,只是會找到 global declaration 的位置

分割視窗

  • :new : 開新的水平分割視窗
  • :vnew : 開新的垂直分割視窗
  • :sp : 新增目前的檔案到新視窗
  • :sp t1.php : 新增另一個檔案加入到分割視窗
  • vs : 同vsp
  • :vsp : 垂直分割
  • :sp ./ : 用選取的方式尋找檔案
  • :q : 離開
  • shift + ZZ : 離開; 等同 :q
  • ctrl + ww : 切換到下一個視窗
  • ctrl + w + 3w : 切換到第三個視窗(如果有多個視窗)
  • ctrl + w + p : 切換到前一個視窗
  • ctrl + w + n : 開啟新視窗
  • ctrl + w + w : 游標切到不同的視窗 (不管是水平還是垂直)
  • ctrl + w + q : 結束目前視窗
  • ctrl + w + x : 視窗交換位置
  • :sq + 按space + (按)tab + :列出可選的選項,按↓進入資料夾
  • ctrl + w + v : 垂直
  • ctrl + w + s : 水平
  • ctrl + w + o : 留下目前視窗關閉其他
  • ctrl + w + (jkhl) : 切換下、上、左、右
  • ctrl + w + (+-) : 調整垂直大小
  • ctrl + w + (<>) : 調整水平大小
  • ctrl + w + _ : 將視窗垂直打開到最大
  • ctrl + w + |(pipe) : 將視窗水平打開到最大
  • ctrl + w + = : 將其他視窗復原大小

暫存器

  • :reg : 把暫存器裡的東西叫出來看
  • "2y : 複製到暫存器索引2 (可配合visual模式使用)
  • "kyy : 複製整行到索引k
  • "kp : 貼上索引k
  • :let @k='' : 清空索引k
  • :let @0=@1 : 索引1複製給索引0
  • "+x : 剪下,將資料放進剪貼簿及vim緩衝區
  • "+y : 複製,將資料放進剪貼簿及vim緩衝區
  • "+gp : 貼上

buffer

  • :e qq.php : 跳去編輯 qq.php 這個檔案, qq.php 會在 buffer 裡
  • :ls : 顯示buffer裡的檔案
  • :bn : 切到下一個buffer檔案
  • :bp : 切到上一個buffer檔案
  • :b2 : 切到buffer 2號檔案
  • :b qq.php : 切到檔名為qq.php的buffer檔案
  • ctrl + 6 : 回到上一個開的buffer檔案。注意 : :bp是不一樣的!

tab

  • :h tabe : 列出tabe的helper
  • gt : 跳到下一個tabe
  • gT : 跳到上一個tabe
  • :tab ba : 將目前的buffer切換成tab
  • :tabe : 開一個新的tab
  • :tabe qq.php : 開啟qq.php為tab(不存在就會在當前目錄建立新檔案)
  • :tabmove 1 : 將當前 tabe 順序移動到順序1
  • 3gt : 跳至tabe順序3

儲存、離開

  • :wa : 全部儲存
  • :qa : 關掉全部視窗
  • :w : 儲存
  • :q : 離開
  • :w! : 強制儲存
  • :wq : 儲存後離開
  • :w ~/qq.php : 另存新檔
  • :e qq.php : 打開qq.php,並關閉目前所在頁面

其他操作

  • u : 回復上一個動作
  • ctrl + r : 回復下一個動作
  • :noh : 取消選取的highlight
  • :! ls -l : 在 vim 下暫時切到外面執行 ls -l
  • :set nu : 顯示行號,設定之後會在每一行的最前面顯示行號
  • :set nonu : 與 set nu 相反,為取消行號!
  • :set paste : paste模式,直接貼上文字時格式不會跑掉
  • :set tabstop=4 : 設定一個tab等於四個空白長度
  • :set expandtab : 設定以後,使用tab鍵時會用空白取代(由tabstop設定而定)
  • :set incsearch : / 不需按 Enter, 邊打邊搜尋
  • :set nohlsearch : / 不要 highlight 找到的字串
  • :retab : 將tab轉換成space
  • :edit or :edit! : reload
  • ctrl + p : 自動補齊變數名稱或語法
  • ~ : 可以將游標上的字切換大 / 小寫
  • . : 重覆前一個動作
  • >> : 縮排
  • 3>> : 游標那行與下2行一起縮排
  • << : 縮排倒退
  • :3,5>> : 3到5行向右縮排2次
  • :3,5< : 3到5行向左縮排1次
  • :%norm A* : 在每一行最後面加上 *norm = type the following commands
  • :11,13 norm Aqq : 在第 11~13 行最後面加上 qq 字串
  • gf : 跳到 source code 的檔案, 例如在 /tmp/cc.ff 上按, 就會跳到該檔案
  • ctrl + w + gf : 會在 tab 打開 source code 的檔案
  • :指令 + ctrl + d : 會出現相關指令的 menu, 再按 tab 會補齊指令

範圍

加上註解(//)

  • 加上註解 :
    1. 在第一行按下ctrl + v 進入到選取區塊模式
    2. 游標向下移到要註解的最後一行
    3. I
    4. 輸入 // (註解符號,看你的程式語言是什麼)
    5. esc
  • 取消註解 :
    1. 在第一行按下ctrl + v 進入到選取區塊模式
    2. 游標向下移到要註解的最後一行
    3. 按一個右鍵, 讓區塊把 // 包起來
    4. x刪除

  • 加上註解 : :34,37s/^/\/\//g
  • 取消註解 : :34,37s/^\/\///g

範圍縮排

shift + v : 選出要縮排的列再按>>,這時候只會縮排一次,再按.(複製上一個動作)就可以要縮排幾次就按幾下

vim plugin

hello.vim

function! XX()
    echo getpos(".")
endfunction

隨便編輯其他文件

  1. :source hello.vim
  2. :call XX()

就會 print 出你目前的游標位子了, 如: [0, 3, 8, 0]

get external command return

let a = system('ls -al')
echo a

讓 vim 複製到 Clipboard

確認目前 vim 版本有支援此功能

(TODO: 未完成)

vim --version | grep clipboard

如果看到 +clipboard or +xterm_clipboard 就表示有

看到 -clipboard and -xterm_clipboard 表示沒有

:set clipboard=unnamed
:set clipboard+=unnamed

查看檔案的 binary hex

command:

vim test.txt

test.txt 進入後輸入 :%!xxd

0000000: 3031 3233 3435 3637 3839 4142 4344 4546  0123456789ABCDEF
0000010: 4748 494a 4b4c 4d4e 4f50 5152 5354 5556  GHIJKLMNOPQRSTUV
0000020: 5758 595a 0a                             WXYZ.

最後面的 0a 是換行字元

編輯中間的 hex

0000000: 3031 3233 3435 3637 3839 4142 4344 4546  0123456789ABCDEF

將 23 (hex 3233) 位置調換成 32 (hex 3332)

0000000: 3031 3332 3435 3637 3839 4142 4344 4546  0123456789ABCDEF

再執行 :%!xxd -r 將 hex 轉回來

0132456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

XFS - Folder Quota

介紹

xfs 是一種 file system 的 format, 像 ext4 一樣, 不過它特別的地方在於它可以方便的對目錄做 quota 限制

Ubuntu 安裝 :

sudo apt-get install xfsprogs xfsdump

Set quota :

Make the filesystem and mount it:

mount /dev/sda5 /mnt/xfs -o pquota

Create a project named “project1”, which is the “/mnt/xfs/test1” tree:

mkdir test1     #on /mnt/xfs
echo "11:/mnt/xfs/test1" >> /etc/projects
echo "project1:11" >> /etc/projid
xfs_quota -x -c "project -s project1" /dev/sda5

Set the tree quota to 2 MB:

xfs_quota -x -c "limit -p bsoft=1m bhard=2m project1" /dev/sda5

或直接指定project id

xfs_quota -x -c "limit -p bsoft=1m bhard=2m 1" /dev/sda5

也可以使用projects id指定 ex : “limit -p bsoft=1m bhard=2m 11”

That’s it.. Now let’s make some tests:

dd if=/dev/zero of=/mnt/xfs/test1/aaa count=10 bs=1024k

And there’s also a nice report! (looks nicer with a fixed-width console font)

xfs_quota -x -c "report /dev/sda5"

將一個quota綁定多個資料夾:

在/etc/projects設定:

7:/jex_ugc/jexstorage/default/jex_lin
7:/jex_ugc/jexstorage/default/hun

xfs report 中 id=7 的 used欄位會將jex_lin及hun資料夾使用空間加總,超過quota限制的話就會將兩個資料夾鎖住

Set Unlimited Quota

sudo xfs_quota -x -c "limit -p bsoft=0m bhard=0m project1" /dev/mapper/jex--vg-jex--lv

Remove quota :

執行清除project quota指令

$ sudo xfs_quota -xc "project -C 1" /dev/mapper/jex--vg-jex--lv
Clearing project 1 (path /jex_ugc/jexstorage/test)...
Processed 1 (/etc/projects and cmdline) paths for project 1 with recursion depth infinite (-1).

刪除資料夾與 /etc/projects 及 /etc/projid 的對應資料

  • 如果要將/etc/projects其中一個project id的資料夾做更改一定要先執行clear quota再改,不然如果舊的資料夾還存在的話會變成限制成兩個資料夾
  • 要先執行clear quota再刪除資料夾否則會發生找不到資料夾的錯誤

      jex@jex:/jex_ugc/jexstorage$ sudo xfs_quota -xc "project -C 1" /dev/mapper/jex--vg-jex--lv
      xfs_quota: cannot find mount point for path `/jex_ugc/jexstorage/test': No such file or directory
      Processed 0 (/etc/projects and cmdline) paths for project 1 with recursion depth infinite (-1).
    

其他功能:

To suspend (i.e. freeze) an XFS file system, use:

xfs_freeze -f /mount/point

To unfreeze an XFS file system, use:

xfs_freeze -u /mount/point

command :

  • -c cmd xfs_quota commands may be run interactively (the default) or as arguments on the command line. Multiple -c arguments may be given. The commands are run in the sequence given, then the program exits.
  • -p prog Set the program name for prompts and some error messages, the default value is xfs_quota.
  • -x Enable expert mode. All of the administrative commands (see the ADMINISTRATOR COMMANDS section below) which allow modifi - cations to the quota system are available only in expert mode.
  • -d project Project names or numeric identifiers may be specified with this option, which restricts the output of the individual xfs_quota commands to the set of projects specified. Multiple
  • -d arguments may be given.

Command details :

xfs_quota> jex@jex:/jex_ugc/jexstorage/test$ sudo xfs_quota -x
xfs_quota> ?
df [-bir] [-hn] [-f file] -- show free and used counts for blocks and inodes
disable [-gpu] [-v] -- disable quota enforcement
dump [-gpu] [-f file] -- dump quota information for backup utilities
enable [-gpu] [-v] -- enable quota enforcement
help [command] -- help for one or all commands
limit [-gpu] bsoft|bhard|isoft|ihard|rtbsoft|rtbhard=N -d|id|name -- modify quota limits
off [-gpu] [-v] -- permanently switch quota off for a path
path [N] -- set current path, or show the list of paths
print -- list known mount points and projects
project [-c|-s|-C|-d <depth>|-p <path>] project ... -- check, setup or clear project quota trees
quit -- exit the program
quot [-bir] [-gpu] [-acv] [-f file] -- summarize filesystem ownership
quota [-bir] [-gpu] [-hnNv] [-f file] [id|name]... -- show usage and limits
remove [-gpu] [-v] -- remove quota extents from a filesystem
report [-bir] [-gpu] [-ahnt] [-f file] -- report filesystem quota information
restore [-gpu] [-f file] -- restore quota limits from a backup file
state [-gpu] [-a] [-v] [-f file] -- get overall quota state information
timer [-bir] [-gpu] value -d|id|name -- get/set quota enforcement timeouts
warn [-bir] [-gpu] value -d|id|name -- get/set enforcement warning counter

Use 'help commandname' for extended help.

測試紀錄

測試刪除資料夾再新增回來同樣的名稱,quota限制是否還在?

將test資料夾刪除,這時看report,會有之前設定的記錄(只要projects及projid沒刪除,都會顯示project{id}的狀態)

Project ID       Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
project1            0       1024       2048     00 [--------]

新增test資料夾

複製10m的檔案,不受quota 2m的影響

jex@jex:/jex_ugc/jexstorage$ dd if=/dev/zero of=/jex_ugc/jexstorage/test/aaa count=10 bs=1024k
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00780022 s, 1.3 GB/s

report顯示的Used也不正常 (其實是10m但report那還是顯示0)

jex@jex:/jex_ugc/jexstorage$ du
10240   ./test
10240   .
jex@jex:/jex_ugc/jexstorage$ sudo xfs_quota -xc "report /dev/mapper/jex--vg-jex--lv"
Project quota on /jex_ugc/jexstorage (/dev/mapper/jex--vg-jex--lv)
                               Blocks
Project ID       Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
project1            0       1024       2048     00 [--------]

解決方法: 重新將test與project{id}綁定,再觀察report結果,Used那正常顯示

jex@jex:/jex_ugc/jexstorage$ sudo xfs_quota -xc "project -s project1" /dev/mapper/jex--vg-jex--lv
Setting up project project1 (path /jex_ugc/jexstorage/test)...
Processed 1 (/etc/projects and cmdline) paths for project project1 with recursion depth infinite (-1).
jex@jex:/jex_ugc/jexstorage$ sudo xfs_quota -xc "report /dev/mapper/jex--vg-jex--lv"
Project quota on /jex_ugc/jexstorage (/dev/mapper/jex--vg-jex--lv)
                               Blocks
Project ID       Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
project1        10240       1024       2048     00 [--none--]

再copy 10m進去,quota就把它擋掉了,得到預期結果

jex@jex:/jex_ugc/jexstorage$ dd if=/dev/zero of=/jex_ugc/jexstorage/test/bbb count=10 bs=1024k
dd: opening /jex_ugc/jexstorage/test/bbb: Disk quota exceeded

就一個已存在的project id指向到一個新建立的資料夾(abc),會發生什麼情形?

2:/jex_ugc/jexstorage/default/test

改成:

2:/jex_ugc/jexstorage/default/abc
  • 綁定後再設quota, 在report顯示出來的used其實是舊的資料夾加上新的資料夾的使用容量,如果超過使用容量就會變成兩個都鎖

解決辦法: XFS在將路徑與project id做綁定時,極大的可能是以inode做綁定,所以只要有綁定都會記錄在xfs資料庫中,所以即使將/etc/projects刪除,但只要曾經綁過就會被紀錄下來,而將quota限制在同一個project id曾綁定過所有資料夾使用的總合

  • 最好的做法是在將/etc/projects變更前先將舊資料夾做Clear Quota,讓舊資料夾跟project id沒有關係後,再變更/etc/projects及將新資料夾與project id綁定
  • 或者是直接刪除該舊資料夾讓xfs找不到它的inode,但可能潛在如果後來生成的資料夾被指派到一樣的indoe,造成xfs也對他做quota 限制

在一個有設定quota的資料夾下將檔案搬移出的問題

假設資料夾 a 有設定quota,project id 為 8 (以下簡稱 p8),裡面有一個檔案test.txt 它的 inode 為 1130

[情況1]

將 a 的 test.txt 檔案搬移到 未設定 quota 的資料夾 b,會產生問題是 p8 仍然還是指向 inode 1130,如果將 a 的 quota 給註銷掉換成資料夾 c,則 p8 的新主人雖然是資料夾 c ,但查看 report 會發現 used 那邊會出錯,因為 inode 1130 這個檔案的使用量會被算到資料夾 c (實際上檔案是在 b 那邊) ,解決方法只要把 inode 1130 的檔案刪除

[情況2]

將 a 的 test.txt 檔案搬移到 已設定 quota 的資料夾 b,就不會發生 p8 指向 inode 錯亂的問題了,因為搬過去時 inode也變重新指派

用 inode 反查

sudo xfs_db -xr -c 'inode 16777350' -c p /dev/sda5

http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/ch08s16.html

備註 :

  • 現代的文件系統如JFS和XFS能夠動態地增加inode,因此不會用盡inode。(From: inode wiki)
  • 動態變更上限值 : 直接執行步驟3重新指定上限值即可
  • 步驟2 “11:/mnt/xfs/test1”中的編號11只可以使用數字,並且 不能超過65535 ,超始值 : 1
  • 當資料夾rename時,/etc/projects更改路徑,原有的quota限制也都會對應到
  • About soft and hard : When a user exceeds the soft limit, the timer is enabled. Any time the quota drops below the soft limits, the timer is disabled. If the timer pops, the particular limit that has been exceeded is treated as if the hard limit has been reached, and no more resources are allocated to the user. The only way to reset this condition, short of turning off limit enforcement or increasing the limit, is to reduce usage below quota. Only the superuser (i.e. a sufficiently capable process) can set the time limits and this is done on a per filesystem basis.
  • 中文檔名:

    1. Max. filename length : 255bytes
    2. 85個中文 => OK!
    3. 80個中文+15英文 => OK!
    4. 80個中文+15數字 => OK!
    5. 80個中文+16個英文或數字 => error!
  • 符號:

    1. 允許符號 : ~!@#$%^&*()_+ \‘ ”
    2. 除了 / 不允許其他都OK

其他限制方式:

User Limits

limits xfs_quota -x -c 'limit bsoft=1000m bhard=1200m username'
limits xfs_quota -x -c 'limit isoft=500 ihard=700 username'

Group Limits.

xfs_quota -x -c 'limit -g bsoft=1000m bhard=1200m groupname'
Project Limits

參考:

http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/index.html http://www.held.org.il/blog/2008/07/per-directory-quota-not-a-dream/ http://dell9.ma.utexas.edu/cgi-bin/man-cgi?xfs_quota+8 http://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/xfsfreeze.html

磁碟分割、掛載

fdisk

  • -l : 查閱目前系統所有的partition有哪些
  • -l /dev/sda1 : 確認一下它是否可以分割
  • /dev/sda1 : 輸入h可以查閱可使用的指令

磁碟分割

當安裝linux,要分割磁碟時,類型有分為兩種:

  1. primary : 放置主要系統檔
  2. logical : 如果要自行利用磁區可以選擇它

假設磁碟共有80G,但不想全部都給主要系統檔,可以選擇:

  • 分 20G 給 primary
  • 分 25G 給 logical
  • 分 25G 給 logical
  • 建議將“記憶體”的2倍分給swap

這樣就有兩個25G磁碟可以讓你任意掛載運用, 但要注意分割磁碟時預設會mount, 要記得設定不要mount

掛/卸載磁碟

1) 在 /home/user_me 建立 test1 及 test2, 資料夾

2) 查詢磁碟狀態

# 列出有磁碟
fdisk -l

# 顯示己掛載之磁碟
df -l

# 顯示filesystem type
df -T

3) 掛載

mount /dev/sda5 /home/user_me/test1
mount /dev/sda6 /home/user_me/test2

如果test1資料夾裡有資料, 在掛載後, 只會顯示/dev/sda5磁碟的資料, 但只要卸載/dev/sda5,原本test1資料就會回來了

如果partition出現錯誤不能掛載: Partition 2 does not start on physical sector boundary.

解法方法 : 刪除 partition -> 再建立 partition -> format 要的檔案格式

4) 卸載:

umount /home/user_me/test1    #卸載/dev/sda5
umount /home/user_me/test2    #卸載/dev/sda6

重新開機後自動 mount

/etc/fstab :

以空格為區塊各代表:
[磁碟裝置檔名或該裝置的 Label] [掛載點] [磁碟分割槽的檔案系統] [檔案系統參數] [能否被 dump 備份指令作用] [是否以 fsck 檢驗磁區 (0:不檢驗, 1:最早檢驗, 2: 要檢驗)]

/dev/sda5 /home/user_me/test1 xfs pquota 0 2
/dev/sda5 /home/user_me/test1 ext4

刪除partition

sudo fdisk /dev/sda
Command (m for help): d
Partition number (1-6): 2
Command (m for help): w (存檔後重開機)

建立partition

extend:

sudo fdisk /dev/sda
Command (m for help): n

第一次切要先選extend(按enter按到底), 第二次之後再切才能選logic

logical

Command (m for help): n
Command (m for help): w (存檔後重開機)

format partition

sudo cfdisk /dev/sda5

> 選logical, 指定完大小後選write

format to xfs

sudo mkfs.xfs /dev/sda5 -f

Mac 系統格式化

mac 系統原生就有 disk utility 可以做格式化, 在 spotlight 搜尋就可以開啟了

在左側選取要格式化的 usb 或硬碟,在右側再選取想要格式化的檔案格式

如果要格式化成 FAT32 請選擇 MS-DOS (FAT)

檔案格式

如果檔案系統需要同時支援 window, mac 建議格式化為 FAT32

FAT32

  • 支援 windows, mac
  • 單檔最大 4GB
  • 最大容量 2TB
  • 較容易 disk errosr
  • 效率稍差

exFAT

  • 支援 windows, mac, linux
  • 單檔最大 4GB
  • 最大容量 2TB

NTFS (windows only)

  • windows 原生支援
  • 在 mac 上只能讀
  • 最大單檔 16TB
  • 最大容量 256TB

HFS+

  • mac 原生支援
  • Required for Time Machine
  • 最大單檔 8EiB
  • 最大容量 8EiB

Inode

在linux下,一個檔案產生後,會有一個inode,可以用來當作這個檔案的編號。 假設有一個檔案叫做cc.txt,它的inode編號為135, 當我用mv移動到不管哪個資料夾下,它的inode編號依然會是135, 但當使用cp複製它時,它的inode編號就會重新指派了。

查看inode

ls -i
7042739 README.md       6954370 bashrc          2287673 bin

用 inode 找 file / folder

find ~/conf -inum 2287673
/Users/jex/conf/bin