VirtualBox在Ubuntu下無法安裝Guest Additions

剛剛在VirtualBox 4.2.4裝了Ubuntu 12.10,安裝完畢後要安裝Guest Additions卻發生錯誤,按照console的提示把訊息印出來 /var/log/vboxadd-install.log 錯誤大概是這樣的:

Error: unable to find the sources of your current Linux kernel.

Google後發現這篇討論串

然後發現先安裝下列的套件然後再安裝Guest Additions,就可以了!

sudo apt-get install dkms build-essential linux-headers-generic

WordPress在Linux上安裝、更新套件出現錯誤

把Wordpress從Windows搬到Ubuntu Linux上之後,出現了選擇安裝、更新套件的時候出現要求輸入FTP、SSH帳號的訊息「欲執行此動作,WordPress 需要訪問您的網頁伺服器。請輸入 FTP 密碼繼續。」,出現這個表示Wordpress無法寫入實體檔案,所以要求你提供可寫入實體檔案的FTP帳號。

Wordpress無法更新的錯誤畫面

如果wordpress是架在自己可以管理到的Linux主機,請先確認一下wordpress資料夾下的檔案是否都有寫入權限,建議最快的解決方法就是把wordpress下的所有檔案的owner都換成執行apache的使用者,不過這個使用者名稱在各種distro並不一致,在ubuntu下是www-data。

chown -R www-data wordpress

更多訊息可以參考: Why WordPress Asks for Connection Info

[memo] Ubuntu Linux改Timezone的方式

在ec2上開ubuntu大多是UTC,雖然server是在外國,可是習慣上還是改回台灣的時區比較不會誤會。改時區實在無敵簡單的,基本上就是去/usr/share/zoneinfo裡面找到適當的時區,然後在製作軟連結到/etc/localtime就可以了。下面這個,是台灣時區的下法。

ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime

AP遠端連接MySQL Connection暴增最後造成ERROR 1040 (HY000): Too many connections

PHP連接遠端mysql server最終造成ERROR 1040 (HY000): Too many connections

最近遇到一個很詭異的問題,原本的PHP系統要擴增AP Server並把MySQL移到一台獨立的Server上運作,原本認為這個task幾乎是沒有風險的,沒想到一接上線,大量的Client端的請求不僅無法消化,MySQL這邊的Connection數目竟然會很快地暴增,進而讓MySQL不斷吐Too many connections的錯誤的訊息。

Continue reading “AP遠端連接MySQL Connection暴增最後造成ERROR 1040 (HY000): Too many connections”

利用SSH Tunnel連線至內部網路

以往要連線回公司的內部網路,或是連線到某些限制只有公司IP可以使用的服務的時候通常是透過VPN來完成。但VPN有些麻煩的是它會利用VPN遠端的閘道取代原本的閘道,這樣一來原本閘道的路由就會斷線,其實有點麻煩,例如:我連到公司的VPN,但公司的網路會擋MSN Messenger的連線,所以連VPN的過程中MSN就會斷線了。(註:當然可以透過VPN會指定通過遠端閘道的路由規則)

所以如果在要連線的地方有一台開放SSH連線的Server的話,其實可以透過SSH Tunnel達到類似VPN的效果,透過SSH Tunnel可以連到遠端主機可以連到的任何主機,其實SSH Tunnel的運作簡單說就是透過SSH作為通道然後利用遠端主機作為跳板來連線。不過缺點是每個要連線的位置都需要設定,所以如果需要連10種服務就必須設定相對多次,數量一多設定起來其實也相當麻煩!

Continue reading “利用SSH Tunnel連線至內部網路”

[memo] Ubuntu Linux 10.04透過apt-get安裝JDownloader

JDownloader是一套基於Java的下載軟體,除了可以支持跨平台運作外,最大的特點就是可以自動下載像是Megauploader、Rapidshare、ZShare、訊6、Bandongo(這個好像壞掉很久了)、…等等,免費空間的檔案。在Windows上只要裝好JRE然後下載下zip檔就可以直接打開,

這邊介紹一下如何用Ubuntu Linux直接利用apt-get安裝下載JDownloader,透過apt來下載最大的好處是apt會幫忙handle安裝其他相依套件及更新程式的工作,一般直接利用官方下載執行檔安裝無法達到上述個功能,操作起來也比較麻煩。其實透過apt安裝其實只要下下面的三行指令,就可以把JDownloader的下載放到apt的repository裡面,然後更新apt的內容後就可以直接安裝JDownloader。

sudo add-apt-repository ppa:jd-team/jdownloader
sudo apt-get update
sudo apt-get install jdownloader

還是稍微說明一下上面指令的意義,第一行是把jdownloader加入到apt-get的套件庫(repository)中。另外可能會遇到類似下面這種gpg錯誤

