2012年10月31日 星期三

(2) Redhat Linux Network Setting

大部分的Linux distributions都會設計兩種設定網路方式:Network Manager的動態設定以及手動設定。Network Manager在Redhat系列的作業系統是預設,如果使用者只是為了設定最基本的網路設定,那麼使用圖形界面的Network Manager就可以了,laptops的環境因為位置可能經常變動,使用Network Manager是最方便的方法。然而進階的網路設定反而撰寫設定檔更為一目了然,本文的目的便是簡單紀錄TCP/IP網路設定。

了解Linux network devices的命名方式

使用ip指令來觀察我們的網路裝置:
[maxsolar@RHEL58 ~]$ ip a
1: lo:  mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 52:54:00:56:15:f3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.12/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::5054:ff:fe56:15f3/64 scope link 
       valid_lft forever preferred_lft forever
3: sit0:  mtu 1480 qdisc noop 
    link/sit 0.0.0.0 brd 0.0.0.0
可能看到的裝置會有:
  • lo
  • 一個loopback device。這個裝置永遠存在,即使系統沒有安裝任何的NIC。他是一個虛擬裝置,可供其他應用程式再沒有實體裝置時仍能運作。例如沒有NIC的時候,loopback裝置會自動拿127的網段當作本機位置。同樣的道理在檔案系統也是如此;掛載一個image到某個目錄下使用,這個image本身只是檔案系統裡的一個檔案,並不是實體裝置;利用loopback來他模擬成一個裝置並加以使用,就是loopback device的功能。
  • eth0
  • 一個ethernet device,精確來說只是一個interface,由0起算;因此一個4ports的網卡會有eth{0,3}這幾個裝置。
  • sit0
  • 一個將ipv4封包封裝成ipv6的裝置,通常使用於ipv4/ipv6混合的網路環境。
  • wlan0
  • 無線網路的裝置。
  • tr0
  • 一個IBM的token ring環境的device。
  • fddi0
  • 一個Fibre distributed data interface裝置,常用光纖骨幹的玩家一定不陌生。
  • ppp0
  • 一個Point-to-Point的連線裝置,例如家裡撥接上網或是使用vpn時會使用。
以eth0的訊息而言,link/ether顯示的是layer2(data-link layer)的資訊,也就是MAC address;inet/inet6分別表示ipv4/ipv6的位置。

Redhat重要的網路設定檔

  • /etc/sysconfig/network-scripts/ifcfg-ethX
  • 標準的ethernet設定檔。
  • /etc/sysconfig/network-scripts/route-ethX
  • ethX的routing table。
  • /etc/resolv.conf
  • 所有unix-like系統的DNS設定--沒有他雖然可以連上internet但就沒有名稱解析可用了。
  • /etc/sysconfig/network
  • Redhat Linux的global網路設定檔。
  • /etc/sysconfig/networking/
  • 放置Network Manager的設定檔的目錄。

DHCP v.s static IP

  • /etc/sysconfig/network-scripts/ifcfg-ethX
  • 一個設定dhcp最精簡的eth0範例如下:
    DEVICE="eth0"
    BOOTPROTO="dhcp"
    HWADDR="52:54:00:92:34:4C"
    ONBOOT="yes"
    
    設定檔有幾個潛規則:1.變數(左側)一定要大寫,設定值(右側)以小寫為主。2.沒有先後順序的關係。

    其實MAC address的欄位也是可以省略不寫的。如果要使Network Manager忽略偵測並自動設定這個裝置,則應該要多加入NM_CONTROLLED=no這個欄位。
    一個設定固定ip且不使用Network Manager的設定檔如下:
    DEVICE="eth0"
    BOOTPROTO="none"
    IPADDR=192.168.1.13
    NETMASK=255.255.255.0
    GATEWAY=192.168.1.254
    HWADDR="52:54:00:92:34:4C"
    NM_CONTROLLED="no"
    ONBOOT="yes"
    TYPE="Ethernet"
    ETHTOOL_OPTS="autoneg off speed 1000 duplex full"
    UUID="859633bb-0019-4fbb-8ab1-74b9ac90b33c"
    
    設定static ip時,BOOTPROTO設定為none或是static是相同的效果。ONBOOT則宣告開機時期是否要自動啟用這個裝置。HWADDR則可使用MAC address作為該裝置的唯一辨識,多張網卡或是多阜網卡的時候要固定住裝置代號非常好用。
    ETHTOOL_OPTS則能直接設定ethtool的參數,本例則是停用自動速度協商,並設定速度為1000Mbp/s全雙工。
  • /etc/sysconfig/network
  • 這個檔案內容大概像:
    NETWORKING=yes     #啟用ipv4
    NETWORKING_IPV6=yes     #啟用ipv6
    HOSTNAME=RHEL58     #主機名稱定義
    GATEWAY=192.168.1.254   #default gateway
    
  • /etc/sysconfig/network-scripts/route-eth0
  • 這個檔案提供了eth0的靜態路由。舉例來說,要通往172.16.100.0/255.255.0.0這個網段要透過192.168.1.1這個窗口;通往192.168.10.0/24這個網段要透過192.168.10.1這個窗口,則應該表示為:
    ADDRESS0=172.16.100.0
    NETMASK0=255.255.0.0
    GATEWAY0=192.168.1.1
    ADDRESS1=192.168.10.0
    NETMASK1=255.255.255.0
    GATEWAY1=192.168.1.10
    

重新啟動網路服務使設定生效

如果使用Network Manager,很抱歉剛剛所修改的設定都不會成功。因此我們先查看系統使用的是Network Manager或是傳統的network服務:
[maxsolar@RHEL58 sysconfig]$ service NetworkManager status
NetworkManager is stopped
[maxsolar@RHEL58 sysconfig]$ service network status
Configured devices:
lo eth0 sit0
Currently active devices:
lo eth0 sit0
結果可知我目前的網路是交由network服務來管理,因此可以藉由重新啟動network服務:
service network restart
或是用ifdown eth0再ifup eth0來使設定生效:
ifdown eth0 && ifup eth0
如果發現系統使用Network Manager來管理,我的建議使將之停用:
service NetworkManager stop
chkconfig NetworkManager off
chkconfig network on
service network restart
由於我們是使用手動方式設定ip,因此別忘了名稱解析也是很重要的!假設我們的DNS server是192.168.1.254,那麼在自家的/etc/resolv.conf應該要有紅色這行:
search wistron.com
nameserver 192.168.1.254
nameserver 168.95.192.1
nameserver最多定義兩行,再多的設定也只會讀前兩行而已。

