2014年12月15日 星期一

系統時間與硬體時間

安裝Linux時常見的某個步驟會要求設定系統時區並決定硬體時鐘是否使用UTC, 
設不設成使用UTC好像感覺不出差別, 只是偶爾會發現安裝好之後系統時間被提早了八小時(台灣是UTC+8).
這問題不常困擾我是因為通常發現後順手date修正成正確時間就好, 
後來某年網中人寫了篇ntpdate推廣文之後就一律自動校時, 一直都沒發生過問題.
所以沒耐性的人可以直接看結論: 設成使用UTC, 設定ntpd每次開機校時, 下課!


硬體時鐘:
指的就是在BIOS裡可以設定的時間, 由電腦硬體維護, 
早期主機板上有顆鈕扣電池就是拿來保存並維持一些最基礎的運作, 
作業系統每次開機時會從BIOS裡把時間讀出來, 在linux裡可以用hwclock讀出硬體時鐘

系統時間:
在作業系統裏維護的時間, 開機時讀出BIOS時間後, 根據系統時區的設定加減完時差, 
得到的就是當地的時間, linux下可以date指令讀出.

問題就是在於, BIOS裡的時間紀錄的是自1970年1月1號00:00:00起至今的秒數, 沒有時區的觀念, 
所以現代的作業系統開機時從BIOS裡讀出來的時候會需要知道,
這組秒數紀錄的是當地的時間(UTC+8)? 還是UTC+0時間? 
安裝時的這個問題"硬體時鐘是否使用UTC"在問的就是這個問題.

要把硬體時鐘當作是UTC時間或是當地時間完全隨個人喜好, 
Windows系列默認硬體時鐘是local time(可以透過patch修正), Linux系列是UTC(可以選擇), 
有趣的是Arch Linux的wiki有警告: "使用本地時間可能引發數個已知且無法修復的臭蟲, 目前沒有放棄本地時間支援的計劃."
不管怎麼選, 雙系統使用者的重點是要決定只使用其中一套作業系統維護硬體時鐘, 
不然Linux設定成硬體時鐘使用UTC, 開完機進windows時間馬上就慢八小時, 老問題了.

我的Arch Linux安裝時選擇硬體時鐘使用UTC時間, 每次ntpd校完時就寫回hwclock, 
所以date出來的是現在的當地時間(例如9pm), hwclock出來的是UTC+0時間(1pm), BIOS裡看到的是UTC+0時間(1pm)

2014年12月14日 星期日

安裝常用軟體

#Install base-devel if you need AUR
#pacman -S base-devel
#Install yaourt for access AUR softwares
#vim /etc/pacman.conf  #i686或X86-64擇一
     #i686
          [archlinuxfr]
          SigLevel = Optional TrustAll
          Server = http://repo.archlinux.fr/i686
     #X86-64
          [archlinuxfr]
          SigLevel = Optional TrustAll
          Server = http://repo.archlinux.fr/x86_64
          #SigLevel要加, 不然yaourt會抱怨某些AUR packages的簽名不對
#pacman -Syu yaourt
#系統升級(Option:archlinux rolling release, 所以有時DB內容會需要更新)
#pacman -Syu
#pacman-db-upgrade
#安裝常用小工具
#pacman -S vim
#pacman -S wget
#pacman -S fbterm
#pacman -S tmux
#yaourt -S tintin     #arhclinux官方不維護tintin, 要到AUR裡找

2014年12月13日 星期六

自訂/etc/sudoers

Cmnd_Alias WHEELER = /usr/sbin/lsof, /bin/nice, /bin/ps, /usr/bin/top, /usr/local/bin/nano,/usr/sbin/ss, /usr/bin/locate, /usr/bin/find, /usr/bin/rsync
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill
Cmnd_Alias EDITS = /usr/bin/vim, /usr/bin/nano, /usr/bin/cat, /usr/bin/vi
Cmnd_Alias ARCHLINUX = /usr/sbin/gparted, /usr/bin/pacman

root ALL = (ALL) ALL
#land ALL = (ALL) ALL, NOPASSWD: WHEELER, NOPASSWD: PROCESSES, NOPASSWD:ARCHLINUX, NOPASSWD: EDITS
#%wheel     ALL=(ALL)     ALL
#Defaults log_host, logfile=/var/log/sudo.log

%sudo     ALL=(ALL)     ALL, NOPASSWD: WHEELER, NOPASSWD: PROCESSES, NOPASSWD:ARCHLINUX, NOPASSWD: EDITS

Defaults !requiretty, !tty_tickets, !umask
Defaults visiblepw, path_info, insults, lecture=always
Defaults loglinelen = 0, logfile =/var/log/sudo.log, log_year, log_host, syslog=auth
Defaults mailto=land.chang@gmail.com, mail_badpass, mail_no_user, mail_no_perms
Defaults passwd_tries = 8, passwd_timeout = 1
Defaults env_reset, always_set_home, set_home, set_logname
Defaults !env_editor, editor="/usr/bin/vim:/usr/bin/vi:/usr/bin/nano"
Defaults timestamp_timeout=360
Defaults passprompt="Sudo invoked by [%u] on [%H] - Cmd run as %U - Password for user %p:"
Defaults log_output
Defaults !/usr/bin/sudoreplay !log_output
Defaults !/usr/local/bin/sudoreplay !log_output
Defaults !/sbin/reboot !log_output