gpg: 正在請求金鑰 6A68F637 自 hkp 伺服器 keyserver.ubuntu.com
gpg: 金鑰伺服器逾時
gpg: 從金鑰伺服器接收失敗: 金鑰伺服器錯誤

這是因為在加入repository的時候會去ubuntu的keyserver取得金鑰來驗證。但是取得金鑰的過程卻發生錯誤。這可能是因為取得金鑰是走 11371 port 而防火牆沒有開啟該port的連線的緣故。如果有遇到無法取得金鑰的問題可以測試看看該port是否可以聯通。

第二行指令是命令apt去更新repository的套件清單,這樣才能讀取到剛剛加入的repository。

第三行是讓apt去安裝jdownloader。

下載安裝完畢後,只要在指令列下jdownloader,程式就會開始運行。

簡單memo一下嚕。

[超易] 兩行指令搞定 Linux SSH登入免密碼

用ssh登入通常需要密碼,有些情況下SSH不想要輸入密碼,(例如:想要寫script進行ssh遠端操作,一來ssh連線輸入密碼的地方又必須是interactive的沒辦法在script裡面寫密碼,二來是密碼用明碼紀錄在script實在是不大安全)。本篇用最快速的方式介紹SSH免登入的設定方式,本次要介紹的方式就是在Client端產生一組金鑰,然後把把公開金鑰複製到Server的信任名單中。

關鍵知識

其實關鍵點只有下面這兩點(注意,這兩點所說的檔案是放在兩台不同的主機喔):

  • 要連接ssh的client端必須產生一組主機使用者的金鑰組。金鑰組可以在~/.ssh中找到,檔名是id_rsa(私鑰)、id_rsa.pub(公鑰)。(ps. rsa是加密演算法的名子,也可能利用其他的演算法對金鑰加密,如dsa等)。如果沒有產生金鑰組則必須產生一組,方法詳見Step1。一般來說,公鑰的檔名會像是這樣:

~/.ssh/id_rsa.pub

  • 把公鑰複製到Server端的信任名單中。一般來說會放在下面檔案中:

~/.ssh/authorized_keys

後面的範例是從金鑰產生到匯入信任清單的示範,如果有需要的話可以參考。

Step 1.  在Client端產生金鑰組

使用下面指令就可以產生金鑰,所有設定都用預設的就可以了,不需要特別設置。特別注意的是”Enter passphrase”的地方請直接壓enter,這樣才能不用輸入密碼。

ssh-keygen -t rsa

金鑰組檔案會預設放在~/.ssh/id_rsa是私鑰(private key)、~/.ssh/id_rsa.pub是公鑰(public key)。金鑰組務必保存好權限不要開太大,否則會造成安全性的問題。

2. 將公鑰的內容放置在Server的信任清單中

只要在client端下下面這個指令,這樣金鑰就會輸入進Server的信任清單中了。實在是很簡單吧。

cat ~/.ssh/id_rsa.pub | ssh server-user@server-host “cat >> ~/.ssh/authorized_keys”

另外特別還是要補充一下,因為金鑰如果可供寫入的話十分危險。所以許多人會將 ~/.ssh裡面的id_rsa.pub id_rsa authorized_keys三個檔案設定成唯獨,所以如果不成功的話,可能是server端的user把authorized_keys設定成唯獨。所以可以用下面這個指令先把authorized_keys檔案的讀寫先打開再下Step2的命令:

ssh server-user@server-host “chmod 600 ~/.ssh/authorized_keys”

設定完畢後記得再把權限改回來

ssh server-user@server-host “chmod 400 ~/.ssh/authorized_keys”

在Linux上移除舊檔案(過期的檔案) – 應用find指令

在管理主機的時候常常會遇到主機的應用裡面肥大又過時的log檔案,動輒單個檔案就上看GB等級的log檔日積月累下來恐怕沒有幾台主機可以吃得消。如果每次手動清理除了費時外主機一多也很難管理。其實最好的方式是在系統的排程(如cron)內寫進自動刪除的指令,我這邊所提供的解法是用find指令列出舊的檔案,然後把這些檔案刪除。

1. 用find指令在Linux上列出舊的檔案

find /var/log/apache2 -mtime +30

上面這個指令的意思是在/var/log/apache2底下,-mtime是限定修改時間(單位是24小時),後面接著的數字的表示法如下:

  1. +n:表示比n單位以上的檔案 (例如:+30,代表30天之前)
  2. n:表示比n單位之內的檔案 (例如:-30,代表30天之內)
  3. n:不給給正負號代表正好n單位的檔案。