IP Aliasing

IP aliasing是把多個IP關聯到同一張網卡的一種技術。一般的使用狀態下,一張網卡只需要一組IP位置,但是有許多時候我們為了安全性/管理方便,會希望一張網卡能有一個以上的IP,因此會使用IP aliasing。
假設主機原本的IP為192.168.1.124/24,想要再額外指定一個IP為192.168.1.125/24,只複製/etc/sysconfig/network-scripts/ifcfg-eth0為ifcfg-eth0:1並修改ifcfg-eth0:1為自己要alias的IP即可。
原本的ifcfg-eth0大致如下:
DEVICE="eth0"
BOOTPROTO=static
NM_CONTROLLED="no"
ONBOOT="yes"
IPADDR=192.168.1.124
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
修改過的ifcfg-eth0:1如下
DEVICE="eth0:1"
BOOTPROTO=static
NM_CONTROLLED="no"
ONBOOT="yes"
IPADDR=192.168.1.125
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
除了IP位置以及裝置名稱有變動之外,其餘均保持不變。儲存後,重新啟動你的網路:
service network restart
其中的NM_CONTROLLED變數即是決定是否交由NetworkManager來控制,由於我們已經關閉NM,這個項目僅明確表示不使用NM。Fedora使用者需注意:較新版本的Fedora一旦開啟NM,所有設定都不會寫進設定檔裡,即使寫了設定檔也是無效的,因此強烈建議啟用ip aliasing之前先關閉NM。如果想要新增更多個IP是可行的,只要複製ifcfg-eth0為範本並以:附加數字即可。
有幾點需要特別提醒:
1.eth0:1可以跟eth0必須在相同網段,但是在有VLAN時例外。
2.eth0:1無法使用dhcp。
3.如果想要使用一段網路範圍作為alias裝置,則需要手動新增一個檔案/etc/sysconfig/network-scripts/ifcfg-eth0-range0,然後內容如下:
DEVICE=eth0
IPADDR_START=192.168.1.11
IPADDR_END=192.168.1.50
NETMASK=255.255.255.0
CLONENUM_START=11
如此一來network服務便會幫我們產生從11~50的alias裝置,然後裝置代號從eth0:11開始起跳。

Share

(1) Debian/GNU Network Setting

(1) Debian/GNU Network Setting

大部分的Linux distributions都會設計兩種設定網路方式:Network Manager的動態設定以及傳統的Network設定。就Debian的設定而言,如果安裝了X window則預設會是以Network Manager來管理網路設定。本文專注在使用手動設定TCP/IP網路設定。

了解Linux network devices的命名方式

使用ip指令來觀察我們的網路裝置:
maxsolar@Debian6:~$ ip a
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
    link/ether f4:6d:04:7b:be:13 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::f66d:4ff:fe7b:be13/64 scope link 
       valid_lft forever preferred_lft forever
可能看到的裝置會有:
  • lo
  • 一個loopback device。這個裝置永遠存在,即使系統沒有安裝任何的NIC。他是一個虛擬裝置,可供其他應用程式再沒有實體裝置時仍能運作。例如沒有NIC的時候,loopback裝置會自動拿127的網段當作本機位置。同樣的道理在檔案系統也是如此;掛載一個image到某個目錄下使用,這個image本身只是檔案系統裡的一個檔案,並不是實體裝置;利用loopback來他模擬成一個裝置並加以使用,就是loopback device的功能。
  • eth0
  • 一個ethernet device,精確來說只是一個interface,由0起算;因此一個4ports的網卡會有eth{0,3}這幾個裝置。
  • sit0
  • 一個將ipv4封包封裝成ipv6的裝置,通常使用於ipv4/ipv6混合的網路環境。
  • wlan0
  • 無線網路的裝置。
  • tr0
  • 一個IBM的token ring環境的device。
  • fddi0
  • 一個Fibre distributed data interface裝置,常用光纖骨幹的玩家一定不陌生。
  • ppp0
  • 一個Point-to-Point的連線裝置,例如家裡撥接上網或是使用vpn時會使用。
以eth0的訊息而言,link/ether顯示的是layer2(data-link layer)的資訊,也就是MAC address;inet/inet6分別表示ipv4/ipv6的位置。

Debian重要的網路設定檔

  • /etc/network/interfaces
  • 標準的ethernet設定檔。
  • /etc/resolv.conf
  • 所有unix-like系統的DNS設定--沒有他雖然可以連上internet但就沒有名稱解析可用了。
  • /etc/hostname
  • 儲存local主機名稱的檔案。

DHCP v.s static IP

  • /etc/network/interfaces
  • 一個設定dhcp最精簡的eth0範例如下:
    auto lo
    iface lo inet loopback
               
    auto eth0
    iface eth0 inet dhcp
    夠簡單吧!
    設定檔有幾個潛規則:1.變數(左側)與設定值(右側)必須是小寫。2.沒有先後順序的關係。

    一個設定固定ip最精簡的設定檔如下:
    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet static
     address 192.168.1.5
     netmask 255.255.255.0
     gateway 192.168.1.254
    Debian不允許CIDR表示法,必須使用netmask表示遮罩。更複雜一點的範例如下:
    auto eth0
    iface eth0 inet static
    allow-hotplug eth0
     address 192.168.1.5
     netmask 255.255.255.0
     gateway 192.168.1.254
     network 192.168.1.0
     broadcast 192.168.1.255
     dns-search hello.org
     dns-nameservers 192.168.1.254 168.95.192.1
     up sleep 3; ethtool -s eth0 autoneg off speed 1000 duplex full
    Debian允許各個不同的應用程式使用不同的nameserver。假設情況單純,通常一個nameserver設定檔就夠了(/etc/resolv.conf),但是假設不同介面需要使用不同的名稱解析,單靠修改/etc/resolv.conf則會相當辛苦;因此有了resolvconf這隻程式--不再單純依靠/etc/resolv.conf,可以讓不同介面使用不同的名稱解析,也就是dns-nameserver這個參數。
    在interfaces裡直接寫入command名稱是很直覺的一件事情,這裡設定啟動之後等待3秒後在啟用ethtool,當然也支援mii-tool,但是需注意有些driver並不支援ethtool或是mii-tool,建議在設定之前先直接在終端機上試試看,再寫入到設定檔裡。