自訂開機後運行服務

#設定Ethernet
# systemctl enable dhcpcd.service#開機自動取得IP
# systemctl start dhcpcd #啟動dhcpcd

#手動設定wireless, 三步驟:1. scan ssid, 2.pass (WEP/WPA) authenication, 3.dhcpd/manual get IP
# pacman -S iw
# pacman -S wpa_supplicant

#方法一 connect with wpa_passphrase
# iw dev wlan0 scan | less #掃描SSID
#通過wpa2認證(通過後開新terminal執行dhcpcd wlp1s0或是加上-B讓此步驟背景化再執行dhcpcd wlp1s0要IP)
# wpa_supplicant -i wlp1s0 -c<(wpa_passphrase "YOUR_SSID" YOUR_KEY)
# dhcpcd wlp1s0

#方法二 connect with wpa_cli
# mkdir /var/run/wpa_supplicant
# chgrp wheel /var/run/wpa_supplicant
# vim /etc/wpa_supplicant/wpa_supplicant.conf
   ctrl_interface=/var/run/wpa_supplicant
   update_config=1
# wpa_supplicant -B -i wlp1s0 -c /etc/wpa_applicant/wpa_supplicant.conf
# wpa_cli                            #進入wpa_cli互動模式, 示範過程看https://wiki.archlinux.org/index.php/WPA_supplicant
/index.php/WPA_supplicant
>scan
>scan_results
>add_network
>set_network 0 ssid "YOUR_SSID"
>set_network 0 psk "YOUR_KEY"
>enable network 0
>save_config
>quit
# dhcpcd wlp1s0

#開機自動連接wireless
#dhcpcd會執行所有/usr/lib/dhcpcd/dhcpcd-hooks/下的script(hooks),
#其中的10-wpa_supplicant hook會自動對wireless介面呼叫wpa_supplicant進行認證
#10-wpa_supplicant hook的發動條件
1.沒有wpa_supplicant常駐
2.dhcpcd檢查到任一設定檔存在
   /etc/wpa_supplicant/wpa_supplicant-"$interface".conf
   /etc/wpa_supplicant/wpa_supplicant.conf
   /etc/wpa_supplicant-"$interface".conf
   /etc/wpa_supplicant.conf

#因此在正確位置放好wpa_supplicant設定檔, 將dhcpcd掛入開機自動執行(見上方設定Ethernet段)後, 開機時dhcpcd即可自動完成wireless的啟動
#關閉dhcpcd hook的行為是在dhcpcd.conf加入nohook wpa_supplicant命令

# vim /etc/wpa_supplicant/wpa_supplicant.conf
   ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
   update_config=1
   fast_reauth=1
   ap_scan=1
# wpa_passphrase "Inn of the Last Home" "YOUR_KEY>>
/etc/wpa_supplicant/wpa_supplicant.conf

#自動對時, 2014/12/15時arch linux的ntpd會嘗試listen on ipv4導致啟動失敗,
依照下列方式強制其只開啟在ipv4
# pacman -S ntpd
# cat /usr/lib/systemd/system/ntpd.service
#檢查是否有一行像這樣:ExecStart=/usr/bin/ntpd -g -u ntp:ntp , 是的話繼續下面動作
# vim /etc/systemd/system/ntpd.service.d/customexec.conf
[Service]
ExecStart=
ExecStart=/usr/bin/ntpd -4 -g -u ntp:ntp
# systemctl enable ntpd

#安裝ssh及sshd
#pacman -S openssh
#systemctl start sshd
#systemctl enable sshd.service

自訂Shell

修訂/etc/skel/內的範本檔, 加上彩色功能, 加上vimrc, 新增平日作業用的帳號,將工作帳號設為sudoer, 修訂/etcv/sudoers, 加上log及便利機制

# vim /etc/skel/.bashrc
setterm -blength 0#關掉Beep聲, putty遠端連入時, Beep聲會以閃動螢幕取代,傷眼睛
alias grep='grep --color'
alias h='history 100'
complete -cf sudo
reset=$(tput sgr 0)
red=$(tput sgr 1)
blue=$(tput sgr 4)
green=$(tput sgr 2)
PS1='\[$red\]\u\[$reset\] \[$blue\]\w\[$reset\] \[$red\]\$\[$reset\]\[$green\] '

#編輯/etc/skel/.vimrc

# pacman -S sudo            #安裝Sudo
# groupadd sudo
# 編輯/etc/sudoers

# useradd -m USER_NAME#新增普通使用者, 新增使用者家目錄
# passwd USER_NAME #設定使用者密碼
# groupadd sudo
# usermod -aG sudo USER_NAME #將使用者加入sudo群組
# groups USER_NAME #確認屬於sudo群組

