Linux Commands

 
一天一Linux command

Linux command 縮寫對照

 


 

♘ ♘ ♘

▨ cd: change directory

cd /home/yourPath

 
▨ cp: copy file
cp <SRC> <DST> -r

 
▨ rsync
#比cp好用, 速度更快
rsync -ravP <SRC> <DST>

 
▨ rm: remove file

rm <TARGET> -rf

 
▨ mv: move file
mv <SRC> <DST>

 
▨ ln: link files

▨ ls: list files

ls -al   #list all files
ls -alh   #list all files(include file size)

 
▨ mkdir: make directory
mkdir <DIR-NAME> 
#加了這個 -p 的選項,可以自行建立多層目錄

 
▨ pwd: print work directory
▨ su: switch user

▨ file

▨ find

#找檔案, i:ignore大小寫
find /home/yourPath -iname "yourFile"

 
▨ grep
#找程式裡的內文, i:ignore大小寫, n:列印行數, r:recursive
grep -inr 'symbol' <FILE>
grep -inr '<symbol1> \| <symbol2> \| <symbol3>'

 
▨ ps
#report process status
ps -elf | grep <SOMETHING>
ps aux | grep <SOMETHING>
# kill `dhclient` process, for example
ps aux | grep dhclient | awk '{print $2}' | xargs -n1 kill -9

Note: Say "NO" to "grep -v grep"

 
▨ Say "NO" to "grep -v grep"
See: http://www.perlmonks.org/bare/index.pl/?node_id=203760

ps -ef | grep -v grep | grep inetd

Please, let us not cargo-cult this crazy "grep -v grep" some more. I cringe each time I see that. It's a poor solution to a common problem.

# The way to avoid picking out the grep process itself is to ask ps for the proper things:
ps axc | grep inetd
# If your ps doesn't have a "command-name only" solution, then simply muddy the argument so that the grep cannot match it:
ps ax | grep '[i]netd'

 
▨ cat: concatenate
cat <FILE>  #print it out
 
cat file1 file2 >> file3 
#把文件1和文件2的内容連接起來放到文件3

 
▨ man: manual
man <DAEMON>

 
▨ poweroff
▨ reboot
▨ shutdown
 
▨ df: disk free
#列出所有 filesystem 整體磁碟使用量
#-h : 以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示
df -h

 
▨ du: disk usage
#列出此目錄底下使用空間
cd <DIR>
du -h | sort -h -r

 
▨ dumpe2fs
#裝置的檔案系統內容
dumpe2fs /dev/sda1 -h

 
▨ mount
mount <SRC-DIR> <DST-DIR>

 
▨ showmount
# -e: 顯示某部主機  所分享的目錄資料
showmount -e <IP>

 
▨ umount
umount -l /path/yourFile/
#Device is busy
fuser -m /media/share
fuser -m -v -i -k /media/share

 
▨ who
who        #show who is logged on
who -b    #time of last system boot

 
▨ ssh: secure shell
ssh rickymax@140.118.192.198
ssh 140.118.192.198 -l rickymax

 
▨ scp: secure copy
scp src root@dst-ip:~

 
▨ rpm: rpm package manager
# 萬用, 不管有沒有安裝過都會直接升級
rpm -Uvh *.rpm
# 查詢已安裝的套件 (a=all, q=query)
 rpm -qa | grep <pkg>

 
▨ ifconfig
#列出目前已經被啟動的卡 (無論有無賦予IP)
#取得網路卡狀態 修改網路卡狀態 工具
ifconfig
ifconfig <NIC> down #移除
ifconfig <NIC> up #更新, 但route順序會跑到最下面
ifconfig <NIC> 0.0.0.0 #清IP

 
▨ ip
# 同上, 清 IP
ip a flush dev <NIC>

 
▨ dhclient
# 跟 dhcp server 要一個對外 IP 給 網卡(要接對外switch)
dhclient <NIC>

 
▨ ethtool
# 想知道哪張 NIC 卡在實體機是哪一個 port
ethtool -p <NIC>
# 不是每張網卡都有support這功能喔~

 
▨ iptables-save
#觀看防火牆規則(詳細)
iptables-save

 
▨ ping
ping <IP>

 
▨ nc
#跟IP供用類似, 確認某IP是否live (port:22 for ssh)
nc -z <IP> <port>

 
▨ tcpdump
#觀察來源目的封包傳遞, 搭配ping使用
tcpdump -i eht0 -e
#-i 後面接想觀察的東東, 略掉其他
#-e 顯示MAC

 
▨ wget
#non-interactive download of files from the Web
wget http://xxx.com/xxx.xxx
# 下載並儲存到指令目錄
wget -P <TARGET-DIR> <HTTP-LINK>
# recursive下載來源目錄,並且不保留父目錄以及index
wget -r --no-parent --no-host-directories --cut-dirs=2 --reject "index.html*" <HTTP-LINK-DIR>

 
▨ history
export HISTTIMEFORMAT='%F %T '
history
#相較於history查看過去打過的指令
#另外一個方法就是 Ctrl+r 去搜尋打過的指令
#找下一個(Ctrl+r), 結束按左或右

 
▨ dd
dd if=/dev/sda of=/dev/sdb #備份至sdb, sdb甚至也不需分割與格式化
dd if=/dev/zero of=./hello bs=1M count=1024 #產生一個1Ghello檔到此目錄下

 
tmux