重新啟動網路服務使設定生效

Debian如果有安裝X的話,預設是啟動network-manager的。請把他關閉讓我們後續的實驗繼續進行:
aptitude install chkconfig
chkconfig network-manager off
chkconfig networking on
service network-manager stop
invoke-rc.d networking restart
重新啟動網路後可以發現/etc/resolv.conf應該要有紅色這幾行:
search wistron.com
nameserver 192.168.1.254
nameserver 168.95.192.1
nameserver最多定義兩行,再多的設定也只會讀前兩行而已。
請注意這個檔案你不需要手動設定,會自動透過networking或是network-manager設定。 /etc/hostname則是儲存主機名稱的地方,需注意這個檔案與/etc/hosts的意義是不同的。

IP Aliasing

IP aliasing是把多個IP關聯到同一張網卡的一種技術。一般的使用狀態下,一張網卡只需要一組IP位置,但是有許多時候我們為了安全性/管理方便,會希望一張網卡能有一個以上的IP,因此會使用IP aliasing。
Debian/Ubuntu系列的好處就是設定檔只有一個,一目了然。
停止了惱人的network-manager之後,修改/etc/network/interfaces:
# The loopback network interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
 address 192.168.150.124
 netmask 255.255.255.0
 gateway 192.168.150.254

auto eth0:1
iface eth0:1 inet static
 address 192.168.150.125
 netmask 255.255.255.0
紅色字體是額外新增的部份。儲存後,重新啟動你的網路:
/etc/init.d/networking restart
想要新增更多個IP是可行的,只要繼續往下附加上新的位置即可。甚至主要IP以dhcp取得也行:
# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto eth0:1
iface eth0:1 inet static
 address 192.168.150.125
 netmask 255.255.255.0
有幾點需要特別提醒:
  • eth0:1可以跟eth0必須在相同網段。
  • eth0:1無法使用dhcp。

Share

2012年9月7日 星期五

Debian Gnome3桌面筆記

多年以前寫的圖解Debian桌面安裝筆記,如今看來這些資訊過時的速度令人咋舌。Gnome3的桌面我曾經抗拒了好一段時間,畢竟好不容易熟悉的環境以及設定檔,甚至是legacy grub都變成了grub2,原本最喜歡的輸入法框架oxim也已經完全無法在Gnome3安裝使用了。看來唯一的方法就是面對他...或是龜縮在stable的Debian或是Ubuntu 10.04的美好時代。
可能是我已經過了追求美麗桌面的年紀,這篇筆記文純粹作為自己筆記用,可能甚至不具任何參考價值;如果各位覺得有用就笑納,覺得廢文一篇也不妨嘲諷幾句~

Install Debian Wheezy

現在的Debian安裝過程已經比從前那個年代要容易多了。在我寫這篇文章的時候,wheezy還是testing;但我相信未來的stable版本也會納入gnome3,所以請至少安裝wheezy以上的Debian。sources.list如下:

如果您是使用AMD64的CPU,請多下一行指令:
dpkg --add-architecture i386 && apt-get update

Install NVIDIA driver

Debian預設會使用nouveau當作driver;然而他是逆向工程的傑作,並不是人人都有同樣每好的經驗。因此對於NVIDIA的使用者而言,安裝nvidia driver通常是必要的步驟。事實上安裝nvidia driver在Debian裡實在是非常友善。請確定你有啟用contrib與non-free,並且已安裝kernel headers套件:
aptitude install linux-headers-`uname -r`
如果可以安裝kernel headers,那麼透過網路安裝nvidia driver就非常方便。接著我們把步驟簡化如下:
aptitude install module-assistant nvidia-kernel-common -y
m-a auto-install nvidia-kernel-source
aptitude install nvidia-glx nvidia-xconfig -y
安裝過程中會提示nouveau與nvidia modules相衝突,解決的方法就是重新啟動系統。我確定nouveau確實有被加入modprobe的黑名單裡,不過重開機之後console裡仍然會出現許多nouveau與nvidia相衝突的訊息,一時想到的方法只有到grub裡去修改。在/etc/grub.d/10_linux裡大約114-116行之間是定義kernel參數的部份:
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
請在最後面多加個nouveau.blacklist=1,然後把設定寫入到grub裡:
update-grub
重新開機之後,就有完美的nvidia支援了!關於NVIDIA與Debian的相關資料,請參閱NvidiaGraphicsDrivers。

Install ATI driver

Debian預設會使用radeon當作driver。對於ATI的使用者而言,radeon雖然是open source的driver,可是他的效能確實不太理想(不太理想是好聽話...大部分時候是X window整個起不來),因此建議還是安裝propriotary的driver--fglrx。fglrx這個字實在是又怪又難唸,原來他是FireGL and Radeon for X的簡稱,真不知道是哪個天才想出來如此好記好懂的簡稱。

在Debian Squeeze(目前的stable版本)才有fglrx的支援;如果你使用的剛好是Squeeze,則可以透過安裝kernel headers以及fglrx-driver來達成,Wheezy則需要到AMD官方網站下載符合自己顯卡的driver。
由於radeon與fglrx還是會衝突,因此還是需要把radeon.blacklist=1寫入到/etc/grub.d/10_linux裡,再更新grub設定,詳情就請看NVIDIA的設定作參考囉。
關於fglrx與Debian的相關資料,請參閱ATIPropriotary。

一些好用的套件與設定