此外還有time跟min也都是代表修改時間,但是後面接的數字的單位變成分鐘。此外其他相關的指令如下:

  1. -mtime、-mmin:檔案內容(data)最後的修改(modify)時間
  2. -atime、-amin:檔案最後被存取(access)的時間
  3. -ctime、-cmin:檔案狀態(status)最後被修改的時間(change)。 (註:檔案狀態是指:修改擁有者或群組(即調用chown、chgrp)、修改檔案存取權限(即調用chmod)

2. find資料後執行刪除指令

find到檔案後可以用-exec指令來進行相應的處理,下面這個指令示範的是直接下rm指令刪除

find /var/log/apache2 -mtime +30 -exec rm -f {} ;

-exec是表示找到檔案後要執行的指令,現在要執行移除檔案的指令rm,但rm指令會與使用者確認是不是要刪除檔案,因為每個檔案都會問所以挺麻煩的所以加入-f (force) 參數讓rm強制移除檔案。然後 {} 則代表指令接檔案名稱的地方,find會將找到檔案的檔名與路徑帶入到{} 這邊。最後加入; 代表指令結束,不可以省略。

希望這樣介紹可以讓大家更了解find這個指令。

/boot空間不足造成Ubuntu apt-get無法使用的問題

最近發現自己管理的一些Ubuntu Server的apt-get功能竟然無法使用,只要是要安裝新的套件就會出現類似下面這樣的錯誤。

root@serv01:/home/joseph# apt-get install php-mail
Reading package lists… Done
Building dependency tree
Reading state information… Done
You might want to run `apt-get -f install’ to correct these:
The following packages have unmet dependencies:
linux-image-server: Depends: linux-image-2.6.31-21-server but it is not going to be installed
php-mail: Depends: php-pear but it is not going to be installed
Recommends: php-net-smtp but it is not going to be installed
E: Unmet dependencies. Try ‘apt-get -f install’ with no packages (or specify a solution).

但如果是照著提示下 apt-get -f install 的話安裝也不會成功,經過檢查原來是Ubuntu Server在安裝套件時會自動更新Linux Kernel的image。

而我安裝系統的時後總是習慣將/boot切割為磁碟的第一個獨立的分割區,這樣做有一個好處是/boot總是會放在磁碟最裡面的cylinder。而/boot會使用的空間不多,一般而言50MB綽綽有餘。但是apt在更新image的時候並不會把舊的image丟棄,所以造成/boot爆滿的情況。

此時只要將/boot中舊的images搬走釋放出/boot的空間然後在下 apt-get -f install 就會自動更新kernel的image。

釋放與清除 Linux記憶體中的Cache Memory

參考網站
http://www.ubuntu-unleashed.com/2008/04/free-up-cache-memory-in-linux.html
http://www.linuxinsight.com/proc_sys_vm_drop_caches.html
http://blog.linux.org.tw/~jserv/archives/002039.html
http://phorum.study-area.org/index.php?topic=39976.0;wap2

在Linux Kernel 2.6.16後對於Linux的VM(Virtual Memory)進行了調整,因此會在top等指令發現雖然process所使用的記憶體不多,但是透過free來觀察卻發現只剩下一點點的剩餘記憶體。

但是關閉一些程式卻發現total的free memory並沒有被釋放,造成系統剩餘記憶體總是不夠的感覺,而全部processes佔用的記憶體好像也沒有實際上看到的那麼多,這其實是cache占用了memory中的空間。而且但是根據小州老師(kenduest,是我的啟蒙恩師呢~泣~)表示,雖然記憶體剩餘空間看起來沒有被釋放,但是process實際需要使用時kernel仍會自動從memory釋放cache給process使用,所以使用者不必擔心。

↓ 使用top指令看到的剩餘記憶體,與free指令看到的容量是差不多的
linux_top

↓ 在執行一些需要大量cache的程式後會發現剩下的記憶體只剩下一點,而實際上處理程序卻沒有用掉那麼多記憶體
linux_top_cache

↓ 而如果是用htop指令來觀察系統狀況的話會發現memory的bar雖然很長,但是實際上卻只吃掉1GB的記憶體,其實bar的黃色部分是cache佔用的,處理程序要使用時kenel還是會自動將cache釋放給處理程序使用。
linux_htop_cache

要強制手動釋放或清除Linux中的Cache Memory可以使用下面的指令

echo 3 > /proc/sys/vm/drop_caches

3 是指釋放pagecache、dentries與inodes,也就是釋放所有的cache,其他也可以下:

#釋放pagecache
echo 1 > /proc/sys/vm/drop_caches

#釋放dentries與inodes
echo 2 > /proc/sys/vm/drop_caches

↓ 下過指令後,就可以在htop中就可以觀察到黃色部分的cache不見了
linux_htop

打完收工,感謝收看嚕~