修改以下config檔可以直接使用

ctrl a + n  = next page
ctrl a + p = previous page
ctrl a + c = new page
---
ctrl a + s = split page
ctrl a + arrow up = upper page
---
ctrl a + [ = copy mode
if you want to quit = esc

  
▨ fuser
fuser -a /PATH
ps -elf | grep ????c
ps -elf | grep ????
kill -9 ???
fusermount -uz /data

 
▨ 版本查詢
uname -a
lsb_release -a

 
▨ UUID查詢
dmidecode -s system-uuid
/sys/class/dmi/id/product_uuid

 
▨ ovs-vsctl
ovs-vsctl show
# for example, delete vswitch3
ovs-vsctl del-br vswitch3
ovs-vsctl add-br vswitch3
ovs-vsctl add-port vswitch3 <NIC>

ovs-vsctl add-port vswitch3 eth3

# 設定 trunk mode
ovs-vsctl set port vnet# vlan_mode=trunk

# 設定開放的vlan id
ovs-vsctl set port vnet# trunks=100
ovs-vsctl set port vnet# trunks=100,200

利用open vSwitch設定trunk port

 
▨ virsh

# Displaying the guests
virsh list

# Shutdown
virsh shutdown <domain>

# Destroy
virsh destroy <domain>

#
virt-manager
virsh dumpxml <domain> >> <TARGET.XML>
virsh define <SOURCE.XML>
virsh start <domain>
virsh edit <domain>
# Editing the attributes of a VM
virsh dumpxml foo > /tmp/foo.xml
--- edit /tmp/foo.xml as needed ---
virsh define /tmp/foo.xml
# List host usb device
lsusb
Bus 001 Device 005: ID 0951:1665 Kingston Technology

# Adding USB devices
# the vendor and product ids are 0951 and 1665 respectively.
<domain type='kvm'>
  <name>SomeGuestVM</name>
  …
  <devices>
    …
    <hostdev mode='subsystem' type='usb'>
      <source>
        <vendor id='0x0951'/>
        <product id='0x1665'/>
      </source>
    </hostdev>
  </devices>
</domain>

 
▨ virsh attach-device
the following decribe is wrong, google more
# Attach device from an XML file
virsh attach-device <USB.XML>
virsh attach-device <USB-HUB.XML>
# something likes that
  <hub type='usb'>
     <address type='usb' bus='0' port='2'/>
  </hub>

 
▨ virsh qemu-monitor-command
virsh qemu-monitor-command <ID> --hmp "info"
virsh qemu-monitor-command <ID> --hmp "info usb"
virsh qemu-monitor-command <ID> --hmp "info mice"
virsh qemu-monitor-command <ID> --hmp "mouse_set 1"
virsh qemu-monitor-command <ID> --hmp "info block"
virsh qemu-monitor-command <ID> --hmp "info qtree"

virsh qemu-monitor-command <ID> --hmp "device_add ?"
virsh qemu-monitor-command <ID> --hmp "device_add usb-hub,id=vUsbHub,port=2"
virsh qemu-monitor-command <ID> --hmp "device_del vUsbHub"

 
▨ qemu
qemu-img --help
qemu-img info <.IMG>

# 查看image是否完整 (重要)
qemu-img check <.IMG>

 
▨ xrandr改變X環境的桌面大小和螢幕頻率
xrandr -s 1024x768

 
▨ 清理cache
 echo 3 > /proc/sys/vm/drop_caches

 
▨ md5sum
md5sum <filename>

 
▨ tail
tail -f <LOG>
# EXAMPLE
sh main.sh >> run.log &
tail -f run.log

 
▨ watch
# 每隔幾秒(5s)調用指令,並顯示輸出
watch -n 5 <COMMAND>

 
▨ ssh-keygen

# remove Host key verification
ssh-keygen -R <IP>

 
▨ losetup
#查看loop device占用情形
losetup -a

#停用loop device
losetup -d /dev/loop0

 
▨ sed
一個管線命令,可對資料進行取代、刪除、新增、擷取特定行等等的功能
function 有底下這些咚咚:
  • a:新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
  • c:取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
  • d:刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;
  • i:插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p:列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
  • s:取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配
# sed 's/要被取代的字串/新的字串/g'
# 取代完之後印出來,不會更動到file-1,你可以利用下面的方式把檔案拷貝過去
sed 's/v1/v2/g' file-1.log
# 取代第幾行就好
sed 3's/v1/v2/g' file-1.log
sed 3,5's/v1/v2/g' file-1.log
# 將file-1的內容刪去2~5行之後,寫入file-2,完成之後執行 ls
sed '2,5d' file-1.log > file-2.log && ls
# -i :危險動作,直接修改檔案內容
# a:在當前位置($表示最後一行),下面插入一行字串@@
sed -i '$ a @@' file-1.log
# i:在當前位置($表示最後一行),上面插入一行字串@@
sed -i '$ i @@' file-1.log
# 檢查每一行,如果為 I am,則在下面插入一行字串 Ricky
sed -i '/I am/ a Ricky' file-1.log
# 將b.out這個檔,message後面所有字(message)刪除, 留下前面的字串
sed 's/message.*//g' b.out
# 將b.out這個檔,將message前面所有字(message)刪除,留下後面的字串
sed 's/^.*message//g' b.out

 
▨ ftp
# 測vsftpd有無正常運作(local端登入ftp)
ftp localhost

 
▨ source
# 利用 source 來執行腳本:在父程序中執行
source foo.sh
or
. foo.sh
 
#可以跟 ./foo.sh 做比較 (在子程序中執行)

 
▨ vconfig
# 假設要將實體網卡 eth0,切成三個虛擬VLAN
# 加 虛擬網卡:vconfig add eth0 101; vconfig add eth0 1501; vconfig add eth0 1502
# 給 IPifconfig eth0.101 172.31.0.250; ifconfig eth0.1501 172.31.1.250; ifconfig eth0.1502 172.31.2.250
要使用 Linux VLAN, 需載入 8021q module
modprobe 8021q

使用 vconfig 可以建立 vlan-devices
vconfig add eth1 100 # 建立 eth1 VLAN 100 vlan-device
vconfig add eth1 200 # 建立 eth1 VLAN 200 vlan-device
ifconfig eth1.100 192.168.100.1 netmask 255.255.255.0 # 設定 eth1 VLAN 100 vlan-device IP
ifconfig eth1.200 192.168.200.1 netmask 255.255.255.0 # 設定 eth1 VLAN 100 vlan-device IP
ifconfig eth1.200:0 192.168.200.2 netmask 255.255.255.0 # 設定 eth1 VLAN 100 vlan-device alias IP

需搭配網管型 Switch, Port 要帶 tag

 
▨ chattr
# 鎖定檔案,禁止更改
chattr +i /etc/hosts

▨ lsattr
# 查看
lsattr /etc/hosts

 
▨ iostat: I/O statistics
# yum install sysstat
iostat
# -k: KB; -m: MB

  

git

http://rickyiii.wikidot.com/git
 

git clone git@140.92.25.168:cake
git branch
git branch -a
git checkout -t origin/starbucks
git fetch
git pull origin starbucks
git clone git@140.92.25.168:cake; cd cake; git checkout -t origin/starbucks; git fetch; git pull origin starbucks
git submodule
git submodule add git@140.92.25.168:cake-gluster

通過 git submodule add 命令將外部專案加為子模組

 
Clone a project with a submodule in it.
When you clone such a project, by default you get the directories that contain submodules, but none of the files within them yet.
You must initialize your local configuration file, and fetch all the data from that project.

git submodule init
git submodule update

 
Pulling in Upstream Changes
git submodule update --remote <MODULE>

 
刪除submodule比較麻煩
# 手動刪除submodule資訊
vim .gitmodules
vim .git/config

# 移除submodule相關資料
git rm --cached <GIT_FOLDER>
rm .git/modules/<MODULE>
rm <GIT_FOLDER>

# sync
git submodule sync

 

vim

tutorial


  • 搜尋
/

在想追蹤的變數上面按下不起眼的星號「 * 」,接著用 n 往下搜尋,N 往上搜尋。

在函式的左大括號按下 「%」 ,馬上就會跳到對應的右大括號了

「gd」找到此變數,區域變數宣告的地方

「gD」找到此變數,全域變數宣告的地方

 

  • 切割視窗
:vsp <FILE>

 
  • 刪除行尾空白
 :%s/\s\+$//g

 
  • 取消搜尋
:noh

 
  • 搜尋特定的字
/\<Word\>

 
  • 搜尋包含空白的字 (用.表示任意字)
/hello.world

 
  • mark label
m
 
熱鍵

 
  • 搜尋射過的熱鍵
"
 
熱鍵

 
  • tube
:tube

// jump another file

 
跳至匹配的括號
%

 
跳到函數的開頭
[[

 

vim+scope

cd <PROJECT>
cscope -bR

 
跳到定義此 global 變數/函數之專案
ctrl + ]

 
返回
ctrl + t

 

.vimrc

nnoremap <silent> <F5> :NERDTree<CR>
nnoremap <silent> <F3> :TlistToggle<CR>
nnoremap <silent> <F4> :wincmd p<CR>
nnoremap <silent> <F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
nnoremap <silent> <F6> :!make<CR>
nnoremap <silent> <F7> :set nonumber<CR>
nnoremap <silent> <F8> :set number<CR>

set nocp
filetype plugin on
set number
set tags+=~/std.tags
au BufNewFile,BufRead *.md set filetype=lisp
au BufNewFile,BufRead *.cu set filetype=cuda
au BufNewFile,BufRead *.def set filetype=cpp
au BufNewFile,BufRead *.cpp set syntax=cpp11

let Tlist_Exit_OnlyWindow = 1

" \t = 4 space
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4

" High light unwanted spaces in end of line
highlight ExtraWhitespace ctermbg=darkred guibg=darkcyan
autocmd BufEnter * if &ft != 'help' | match ExtraWhitespace /\s\+$/ | endif
autocmd BufEnter * if &ft == 'help' | match none /\s\+$/ | endif

" High light over length in a line
au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>79v.\+', -1)

" status bar
set ls=2
set statusline=%<%f\ %m%=\ %h%r\ %-19([%p%%]\ %3l,%02c%03V%)%y
highlight StatusLine ctermfg=blue ctermbg=white

" search word match with highlight
set hlsearch

" :sp list files
set wildmenu

" save last edit position
if has("autocmd")
    autocmd BufRead *.txt set tw=78
    autocmd BufReadPost *
    \ if line("'\"") > 0 && line ("'\"") <= line("$") |
    \   exe "normal g'\"" |
    \ endif
endif

 

Fedora Package

一般常用套件, 自行更改適合的 Liunx distribution command

# guake 好用的 linux terminal
yum install guake

# tmux : console 下分割視窗的好幫手
yum install tmux -y

# GIT 套餐
yum install git-bugzilla.noarch git-review.noarch git-cvs.noarch  git-svn.noarch git-email.noarch git tig -y

# DiffMerge
yum install http://download-us.sourcegear.com/DiffMerge/3.3.2/diffmerge-3.3.2.1139-1.x86_64.rpm -y

# MadEdit
yum install http://jaist.dl.sourceforge.net/project/madedit/MadEdit/MadEdit-0.2.9/madedit-0.2.9-1.x86_64.rpm -y

# 桌面截圖
yum install shutter -y

# rar 
yum install unrar -y

# Google Chrome
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm -y

# RPM Fusion
yum install http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm -y
yum install http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm -y

# GCC, LLVM, glibc-static...
yum install gcc make cmake llvm gcc-c++ glibc-static m4 automake autoconf glibc-devel glibc.i686 glibc-static.i686 distcc imake -y

# audio/video decoder
yum install lame xmms-mp3 -y
yum install gstreamer-plugins-good gstreamer-plugins-fc gstreamer-plugins-espeak gstreamer-plugins-bad-free-extras gstreamer-plugins-bad-nonfree gstreamer-plugins-bad-free gstreamer-plugins-bad gstreamer-ffmpeg ffmpeg ffmpeg-libs  gstreamer-plugins-ugly  -y

# MP3 Tag tool
yum install python-mutagen ctags -y

# VIM
yum install vim-nerdtree.noarch vim-vimoutliner.noarch vim-perl-support.noarch vim-filesystem fluxbox-vim-syntax.noarch -y

# Libreoffice
yum install libreoffice-writer libreoffice-langpack-zh-Hant libreoffice-calc libreoffice-draw libreoffice-impress -y
# RDP Client and vnc client
yum install gnome-rdp vinagre -y

Ubuntu 修改 root 密碼

因為Ubuntu剛灌完root密碼是空白的

但是輸入空白不能登入

所以可以改root密碼

sudo passwd root

Ubuntu 防火牆

see: http://www.arthurtoday.com/2013/12/ubuntu-ufw-add-firewall-rules.html#ixzz3Q6ciDwTg


#開:預設是會關閉所有的連入要求
ufw enable
 
#關:同時停止在開機後自動載入
ufw disable
ufw status
ufw status verbose
#允許和關閉連入
#下面的第一行指令會讓所有的連入要求都通過,等於防火牆對別台電腦的連接要求都接受的意思
#而第二行指令則是不允許任何的連入要求,至於要用那一種,
#就要看你是先全部都打開再各別設定要封鎖的服務還是全部都先關閉,然後,再依需要來個別開通囉 !
sudo ufw default allow
sudo ufw default deny

新增硬碟或分割槽

see: http://www.gtwang.org/2012/02/linux.html


-列出硬碟的 partition table

fdisk -l

 
-分割 sda 磁碟
fdisk /dev/sdb     // 不可加編號, sdc or sdd  or ...
#進入互動模式, m for help
1. 新增分割區,輸入 nEnter2. 輸入 pEnter(如果新硬碟只需要一個分割區)
3. 選擇 Partition numberprimary 分割區最多可以有四個,輸入 1Enter4. 輸入開始的 cylinder,用預設值就可以了,直接按 Enter5. 輸入結束的 cylinder,若是要用最大的容量,就直接按 Enter6. 最後將分割表寫入硬碟,輸入 w 再按 Enter

 
-Format the partition
mkfs -t ext4 /dev/sdb1

 
-Format the partition by xfs (optional)
apt-get install xfsprogs
mkfs.xfs -i size=512 /dev/sdb1

 
-Mount the partition (as a Gluster "brick")
mkdir -p /export/sdb1
mount /dev/sdb1 /export/sdb1
mkdir -p /export/sdb1/brick

 
-Add an entry to /etc/fstab
echo "/dev/sdb1 /export/sdb1 xfs defaults 0 0"  >> /etc/fstab

 

磁碟檢驗

# fsck -t <fstype> <device>
fsck -C -f -t ext3 /dev/hdc6

 

建立軟體 RAID

-Prerequisites

yum install mdadm

 
-Identifying available data disks
fdisk -l

 
-creating the RAID 0
mdadm -Cv /dev/md0 -l0 -c128 -n2 /dev/sd{b,c}

-C  建立
-v  查看過程
-c128  chunk size
-n2   # of component devices

 
-Checking

cat /proc/mdstat

 
-Partitioning the RAID 0
fdisk /dev/md0

 
-Checking
fdisk -l

 
-Creating the file system on the RAID 0
mkfs -t ext4 /dev/md0p1

 
-Mount this RAID
mkdir /mnt/md0p1
mount /dev/md0p1 /mnt/md0p1

 

 
-RAID detail info

mdadm --detail /dev/md0p1

 
-Update config file
mdadm --detail --scan >> /etc/mdadm.conf

 
-Removing a RAID device
mdadm --stop /dev/md0
mdadm --remove /dev/md0
mdadm --zero-superblock /dev/sd{b,c}

 

CentOS

用 yum provides 來查 ifconfig 是哪個套件中的東東:

yum provides ifconfig

 
解決CentOS 7無法安裝guest additions
sudo yum install epel-release
sudo yum install dkms
sudo yum groupinstall "Development Tools"
sudo yum install kernel-devel
#Restart Guest Machine
#cd to Guest Additions CD image
sudo ./VBoxLinuxAdditions.run

 
更改hostname
hostnamectl
hostnamectl set-hostname <NEW-HOSTNAME>

 

LVM

  • Physical Vloume(PV)
    • 在 AIX 原有的定義將實體的硬碟稱為 PV,在Linux 上各位可想成原先的一個 partition 就是一個 PV。
  • Volume Group(VG)
    • 就是一堆 PV 的組合,也就是說一個 VG 可能包含一個 PV 或數個 PV。
  • Logical Vloume(LV)
    • 在 LVM 的機制下一個檔案系統 (假設是 /home filesytem) 實際對應的不是 hda#,而是一個 LV。

 
設計一個實驗:http://maxubuntu.blogspot.tw/2010/05/lvm2.html
LVM最強大的功能之一,就是允許線上擴大容量。由於lv是底層,檔案系統在上層,因此要擴大檔案系統必須lv先擴大,filesystem再擴大。

lvresize -l +100 /dev/mapper/vg_livecd-var
resize2fs /dev/mapper/vg_livecd-var

 
要縮減lv大小則與擴充相反—必須先縮小上層的filesystem,再縮小底層的lv。如果你不照此順序進行,lv上面的資料會全部付之一炬。縮減lv不支援線上進行,而且縮減到有寫入資料的部份也會造成檔案lost,必須小心為之:
unmount /var
fsck.ext4 -f /dev/mapper/vg_livecd-var
resize2fs /dev/mapper/vg_livecd-var 500M
lvresize -l -25 /dev/mapper/vg_livecd-var
mount /dev/mapper/vg_livecd-var /var

 

Linux bash

$ (關於本 shell 的 PID)

錢字號本身也是個變數喔!這個咚咚代表的是『目前這個 Shell 的執行緒代號』,亦即是所謂的 PID (Process ID)。
想要知道我們的 shell 的 PID ,就可以用:『 echo $$ 』即可!出現的數字就是你的 PID 號碼。

 
? (關於上個執行指令的回傳值)

上面這句話的重點是『上一個指令』與『回傳值』兩個地方。
當我們執行某些指令時, 這些指令都會回傳一個執行後的代碼。
一般來說,如果成功的執行該指令, 則會回傳一個 0 值,
如果執行過程發生錯誤,就會回傳『錯誤代碼』才對!一般就是以非為 0 的數值來取代。
[root@www ~]# echo $SHELL
/bin/bash                                  <==可順利顯示!沒有錯誤!
[root@www ~]# echo $?
0                                          <==因為沒問題,所以回傳值為 0
[root@www ~]# 12name=VBird
-bash: 12name=VBird: command not found     <==發生錯誤了!bash回報有問題
[root@www ~]# echo $?
127                                        <==因為有問題,回傳錯誤代碼(非為0)
# 錯誤代碼回傳值依據軟體而有不同,我們可以利用這個代碼來搜尋錯誤的原因喔!
[root@www ~]# echo $?
0
# 咦!怎麼又變成正確了?這是因為 "?" 只與『上一個執行指令』有關,
# 所以,我們上一個指令是執行『 echo $? 』,當然沒有錯誤,所以是 0 沒錯!

 
常用參數
http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#test
 
-f 該『檔名』是否存在且為檔案(file)?
-d 該『檔名』是否存在且為目錄(directory)?
-eq 兩數值相等 (equal)

 
範例:

prog=orbited
pidfile=/var/run/$prog/$prog.pid
RETVAL=0
...

if [ -f $pidfile ]; then
...

if [ ! -d /var/run/$prog ]; then
...

if [ $RETVAL -eq 0 ]; then
...

 

2>&1

詳見:Unix 重新導向跟 2>&1
 


 

...... >/dev/null

將「>」左邊執行的結果, 重新導向給右邊 /dev/null

系統將標準輸入輸出分成三個:標準輸入 (stdin)標準輸出 (stdout)、以及標準錯誤輸出 (stderr)

他們的 fd (file descriptor, 檔案描述子) 分別是 0、1、2。

當「>」左邊未指定任何東西時,它會讀取左方程式的標準輸出 (fd=1) 重新導向給右邊的東西,也就是「1>」
 
至於神秘的 2>&1,請參考 詳見
 

2>&1 就是將 stderr 併進 stdout 作輸出

 

# 下面三行再做一樣的事
ls my.file no.such.file > file.both 2>&1

ls my.file no.such.file 2>&1 > file.both

ls my.file no.such.file 2> file.both >&2 

# if you dont wanna any output
* > /dev/null 2>&1

 

KVM – Network

詳見: http://benjr.tw/8189
 


 
Virtual network – virbr0
(1) QEMU 會在你的 Linux 產生一個 bridge 虛擬裝置 "virbr0" .virbr0 不只是個單純的 NAT 而已,他是一個 NAT + DHCP 的架構,所有的 Virtual machine 都會透過 virbr0 來指派一個私人網域 (private IP).預設為 192.168.122.2 ~ 192.168.122.254 (在他的設定檔中可以定義其 DHCP 可指定的 IP 範圍).
(2) 其預設的 default gateway 為 192.168.122.1/24 ,所有在這架構下的 Virtual Machine 虛擬機器的封包都必須透過這 NAT 去連結到其他的網路.
(3) 如同一般的 NAT 所有的 Virtual Machine 虛擬機器都是被隱藏在 private 私人網域,所以外部不能直接連接到 Virtual Machine 虛擬機器上.
 
Shared physical device
 

virsh

virsh是一套用於虛擬化管理的工具,本身是由libvirt實作而來。

關於libvirt的介紹可參考官網 http://libvirt.org/,簡言之就是一種跨平台(支援XEN, KVM等虛擬化系統)的虛擬化管理API。

virsh可用來開啟、暫停與關閉domain0上的guest domains(所謂的guest domains就是guest virtual machine)。

以下介紹一些virsh的基本指令:

列出關於dom0的相關資訊:
virsh nodeinfo

列出domain0上的virtual machines:
virsh list

查看特定virtual machine的資訊:
virsh dominfo <VM ID>

定義virtual machine的domain(目的是將定義VM資訊的XML拷貝到hypervisor中):
virsh define <XML file>

啟動virtual machine的domain:
virsh start <VM Name>

關閉virtual machine的domain:
virsh destroy <VM Name>

解除定義virtual machine的domain:
virsh undefine <VM Name>

P.S.
<VM ID> 代表在dom0上跑起來後由系統直接給定的辨識碼。
<VM Name> 代表使用者在XML file裡面定義的VM名稱。
—-
建好 iso 並且 deploy VM 之後,要如何知道這個 VM 的 port ?

ps aux >> log
vim log
# 搜尋 你的 VM 名稱
# 找到 0.0.0.0:x
# 用 vnc 開
# 140.92.25.114:590x
# [options] -> [Misc] -> turn on `Shared connection`

 

monitorix 監控流量

wget xxxx/monitorix.rpm

wget http://dl.fedoraproject.org/pub/epel/6/i386/perl-HTTP-Server-Simple-0.42-1.el6.noarch.rpm

rpm -Uvh perl-HTTP-Server-Simple-0.42-1.el6.noarch.rpm

yum install perl perl-libwww-perl perl-HTTP-Server-Simple perl-IO-Socket-SSL perl-MIME-Lite perl-CGI perl-DBI perl-XML-Simple perl-MailTools perl-Config-General rrdtool rrdtool-perl

vim /etc/monitorix/monitorix.conf

 

Where the system is constrained?

Generally, you will discover that throughput is either limited by the network or the storage layer.
To identify where the system is constrained, run sar and iostat in separate terminals for each GlusterFS node, as illustrated below:

sar -n DEV 2 | egrep "(IFACE|eth0|eth1|bond0)"
iostat -N -t -x 2 | egrep "(Device|<BRICK>)"

 

umount loop device

umount /var/tmp/imgcreate*/install_root/var/cache/yum /var/tmp/imgcreate*/install_root/dev/shm /var/tmp/imgcreate*/install_root/sys /var/tmp/imgcreate*/install_root/dev/pts /var/tmp/imgcreate*/install_root/dev /var/tmp/imgcreate*/install_root/proc

umount /var/tmp/imgcreate*/install_root/

rm -rf /var/tmp/imgcreate-*

 

ResizeError

發生在 build CAKE.iso

make a new squashfs.img
Traceback (most recent call last):
  File "/home/BAKE_CAKE/create_image_minimizer.py", line 15, in <module>
    main(sys.argv[1], sys.argv[2], 'gzip')
  File "/home/BAKE_CAKE/create_image_minimizer.py", line 10, in main
    fs.create_image_minimizer(*args , **kwargs)
  File "/usr/lib/python2.7/site-packages/imgcreate/fs.py", line 648, in create_image_minimizer
    resize2fs(snapshot.path, minimal = True, tmpdir = tmpdir)
  File "/usr/lib/python2.7/site-packages/imgcreate/fs.py", line 104, in resize2fs
    raise ResizeError("resize2fs returned an error (%d)!" % (ret,))
imgcreate.errors.ResizeError: resize2fs returned an error (1)!
Parallel mksquashfs: Using 8 processors
Creating 4.0 filesystem on squashfs.img, block size 131072.

vim /usr/lib/python2.6/site-packages/imgcreate/fs.py
  SparseLoopbackDisk(os.path.join(os.path.dirname(path), "osmin", 256L * 1024L * 1024L)
Note: 不夠再往上調

 
發生在 build CAKE-base.iso

Error creating Live CD : fsck after resize returned an error (8)!

增加 part / 的 size 可能可以解決

 

NFS

https://www.twbsd.org/cht/book/ch21.htm
NFS 發展已久,它和一般檔案分享協定最大的差別在於 NFS 的主要程式是內建在系統核心中,

而非像 Samba、FTP 等主要的程式是安裝在另一套軟體上。不過這不代表 NFS 不需要任何軟體就可以運行,

在 FreeBSD 中,它還是需要下列幾支程式的幫忙:

  • nfsd:用來提供客戶端 NFS 服務。
  • mountd:用來告訴 nfsd 要分享的資料夾有哪些。nfsd 會將收到的 NFS 要求交由這支程式來執行。
  • rpcbind:用來告訴 NFS 客戶端伺服器所使用的連接埠為何。

 

Trouble shooting

/lib64/libblkid.so.1: no version information available (required by fsck)

unlink libblkid.so.1.1.0
unlink libuuid.so.1.3.0

若是不小心弄爆造成系統無法mount (read-only)
拿一片liveCD光碟, 進到系統裡面 將檔案恢復
或是硬碟拆下來, 用別台OS掛載起來, 將檔案恢復
 

easy_install

目前許多作業系統都已配置好相關的 Python 程式語言執行環境,
同時也內建了 esay_install。

若發現系統中沒有 easy_install,可以自己去抓一下,名稱通常為 setuptools
 

pip

before you use pip

wget <SOME-WHERE>/pip-6.1.1.tar
tar pip-6.1.1.tar
cd pip-6.1.1
/usr/bin/python setup.py install

 
install python package from web
pip install <PACKAGE>
pip install <PACKAGE>==<VERSION>

 
install python package from local
pip install <PACKAGE> --no-index --find-link=<PATH>

 
 
pip list installed
pip freeze

 

安裝VirtualBox

參考:http://tecadmin.net/install-oracle-virtualbox-on-centos-redhat-and-fedora/
 
安裝VM VirtualBox Extension Pack
https://www.virtualbox.org/wiki/Downloads

要擁有 4.x/5.x 版的所有功能,你亦需要 VirtualBox Extension Pack,它支援 USB 2.0/3.0 裝置、RDP 及利用 Intel 網絡卡以PXE 開機。

 
 
以CAKE 3.0為範例安裝:
Step 1 – Add Required Yum Repositories

vim /etc/yum.repos.d/virtualbox.repo
[virtualbox]
name=Oracle Linux / RHEL / CentOS-$releasever / $basearch - VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled=1
gpgcheck=1
gpgkey=http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
rpm -Uvh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

 
Step 2 – Install Required Packages
wget http://140.92.24.6/mirror/CentOS/7.1.1503/os/x86_64/Packages/kernel-devel-3.10.0-229.el7.x86_64.rpm
rpm -Uvh kernel-devel-3.10.0-229.1.2.el7.x86_64.rpm

 
Step 3 – Setup Environment Variable
export KERN_DIR=/usr/src/kernels/3.10.0-229.el7.x86_64

 
Step 4 – Install Oracle VirtualBox and Setup
yum install VirtualBox-5.0
/usr/lib/virtualbox/vboxdrv.sh setup

 
Step 5 - Install VirtualBox Extension Pack (optional)
wget http://download.virtualbox.org/virtualbox/5.0.12/Oracle_VM_VirtualBox_Extension_Pack-5.0.12-104815.vbox-extpack
VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.0.12-104815.vbox-extpack

 

CentOS-6 "Minimal Desktop" installation GNOME

1. yum groupinstall "Desktop" "Desktop Platform" "X Window System" "Fonts"
2. vi /etc/inittab

將 id:3:initdefault: 修改為 id:5:initdefault:

3. reboot
 

CentOS-7 "Minimal Desktop" installation GNOME

1. Install CentOS-7 - Minimal (First entry point in list)
2. yum groupinstall "X Window System"
3. yum install gnome-classic-session gnome-terminal nautilus-open-terminal control-center liberation-mono-fonts
4. unlink /etc/systemd/system/default.target
5. ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
6. reboot
 

?

ln -sv /mnt/cake/CAKE架構圖/ ./cake\ system\ diagram
  • 在當前目錄建立一個資料夾叫cake system diagram 指到/mnt/cake/CAKE架構圖
  • 以後你們會用到的啾咪
除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-ShareAlike 3.0 License