aptitude install vim nautilus-open-terminal gnome-tweak-tool sysv-rc-conf dconf-tools fcitx-chewing im-config -y
  1. /etc/vim/vimrc
  2. 除了把syntax on啟動之外,另外我還多加了set ai, set ts=4這兩個參數。
  3. nautilus-open-terminal
  4. 按右鍵開啟終端機,這個功能不裝就太對不起自己了。
  5. gnome-tweak-tool
  6. 安裝完成後可以在Applications找到Advanced Settings,這時就可以啟用桌面功能等等。

  7. sysv-rc-conf
  8. 在Debian/Ubuntu系統下建議都使用這個utility來控制daemons。

  9. dconf-tools
  10. 相當於之前的gconf-editor,這個是專門提供Debian/Ubuntu設定Gnome桌面專用的Utility。
  11. HIME
  12. 我喜歡使用HIME輸入法框架,而他也已經包含在Debian官方套件庫裡。
    aptitude install hime hime-chewing -y
    安裝完畢後,會需要使用im-config來設定預設輸入法。如果您不習慣gcin-like的輸入法,您也可以選擇fcitx。
  13. fcitx-chewing
  14. 先前使用Gnome3的經驗,就是使用IBus做為輸入法框架。IBus本身可能沒有大問題,但是我恨透了IBus裡面的酷音模組,想利用shift鍵臨時切換中英文,結果卻打出一堆沒有意義的代碼;

    在IBus的荼毒下,要切換中英文就等於要啟動/關閉整個IBus!!不過我發現fcitx這個中文輸入法框架的酷音模組可以達到我的需求!
    利用im-config來設定fcitx為預設的輸入法框架。不過,fcitx預設切換中英文卻是左側的CTRL鍵。圖形界面的config設定裡卻也沒辦法設定利用capslock鍵作為切換中英文的快速鍵!好在這一切都可以修改!
    找到~/.config/fcitx/config這個檔案,再找TriggerKey這個Option指定CAPSLOCK即可:

    安裝成功後,輸入im-config以啟用fcitx。
  15. Adobe Flash Player
  16. 老把戲再玩一次,請參考建立flashplayer的deb檔。
  17. Java plugins
  18. 也是老把戲了,請參考Java on non-RPM Linux。

GNOME Shell Extensions

GNOME Shell extensions放在~/.local/share/gnome-shell/extensions/裡,所有的extensions全部都是Javascript,非常非常具有彈性。最簡易安裝的方法就是到Gnome-Shell extensions的網站直接拖拉啟動bar安裝。我常安裝的extensions如下:
  1. Coverflow Alt-Tab
  2. 賞心悅目的Coverflow~~
  3. Window options
  4. This extension allows you to use options for each application. Very handy!!!
  5. Extension List


  6. 一個可以一目了然的extensions list
  7. Alternative Status Menu
  8. 原本系統的狀態鈕只能選擇suspend,現在可以使用關機了。
  9. Window List
  10. 萬歲!我的Gnome3終於有工作列可以使用了!e
    P.S. For Newer gnome3(e.g. 3.8), this extension may not work functionally. Please git latest WindowList from github:
    git clone --recursive git://github.com/siefkenj/gnome-shell-windowlist
    cd gnome-shell-windowlist
    cp -r windowlist@o2net.cl ~/.local/share/gnome-shell/extensions/
    Then go to tweak tool to activate it.
  11. Frippery Move Clock
  12. This extension will set Date and Time to the right corner.
  13. Advanced Settings in UserMenu
  14. 在控制項就有進階設定可以選擇!
  15. Remove Accessibility
  16. 把完全用不到的輔助工具功能移除!
  17. Advanced Volume Mixer
  18. 不只是控制系統音量,還可以直接控制個別多媒體的音量。
  19. Axe Menu
  20. 現在也有更直覺化的圖示可以用!
  21. Media Player Indicator
  22. 可以輕易的控制歌曲、節目、音量、時間軸等等,不必真的點程式本身。
  23. system-monitor
  24. 一個看起來相當fancy的system monitor小程式!!須注意這個js需要配幾個重要的套件,以Debian來說,你還需要確定gir1.2-gtop-2.0 gir1.2-networkmanager-1.0這兩個套件有備正確安裝才行。
  25. SystemMonitor
  26. 這個小套件只是一個很簡單的輔助用途,就是當滑鼠移到右下角時,會在左下角看到目前系統的負載。
  27. Impatience
  28. 據說這個套件可以加速GNOME Shell約25%!!我個人的感覺是沒有快這麼多,但是動畫特效確實速率較好!
  29. Show Desktop Button
  30. 左上角就有一個圖示可以快速的顯示桌面!
  31. Force Quit
  32. 左上角會有一個X圖示,可以強迫關閉某個未回應的應用程式。
  33. Places Status Indicator
  34. 在上方工作列也能快速存取常用資料夾。
  35. Setting Center
  36. 控制中心,快速的找到想要的設定!
  37. Gnome底下快速視窗鋪排工具 -- shellshape
  38. 不過真正要達到完全自訂鋪排方式,可能需要背一下快速鍵。請參考shellshape官方網站。

差不多就是這麼簡單了!

Share

2012年6月27日 星期三

zypper筆記

zypper簡史

zypper是在SUSE Linux下的套件管理程式引擎(ZYpp library, 或是libzypp)最重要的指令。也是PackageKit的後端程式(Back-ends),目的是提供一個高階的套件管理程式,協助使用者解決套件相依性的問題、提供解決方案並且自動化設定。 也就是說,使用指令zypper來控制套件跟使用YaST管理套件是相同的行為。

zypper提供的功能主要有:

  1. 自動化安裝、升級以及移除套件
  2. 能夠管理多個套件庫來源URI(Universal Resource Identifier, 可以是localdir, local ISO, NFS, http, ftp, samba, etc.)
  3. 提供比rpm更彈性的管理、查詢功能。

Repositories

一個SuSE Linux標準的repostories設定檔,是放置在/etc/zypp/repos.d/底下,任何以.repo結尾的檔案都會被視為一個套件庫。以一個普通的SLES11.1.repo為例,格式如下:

[SLES11.1]
name=SLES11.1 repostory
enabled=1
autorefresh=1
baseurl=http://192.168.20.1/SLES11.1/x86_64
path=/
type=yast2
keeppackages=0
  1. zypper使用兩種『名稱』:Alias(別名)與Name(名稱描述)。其中[]內為Alias,name則為名稱描述。
  2. enabled必須設定為1才算啟動,這點與yum的定義剛好相反。
  3. autorefresh定義了是否要自動更新套件庫。以ISO檔或是固定來源(例如SLES)的套件庫可設定為0以節省時間。
  4. baseurl可以是local filesystem, ISO, http, https, ftp, nfs, obs等等。URL的來源不需要指定architecture,這會自動由/etc/zypp/zypper.conf或是/etc/zypp/zypp.conf來決定。
  5. path代表從baseurl底下直接視為此套件庫的根目錄。如果是type是yast2或是rpm-md的話,baseurl底下能找到repodata這個資料夾,此時path即可設定為根目錄(/)。
  6. type定義了套件庫類型。zypper能接受三種套件庫類型:yast2(傳統suse套件庫)、rpm-md(相容yum套件庫)以及plaindir(一個包含rpm檔案的資料夾)。
  7. keeppackages定義了安裝或更新完成後是否要從cache裡刪除檔案。