自訂VIM

# vm /etc/skel/.vimrc
set background=dark
set number                          #顯示行號
set cursorline                      #啟用行游標提示
set mouse=nv                     #只有Normal及Visual支援滑鼠, 取消Insert模式時的滑鼠支援
set hls                                   #High light search
set ic                                     #search忽略大小寫
set ai                                     #自動縮排
set tabstop=4                      #設定縮排位元數
set shiftwidth=4
set enc=utf8                        #vim所使用的內部編碼
set fileencoding=utf-8        #建立新檔時以utf-8編碼建立,
                                                 fileencodings成功判斷出文件編碼後
                                                 會將fileencoding改為判斷出的編碼好保持編碼一致
#依序按設定編碼打開文件, 編碼嚴謹的放前面, 編碼寬鬆容易誤判的放後面,
   不常用的也放後面
set fileencodings=ucs-bom,utf-8,big5,euc-jp,gbk,latin1

#其實可以不用設, 只影響顯示在螢幕上的編碼, 大部分影響到的是透過終端機(putty之類)連入
   的vim編輯行為
set termencoding=utf-8

2014年12月12日 星期五

在EeePC上安裝Arch Linux

1. 找個合適的Mirror Site
https://www.archlinux.org/download/ -> http://ftp.tku.edu.tw/Linux/ArchLinux/iso/2014.12.01/

2. 選擇合適的bootstrap image, 驗證下載完整性, 寫進USB碟, 等等要用這支USB
碟當安裝碟
$ wget -c http://archlinux.cs.nctu.edu.tw/iso/2014.12.01/archlinux-2014.12.01-dual.iso
$ wget http://archlinux.cs.nctu.edu.tw/iso/2014.12.01/md5sums.txt
$ md5sum -c md5sums.txt
$ sudo sh -c "cat archlinux-2014.12.01-dual.iso > /dev/sdc" && sync && sync && sync

3. 以USB碟開機, /dev/sda1切1G 給/boot, 剩下空間全丟給LVM管, SWAP先用LVM畫4G出來
# fdisk /dev/sda#/dev/sda1 1G, /dev/sda2 148G, 都是type 83
# lvmdiskscan
# 建pv
# pvcreate /dev/sda2
# 建vg
# vgcreate VolGroup00 /dev/sda2
# 建lv
# lvcreate -L 4G VolGroup00 -n swap
# lvcreate -l +100%FREE VolGroup00 -n root
# 格式化
# mkfs.ext4 /dev/mapper/VolGroup00-root
# mkfs.ext4 /dev/sda1
# mkswap /dev/mapper/VolGroup00-swap
# 掛起來
# mount /dev/mapper/VolGroup00-root /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot
# swapon /dev/mapper/VolGroup00-swap

4. rankmirrors選擇mirror, pacstrap安裝基礎系統, chroot進入後基礎設定
# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
# cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup-orig
# sed -i 's/^#Server/Server/' /etc/pacman.d/mirrorlist.backup
# rankmirrors -n 6 /etc/pacman.d/mirrorlist.backup > /etc/pacman.d/mirrorlist

# pacstrap /mnt base

# genfstab -p /mnt >> /mnt/etc/fstab
# arch-chroot /mnt
# echo atom > /etc/hostname
# vim /etc/vconsole.conf                #設定keymap及console字型
   KEYMAP=us
   FONT=Lat2-Terminus16
# ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime
# hwclock --systohc --utc                #注意這裡常搞混
# vi /etc/locale.gen                         #反註解en_US.UTF-8 UTF-8及zh_TW.UTF-8 UTF-8與zh_TW BIG5
# locale-gen
# echo LANG=en_US.UTF-8 > /etc/locale.conf
# vi /etc/mkinitcpio.conf
#確定udev及lvm2的mkinitcpio hooks開啟, udev內定為開, 因此在block與filesystems之間加入lvm2字樣即可
#例如: HOOKS="base udev ... block lvm2 filesystems"
# mkinitcpio -p linux

# passwd
# vi /etc/hosts
   127.0.0.1 localhost.localdomain localhost atom
#pacman -S grub
#grub-install --target=i386-pc --recheck --debug /dev/sda
#grub-mkconfig -o /boot/grub/grub.cfg
# exit
# umount -R /mnt
# reboot

5. 安裝完成後基本設定
自訂開機後運行服務
安裝常用軟體
自訂Shell
自訂VIM

在文字模式下製作安裝USB碟或是燒錄開機片

製作開機USB:
$ sudo sh -c "cat debian-7.1.0-amd64-CD-1.iso > /dev/sdc" && sync &&
sync && sync
or
$ sudo dd if=./CentOS-7-x86_64-DVD-1503-01.iso of=/dev/sdc

燒錄開機片:
cdrecord
$sudo cdrecord -eject -speed=12 -v debian-7.1.0-amd64-CD-1.iso

growisofs
$ sudo growisofs -dvd-compat -Z -M /dev/dvd=debian-7.1.0-amd64-CD-1.iso
#-Z:指定設備
#-M:關閉燒錄