zypper的指令格式如下:

zypper  [--global-options]  <command>  [--command-options]  [args]
雖然有許多command,但是好記卻是zypper的特點--每一個command都有其縮寫,若能熟練縮寫則能減輕許多負擔。例如addrepos可以簡寫為ar,search可簡寫成se,remove可簡寫成rm。格式順序是重要的,但是不要強記--應以自己理解的步調為主。
這裡列舉幾個常見的Global Options:
  • -h (--help):
  • 顧名思義,列出一些重要的commands/options。
  • -q (--quiet):
  • 安靜模式,最常用於shell script裡放進crontab裡使用。
  • -n (--non-interactive):
  • 使zypper的流程變成自動化,但是未必所有情況都會自動回答yes。
  • --no-gpg-checks:
  • 若遇到需要GPG key驗證的時候,可以略過不進行檢查並繼續執行動作。
  • --gpg-auto-import-keys:
  • 若遇到套件庫要求匯入GPG key時能自動匯入。
請務必注意Global Options必須寫在command之前,若寫在command之後會被視為command-options。例如我想要安裝k3b跟net-snmp並移除emacs,過程中自動回答yes並視需要自動匯入GPG,則應該像是這樣:
zypper -q --gpg-auto-import-keys install -yf -d k3b net-snmp -emacs
這串冗長的指令被install一分為二:左側所有的options都是global-options,右側則都是command-options。新版的libzypp會把--no-gpg-checks與--gpg-auto-import-keys定義為Repository Options,但對於語法沒有衝突。

1. 新增套件庫來源:zypper addrepo(ar)

新增一個http站台為例:

zypper ar -f http://192.168.20.1/SLES11.1/x86_64 SLES11.1
-f (--refresh)加入並且立即更新套件資料庫。沒有-f時,zypper預設是不autorefresh的。
後面的網址部份是baseurl,SLES11.1則是Alias。由於我們沒有設定其他參數,因此其他設定會被指定成預設值,例如:enabled=1,type=yast2以及keeppackages=0。如果想要新增一個本地端的ISO檔作為repo,可以這麼定義:
zypper ar -t yast2 -n "SLES11.1 repostory" "iso:/?iso=/home/maxsolar/tftpboot/ISOs/SLES/SLES11sp1_x86_64.iso" "SLES11.1 iso"
以下分別是local DVD, NFS4, ftp以及https的範例:
zypper ar "dvd:/subdir?devices=/dev/sr0,/dev/sr1" DVD
zypper ar "nfs4://nfs-server/exported/path?mountoptions=ro" NFS
zypper ar "cifs://servername/share/path/on/the/share?user=usern&pass=password" SAMBA
zypper ar "ftp://user:password@server/%2fhome/user/path/to/media/dir" FTP
zypper ar "https://user:password@server/path?proxy=foo&proxyuser=me&proxypass=password" WEB
其中-c (--check)是定義加入此repo時檢查其可用性,如果有位置指定錯誤則會馬上得知。
-n (--name)定義了名稱描述。在不定義name時,name==alias。
alias是必要的參數,他不需要任何其他option來引用他。由於ISO檔的資料是固定不變的,因此不使用-f使其永遠不autorefresh以增進效能。

再看另一個例子:把swyear大大個人維護的repo拿來使用:
zypper ar -cdG -n "swyear opensuse" -p 70 -t rpm-md http://download.opensuse.org/repositories/home:/swyear/SLE_11_SP1/ swyear
  • -d (--disable)
  • 加入但不使用此repo。
  • -G (--no-gpgcheck)
  • 不檢查gpg key。
  • -p (--priority)
  • 指定一個不為0的整數作為優先權。

新增一個repo檔至套件庫:

zypper ar -r SLES11.1-kiso.repo
其實更簡單的方式,就是把這個repo檔直接放到/etc/zypp/repos.d/裡,那麼你幾乎可以忘記這個功能。

2. 查詢套件庫:zypper repos(lr)

現在可以查詢剛剛已經加入套件庫有哪些:

zypper repos
# | Alias                          | Name                               | Enabled | Refresh
--+--------------------------------+------------------------------------+---------+--------
1 | SLES11.1                       | SLES11.1                           | Yes     | Yes
2 | SLES11.1 iso                   | SLES11.1 repository                | Yes     | No
3 | swyear                         | swyear opensuse                    | No      | Yes 

事實上同一套件有可能被多個套件庫所維護。以Debian系列來說,系統預設會安裝版本號最新的套件;而SuSE系列的Linux則是依優先權(priority)來安裝,使用-d來查看所有細節(details):
zypper lr -d
# | Alias                          | Name                               | Enabled | Refresh | Priority | Type   | URI
--+--------------------------------+------------------------------------+---------+---------+----------+--------+--------------------
1 | SLES11.1                       | SLES11.1                           | Yes     | Yes     |   99     | yast2  | http://192.168.20.1/SLES11.1/x86_64/
2 | SLES11.1 iso                   | SLES11.1 repository                | Yes     | No      |   99     | yast2  | dir:///home/maxsolar/tftpboot/ISOs/SLES/SLES11sp1_x86_64.iso
3 | swyear                         | swyear opensuse                    | No      | Yes     |   70     | rpm-md | http://download.opensuse.org/repositories/home:/swyear/SLE_11_SP1/
 
需特別注意priority=1表示最高優先權,若不指定優先權則預設為99。你還需要知道哪些重要的小功能呢?
  • -P (--sort-by-priority):
  • 依優先權排序。
  • -U (--sort-by-uri):
  • 依URI排序。
  • -N (--sort-by-name):
  • 依名稱排序。
  • -e (--export):
  • 將所有套件庫匯出至一個檔案。
zypper lr -e foo.repo

3. 刪除與修改套件庫:zypper removerepo(rr)/modifyrepo(mr)/namerepo(nr)

   3.1 刪除套件庫(removerepo)有三個控制項:id(#)、URI以及Alias,任意一項都可以:

zypper rr 1
等同於
zypper rr SLES11.1
等同於
zypper rr http://192.168.20.1/SLES11.1/x86_64/

   3.2 修改套件庫(modifyrepo)有四個控制項:id(#)、URI、Alias以及name,建議用最直覺的id即可。可以修改的options族繁不及備載,這裡僅列出幾項作拋磚引玉之用:

zypper modifyrepo
  • -e (--enable)與-d(--disable):
  • 啟用與停用。
  • -r (--refresh)與-R(--no-refresh):
  • 啟用/停用自動更新。
  • -p (--priority) <positive-integer>:
  • 設定大於0的整數作為優先權。
  • -n (--name) <name string>:
  • 指定一個字串作為name。
  • -k (--keep-packages)與-K(--no-keep-packages):
  • 安裝/更新後,套件是否保留在cache裡。
  • -a (--all):
  • 將規則套用到所有套件庫。
假設我要把#1變成優先權為10,#2改變name為SLES11_ISO_repo並啟用autorefresh,把#3設定為啟用並且將所有repos都設定keeppackages=1:
zypper mr -p 10 1
zypper mr -rn SLES11_ISO_repo 2
zypper mr -e 3
zypper mr -ka
或許你已經注意到,modifyrepo並不能修改Alias,想要修改Alias必須使用namerepo這個子指令。

   3.3 修改套件庫名稱(namerepo)也有四個控制項:id(#)、URI、Alias以及name,建議用最直覺的id即可。他的目的就只有一個--修改Alias:

zypper nr 2 SLES11_ISO_image

4. 查詢套件:zypper search(se)/info(if)/what-provides(wp)

   4.1 查詢套件(search)的方式相當靈活,在此我先列出常用的options再加以靈活運用:

  • -s (--details):
  • 顯示詳盡訊息
  • -d (--search-descriptions):
  • 連套件描述的文字也納入搜尋。
  • -r (--repo) <alias|name|#|URI>
  • 指定套件庫內容來搜尋。
  • --match-exact <STRING>
  • 指定某一精確的字串來搜尋。
例如我想知道套件名稱有包含snmp的套件:
zypper se snmp -s
kernel的種類太多,只想精確搜尋kernel-syms:
zypper se --match-exact kernel-syms
S | Name        | Summary                              | Type      
--+-------------+--------------------------------------+-----------
  | kernel-syms | Kernel Symbol Versions (modversions) | package   
  | kernel-syms | Kernel Symbol Versions (modversions) | srcpackage
這裡的type與使用zypper repos顯示的type意義是不同的。repos裡的type是套件庫的種類;search裡的type是套件本身的種類,有package(一般正常的rpm檔)、pattern(推薦的套件群組)、product(必須安裝的套件群組)以及srcpackage(原始碼)。此時不指定type時,package為預設類別。 只搜尋#1套件庫,套件描述裡包含kvm的套件呢?
zypper se -r 1 -d kvm
想找kernel開頭的套件:
zypper se kernel-*

   4.2 查詢套件詳細訊息(info)需要給定一個正確的套件名稱,先search之後再使用info是個好方法。

zypper if expect

   4.3 查詢某個檔案或套件事由誰提供(what-provides)

zypper wp libldap-2.4.so.2

5. 安裝套件:zypper install(in)/source-install(si)

   5.1 install的基本格式為

zypper install [options] <name|capability|rpm_file_uri>
安裝swyear提供的k3b到系統上:
zypper in k3b -r swyear
也可以寫成
zypper in swyear:k3b
安裝多個rpm檔:
zypper in http://192.168.20.1/progs/madedit/MadEdit/MadEdit-0.2.9/madedit-0.2.9-1.x86_64.rpm ~/progs/Adobe/AdbeRdr9.4.7-1_i486linux_enu.rpm
安裝同時移除套件:
zypper in vim-enhanced -gcin
安裝某一個缺少檔案所帶來的套件:
zypper in 'libXfixes.so.3'
安裝所有以kernel-開頭的套件:
zypper in kernel-*
強制/重新安裝:
zypper in iperf -f
有些好用的options應該要知道:
  • -f (--force):
  • 強制/重新安裝套件。
  • -y (--no-confirm):
  • 遇到問答一律回答yes。
  • -l (--auto-agree-with-licenses):
  • 自動同意軟體授權同意條款。
  • -R (--no-force-resolution)與--force-resolution:
  • 在interactive模式下,zypper預設會幫我們算出解決方案並執行之(--force-resolution);然而在non-interactive模式下,由於顧慮到系統安全,因此放棄自動執行解決方案(--no-force-resolution)以便讓使用者有機會手動解決問題。
    interactive/non-interactive模式是屬於Global Options,這些options必須要比zypper的command更早被使用。
  • -D (--dry-run):
  • 只做測試,不會真的進行安裝。
  • -d (--download-only):
  • 只下載而不進行安裝。
例如:
zypper --non-interactive --no-gpg-checks in -flR iperf
也就是我執行一個非互動式的安裝,不檢查gpg,強制安裝iperf並同意授權條款,若發生錯誤則仍然自動執行解決方案。

   5.2 source-install相對容易多了,他只要接一個原始碼的套件名稱即可。使用si之前需要先使用search:

zypper se -t srcpackage udev
S | Name | Summary                                           | Type      
--+------+---------------------------------------------------+-----------
  | udev | A rule-based device node and kernel event manager | srcpackage
得知這個原始碼套件名稱就是udev,接著就可以進行安裝。
zypper si udev
si預設會把需要編譯該套件的其他套件一起裝起來。

6. 移除套件:zypper remove(rm)

remove的功能很明確,就是移除套件。下列只有幾個簡單的options可供選擇:

  • -t (--type):
  • 指令套件類別。
    zypper rm -t srcpackage udev
  • -R (--no-force-resolution):
  • 不強制使用解決方案。移除時遇到套件相依性問題,系統預設會使用計算出來的解決方案。想要自己手動選擇方案,需要使用-R。
  • -u (--clean-deps):
  • 一同移除沒被使用到的套件。
  • -D (--dry-run):
  • 純粹只是測試,不進行真正更動。

7. 刷新/清空套件庫:zypper refresh(ref)/clean(cc)

   7.1 利用zypper refresh來更新套件庫的快取。若套件庫被標示為不更新(autorefresh=0)的則不受影響。當使用只執行更新時,其實有四種類型的資料會牽涉其中:

  1. metedata
  2. 包含repository metadata(套件大小、版本、相依性等資訊)以及raw metadata(套件的時間戳記、sha1校驗碼以及位置)。
  3. database
  4. libzypp資料庫。
  5. raw data
  6. 就是rpm, source rpm以及patch等實體檔案。
  7. service
  8. 目前版本的zypper(1.5.1)支援的服務僅有Repository Index Service(RIS),訂閱這個服務可以自動管理所有的套件庫,並且由此服務所建議的方案來維護系統上的套件。
refresh預設只會更新metadata,而這也是大部分系統管理員預期的行為。不同的參數可控制細部的行為,可參閱manpages以取得細節。

   7.2 利用zypper clean來清除套件庫的快取(/var/cache/zypp*)。預設只清除套件本身(raw data),如果想要徹底清除metadata並開始一個新的更新,下列參數可能需要:

  • -m (--metadata)
  • 只清除repository metadata,所有已下載的套件都會被保留。
  • -M (--raw-metadata)
  • 所有metadata都清除,但已下載的套件都會被保留。
  • -a (--all)
  • 所有metadata都清除,連已下載的套件都一併刪除。
因此在網路頻寬充裕的情況下,啟動更新前最佳的模式應該是:
zypper clean -a

8. 更新/列舉更新系統:zypper update(up)/dist-upgrade(dup)

update的行為與dist-upgrate僅差別在範圍大小,參數都是共用的。有幾個參數可以特別注意:

  • -r (--repo)
  • 指定某套件庫來源進行更新。
  • -l (--auto-agree-with-licenses)
  • 自動同意license。通常還會搭配-y表示同意
  • --force-resolution
  • 更新預設的行為是--no-force-resolution,會提示解決方案由使用者決定。使用force表示採用zypper所計算出的最佳解決方案。
  • -D (--dry-run)
  • 一個測試性質的動作,不影響系統狀態。
假設不預先執行zypper refresh,光是執行zypper update就會先執行refresh的動作。update會更新所有metadata,並且更新、下載安裝套件之後,再更新database。
update的行為是更新已安裝的套件,但dist-upgrade的行為著重在系統的升級,例如更新了repo之後,利用dup從SLES11.1升級至SLES11.2,此時會安裝新版本所建議的套件、更新原本安裝的套件,也會移除新版本所廢除的套件。

9. 檢查使用舊套件之程序:zypper ps

在經歷update或是dist-upgrade之後,系統總會提示使用者要執行zypper ps已檢查有哪些套件或檔案已被更新但系統仍持續佔用(occupied)。他沒有參數,只具參考價值;對於仍持續被系統佔用的舊套件只有重開機之後才能使用更新後的套件/檔案。

這份筆記並不適用於zypper 0.5(例如SLES10)。因為SLES10並不讀取repo檔案,zypper的使用效率也很低落;想在SLES10使用zypper必須自行參考他所提供的manpages。

Share

2012年3月21日 星期三

台北生活日記01

作夢的時候才會快樂,才發現以前不用作夢就能感受快樂。

小小的人類,一雙鞋,一個背包,竟有踏遍整個地球的夢想。
我背著陪伴我一年的背包,才真正了解背包『是我肩膀上的指環』的真實意義。

在我什麼都沒有的時候,我其實得到了所有。
工作、生活、技能都有了,我卻好像失去了一切。
金錢買不到快樂,真的,我是說真的。

台北的生活與環境,不諱言的真的讓我從天堂掉到地獄。
工程挖挖挖,
汽車叭叭叭;
下雨涮涮涮;
皮膚抓抓抓...

路上打招呼被人當神經病,我這外地人好心報路被人當詐騙集團,
90秒起跳的紅綠燈誰不想綠燈之後加速狂奔,
侷促的土地上蓋更多更高的大樓說是繁榮進步,過度擁擠的後果有誰關心?

台北市許多地方的機車停車格,白色的停車格線被塗掉了。在人口日益增加的時候,竟然在不妨礙交通的地方塗掉停車格,理由再明白不過了:減少的停車格代表更多的市政收入來源。 所以蓋了更多高架道路來疏通交通流量,所以巨大的灰色怪物就這樣長在這都市的軀體裡。人們該到哪裡慢慢的走路?該到哪裡享受空間?該到哪裡接觸自然?該到哪裡思考自己思考未來?該到哪裡釋放壓力?
去KTV唱歌吧!機車沒停車位...去館子吃一頓像樣的吧!沒停車位...去參觀博物館吧!靠停車位已滿...去看場電影吧!抱歉找到停車位之後,喜歡的場次已經沒有座位了...

除了聾子之外是不是沒人能在台北找到安靜的一塊草地,周圍安靜沒有人頻繁往來,讓自己了解自己是在這塊土地、這片山水的哪塊位置?如果不經常這樣的反思,生活上的壓力與經驗只會讓自己往物質的角度前進,以物質生活為喜樂的標準,這樣的人類活著太可悲了。

看見天空很重要,看見遼闊的土地很重要,他會喚起人性的本質--『思考自我』。當我發現我內心第一個念頭並非充滿感謝,我開始抱怨環境的一切,我就知道我失去了心靈的平衡。可是在台北,別說看不到太陽,我連天空都看不見。河流是人造過的,旁邊就是醜陋的都市灰色血瘤。我停下腳步,在距離我最近的一片綠地--潭美公園,我還是感受不到土地和我之間的那種連結。

我想像從前一樣,背著背包花一個小時的時間,平地約可以走6公里。可是如果在台北的街道(其實全台灣都一樣),走斑馬線不看車還是會慘死輪下,因為台灣的行人的路權是最小的(恰好跟法令規定的相反)。我可以花一個小時走路上班,可是路程會很不愉快,充滿危險。在有限的資源內作最大的效益,台北做得很成功,只可惜這樣的氛圍導致人跟人之間只是競爭,而非互助;只是顧好自己,而非禮讓他人。

套句慈濟志工在日本說的話:『感謝日本同胞幫我們承受這場苦難』。我也必須說,感謝在台北的同胞替我們承受這一切苦難,因為他真的是台灣生活環境最糟糕的都市。
感謝有了台北,其他的都市才不會過度擁擠。感謝有了台北,我們的河川還是自然的河岸(雖然還是污染);感謝有了台北,我們吃飯唱歌看電影都可以輕鬆的停車,然後消費。要有天然的美景與豔陽也是垂手可得,有遇到熱情的鄉民搏感情也是超容易,100元以內吃到飽的餐廳比比皆是。我可以坐在岸邊,看著水鳥覓食,野狗跑來跟我打招呼,然後想著自己在自然的一部分,讓我能重新定位自己,世上的紛爭沒有不能解的。這一切都不會在專注開發的台北找到,感謝台北把這些東西都集中起來,台灣其他的部份才能如此美好。 試想如果台灣的人口平均分配在每個縣市,我們一定無法忍受。

我其實不再像以前一樣罵台北,他有許多部份(應該是所有)是我很不喜歡的,但也因為如此,我才更知道自然的重要,因為我們一旦失去了跟大地的連結,我們便失去了感謝的能力,導致快樂徹底從心中消失。中南部的鄉親,我們真的該謝謝台北人幫我們承受的苦難。

但我已喪失的平衡,期盼能從下次回南部重新找回來。

2012年3月10日 星期六

你們這些人可不可以閉嘴

我最痛恨那種『偽Linux使用者』。

  1. 喜歡問問題,不喜歡google,然後最喜歡別人幫他google。
    (答) STFG!! RTFM!! JFGI!!!

  2. 基本常識沒有,要他打指令就痛苦得跟要切除腎臟一樣,還會問如何刪除終端機程式。
    (答) 無言以對...你去切腎臟,我來打指令吧...

  3. 喜歡高談闊論說未來就是GUI,跟他說Windows現在也出Powershell不然會被Unix幹假的,他說哦那是Server。
    (答) 我覺得你只是在找個不會中毒不用錢的Windows罷了...

  4. 他說他在MaxOS也玩過指令(弱的人都會強調"我也玩過指令!"),可是跟他說Automator也是要搭配,他就直接略過不談。
    (答) 我猜想他不知道我也玩過MAC,而且比他還熟。

  5. 喜歡批評程式太多BUG,然後只在自己的BLOG抱怨說有BUG的程式跟病毒沒兩樣,完全不知道有BUGZILLA可以回報以及這些努力是開發人員利用額外的時間辛苦開發的。告訴他事實之後,他直接把我的留言刪了。
    (答) 我知道事實總是殘酷的,面子當外衣穿在身上,一脫下來就見不得人了。

  6. 喜歡在UBUNTU/FEDORA/MINT/OPENSUSE之間切換然後比較哪個GUI比較合他胃口,然後會強調他在n年前的使用經驗比起來沒啥進步。
    (答) N年前玩LINUX到現在,只知道gui有什麼變化,能稱得上『linux使用者』嗎?

  7. 會批評我們這種一般使用者為指令狂人。
    (答) 指令只是解決事情的工具罷了,沒有狂的成份。

結論:
Linux是會認主人的,如果你跟他無緣,也無須勉強。
Linux就是Linux,他的外表或是管理工具不同,本質是一樣的。就算他的gui可以做得讓那些『偽Linux使用者』開心,我們也還是離不開command line。
Linux的初學者跟Linux的弱者是不同的兩回事,我們看得很清楚。初學者只是有許多觀念尚未釐清,弱者則是不想學習任何觀念,而Linux的弱者無論n年前或n年後,無論是在win/mac/linux或其他os,都是同樣的弱。

2012年1月19日 星期四

建立flashplayer的deb檔

最近發現許多瀏覽器上的flash都被宣告為過期的版本而無法使用,想要玩線上遊戲或是看YouTube總是很困擾。Adobe的官方網頁上雖然好像有apt的版本,不過不曉得該用什麼應用程式來開啟或安裝他。於是想到把下載來的tar.gz檔自己作成deb來安裝吧!

1. 下載新版的flash player:
至Adobe官方網站下載適合自己平台的rpm及tar.gz檔。下載這個rpm檔純粹是為了要得知版本號,沒有真正其他用途。
利用rpm指令檢查一下他的版本(ubuntu預設沒有安裝rpm,需手動安裝)

rpm -qpi flash-plugin-11.1.102.55-release.x86_64.rpm
發現訊息如下:
Name        : flash-plugin                 Relocations: (not relocatable)
Version     : 11.1.102.55                       Vendor: Adobe Systems Inc.
Release     : release                       Build Date: Tuesday, November 01, 2011 AM09:56:12 HKT
Install Date: (not installed)               Build Host: frbld_lnx_024
Group       : Applications/Internet         Source RPM: flash-plugin-11.1.102.55-release.src.rpm
Size        : 19875381                         License: Commercial
Signature   : (none)
Packager    : Adobe Systems Inc.
URL         : http://www.adobe.com/downloads/
Summary     : Adobe Flash Player 11.1
Description :
Adobe Flash Plugin 11.1.102.55
Fully Supported: Mozilla SeaMonkey 1.0+, Firefox 1.5+, Mozilla 1.7.13+
得知目前的版本為11.1.102.55,而Debian系列套件版本的命名格式應修改成11.1.102-55
mkdir flash-plugin_11.1.102-55_amd64
tar zxvf install_flash_player_11_linux.x86_64.tar.gz -C flash-plugin_11.1.102-55_amd64
mv flash-plugin_11.1.102-55_amd64/libflashplayer.so flash-plugin_11.1.102-55_amd64/usr/lib64

2. 建立deb檔:
mkdir flash-plugin_11.1.102-55_amd64/DEBIAN
cd flash-plugin_11.1.102-55_amd64
cat <<HERE > DEBIAN/postinst
#!/bin/bash
[ -e /etc/alternatives/libflashplayer.so ] && {
    update-alternatives --set libflashplayer.so /usr/lib64/libflashplayer.so
} || {
    update-alternatives --install /usr/lib/mozilla/plugins/libflashplayer.so libflashplayer.so /usr/lib64/libflashplayer.so 2000
}
HERE

cat <<HERE > DEBIAN/prerm
#!/bin/bash
update-alternatives --remove libflashplayer.so /usr/lib64/libflashplayer.so
HERE

chmod 555 DEBIAN/postinst DEBIAN/prerm
postinst與prerm是這個包這個package的重要script。另外,我們還缺一個control檔:
cat <<HERE > DEBIAN/control
Package: flash-plugin
Version: 11.1.102-55
Section: Applications/Internet
Priority: optional
Architecture: amd64
Maintainer: yourname
Description: Adobe flash player
HERE

然後就是編譯工作:
cd -
sudo dpkg-deb --build flash-plugin_11.1.102-55_amd64
包deb的過程不太可能會失敗,常見的錯誤僅有未使用root權限執行build動作。完成後會產生一個flash-plugin_11.1.102-55_amd64.deb檔案,這就是今天的主角。

3. 安裝我們剛包好的flash player:
dpkg -i flash-plugin_11.1.102-55_amd64.deb
恭喜你成功安裝了新版的flash player,而且還學到了如何包deb。

Share