2014年12月31日 星期三

WiFi 手動無線網路 wlan0 連線


說明:

這邊介紹 iwconfig 的手動連線方法,
其中一點要注意的是,它不支援 WPA 加密格式
它只適用 WEP 加密處理,因此以本校 STUST 為例是適用的!

零。入門


# 查看Wifi Driver型號,上網下載驅動程式


lspci
lspci -v
lspci -k



以我的電腦為例,輸出:

        
01:00.0 Network controller: Intel Corporation WiFi Link 5100
Subsystem: Intel Corporation WiFi Link 5100 AGN
        Flags: fast devsel, IRQ 16
        Memory at e3500000 (64-bit, non-prefetchable) [size=8K]
        Capabilities: [c8] Power Management version 3
        Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
        Capabilities: [e0] Express Endpoint, MSI 00
        Capabilities: [100] Advanced Error Reporting
        Capabilities: [140] Device Serial Number 00-22-fb-ff-ff-66-59-5a
        Kernel driver in use: iwlwifi


# 安裝WiFi驅動


tar xfva /home/lin/MyDriver/iwlwifi-5000-ucode-5.4.A.11.tar.gz
cd iwlwifi-5000-ucode-5.4.A.11/
cp iwlwifi-5000-1.ucode /lib/firmware/
reboot

############################################################

壹。手動 iwconfig 無線網路設定

一、清除網路設定

1. 有線網路 eth0 清除

route del default eth0
ifconfig eth0 down

順便補充無線網路 wlan0 清除:
ifconfig wlan0 down
iwconfig wlan0 txpower off

二、 開啟無線網路

iwconfig wlan0 txpower on
ifconfig wlan0 up

三、掃描可用的無線 AP 站

iwlist wlan0 scan | grep -i essid

輸出如下:
                    ESSID:"Alias 4G"
                    ESSID:"stust_p203"
                    ESSID:"stust_p205"
                    ESSID:"EDIMAX"
                    ESSID:"S611-AP"
                    ESSID:"stust_p306"
                    ESSID:"S210B"
                    ESSID:"stust_teacher"
                    ESSID:"stust_p302"
                    ESSID:"stust_j304"
                    ESSID:"stust_teacher"
                    ESSID:"stust_s412@"
                    ESSID:"stust_teacher"
                    ESSID:"stust_p503"
                    ESSID:"stust_teacher"
                    ESSID:"stust_s314"
                    ESSID:"stust_j402"
                    ESSID:"stust_s414"
                    ESSID:"stust_s514"
                    ESSID:"p501_PM"

四、設定 ESSID

假設要連線上面掃到的 ESSID:"stust_p203"
iwconfig wlan0 essid stust_p503

檢查 ESSID 設定:
iwconfig wlan0

五、取得 IP

dhclient -v wlan0

成功取得後,即可得到 AP 所發出來的 ip !

--------------------------------------------------------------------------------

貳。修改網路設定檔 (可支援 WPA 加密格式 )

一、同上面方式清除 eth0,開啟 wlan0

1. 有線網路 eth0 清除

route del default eth0
ifconfig eth0 down

2. 開啟無線網路

iwconfig wlan0 txpower on
ifconfig wlan0 up

二、修改設定檔

vi /etc/network/interfaces

加入下面設定 (原本的網路不變動,或用 # 註解掉)
auto wlan0
iface wlan0 inet dhcp
       wpa-ssid        "AP-ESSID"
       wpa-psk         "password"

三、重啟網路

/etc/init.d/networking restart
或
service networking restart

四、查看有無找到 ip

ifconfig




參、推薦圖形操作軟體

Wicd 網路管理程式(適用 Wireless)










2014年12月30日 星期二

tmpfs 於 Linux 用記憶體當硬碟用 ( RAMDisk)



因為筆者所使用的 Linux 是安裝在 m-SATA 上,
硬態硬碟 SSD 等類型的硬碟有一定的寫入次數限制,
因此我在裝 Linux 時,把一些做 "寫入" 動作高的目錄,
且無需儲存資料的分割區放到 RAM 裡面跑。



一、哪些目錄可以掛載到 tmpfs 中?

本筆者將「暫存用」的區塊掛載到 tmpfs,主要如下:
/tmp
/var/spool
/var/tmp
/var/lib/apt/lists
/var/cache/apt/archives

還有常用的瀏灠器 Chrome、Iceweasel (Firefox) ,
也常常做暫存寫入的動作,
若把它們都移到 tmpfs ,
則理論上可以延長 SSD 或 m-SATA 的壽命。

二、規劃分割區

本筆者使用的硬體規格如下:
Laptop : Acer v3-772g
RAM : 20 GB
m-SATA : 120 GB
HDD (7200 rpm) : 750 GB
HDD2 (5400 rpm) : 1 TB

依我所使用的需求來規劃,設計如下:
黃色區塊為 Linux Debian
白色區塊為 Windows 8.1
灰色區塊為兩系統共用的資料區

三、設定 /etc/fstab

sudo vi /etc/fstab
tmpfs   /tmp                    tmpfs   size=10G,noatime,mode=1777       0 0
tmpfs   /var/spool              tmpfs   size=10G,noatime,mode=1777       0 0
tmpfs   /var/tmp                tmpfs   size=10G,noatime,mode=1777       0 0
tmpfs   /var/lib/apt/lists      tmpfs   size=10G,noatime,mode=1777       0 0
tmpfs   /var/cache/apt/archives tmpfs   size=10G,noatime,mode=1777       0 0

記得測試及檢查,否則下次開機可能會有問題!
mount -a
mount
df -h

四、設定 Iceweasel

1. 開啟 iceweasel 瀏灠器
2. 於網址列輸入:about:config
3. 點擊滑鼠右鍵、new
4. String : browser.cache.disk.parent_directory
5. Value : /tmp

五、設定 Google-Chrom

1. 以下面指令來開 Chrom ,可以用 alias 加到 .bashrc

/opt/google/chrome/google-chrome --disk-cache-dir="/tmp"

2. 修改開啟設定檔

vi /usr/share/applications/google-chrome.deskto

Change
Exec=/usr/bin/google-chrome-stable %U

to
#Exec=/usr/bin/google-chrome-stable %U
Exec=/opt/google/chrome/google-chrome --disk-cache-dir="/tmp" %U

六、接著到家目錄下設定:

cd ~.cache
rm -rf google-chrome mozilla
ln -s /tmp/ google-chrome
ln -s /tmp mozilla








Reference:
http://blog.longwin.com.tw/2011/01/linux-firefox-chrome-ram-2011/

http://allisonxu.pixnet.net/blog/post/22698958-ubuntu-8.10---eeebuntu-2.0--%E8%A8%93%E7%B7%B4%E6%88%91%E7%9A%84%E6%80%AA%E5%92%96%E5%B0%8F%E7%99%BD(eeepc-7

http://blog.longwin.com.tw/2006/01/ram_disk_build_method/

http://linux-wiki.cn/wiki/zh-tw/SSD_(%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98)

http://yblog.org/archive/index.php/11734

2014年12月18日 星期四

Easy2Boot 多系統 USB 重灌碟製作

Easy2Boot 是一套可以製作多系統 USB 安裝碟的工具,
最重要的是可以直接載入多個 .iso 映像檔,來做開機碟。

官網:http://www.easy2boot.com/


接下來進入正式筆記教學,
下面的各個軟體都是網路開放的免軟體,
可以直接 Google 搜尋下載,
同時本站的雲端也有備份,也可以直接從本站下載。

一、目標
以本作者所使用的為例,我希望如下系統整合開機碟:
  • Windows 7 整合版 9 in 1 容量約 4.18 GB
  • Windows 8.1 容量約 3.60 GB
  • Debian-7.7.0_amd64 容量約 635  MB
  • Ubuntu-12.04.04_amd64 容量約 733  MB
  • CentOS-7.0_amd64 容量約 3.86  GB
  • 及其它小工具…
總計需要容量:至少約 13 GB

二、準備東西


三、執行軟體 RMPrepUSB

依軟體步驟來格式化隨身碟為 NTFS 或 FAT32 ,
本文使用 NTFS 為了可以裝大於 4 GB 的 ISO 檔,
按照軟體內步驟 1 - 6 即可。(後面選項全選 yes)


四、安裝 Grup4dos 於 MBR (後面選項全選 yes)



五、解壓 Easy2Boot

請先暫時關閉防毒軟體,避免 easy2boot 的檔案被誤判為電腦病毒,
接著直接將 Easy2Boot_v1.61.zip 解壓縮到 USB 目錄下:



六、植入 ISO 檔

依檔案分類,直接複製、貼上至 USB 內的 _ISO 目錄下:

_ISO\WINDOWS\WIN7\Windows7_9in1.iso
_ISO\WINDOWS\WIN8\Windows_8.1.iso
_ISO\LINUX\CentOS-7.0_amd64.iso
_ISO\LINUX\Debian-7.7.0_amd64.iso
_ISO\LINUX\Ubuntu-12.04.4_amd64.iso













Referencd:

Start Menu 8 修改 Win8 開始功能表為 Win7 樣式


此軟體可以使 Windows 8.1 的「開始功能表」的樣式,
改為之前 Windows 7 的樣式。

iobit 官方下載點
本站雲端下載點


操作設定相當簡單,
1. 開始按鈕圖示:可以改變桌面左下角「開始功能表」的圖示。
2. 樣式:選 Windows -> 平面樣式,即可回到 Win 7 下的那種感覺。
3. 其他設定依照個人需求、喜好。










Reference:
http://www.iobit.com/iobitstartmenu8.php
http://briian.com/9906/start-menu-8.html

2014年12月16日 星期二

U-Boot 指令及建立 uEnv.txt


一、U-Boot 指令介紹

接續前一章節 Rootfs 植入 sdcard.img 開機 ,
當我們進入 U-Boot# 後 ,有以下幾個常用的指令介紹:

0. help

指令總覽

1. mmc

跟 SD/MMC 有關的指令及輸出。

下面 mmc list 可以印出,
目前裝置所接有的 SD Card 代號為 mmc 0
U-Boot# mmc list
OMAP SD/MMC: 0

下面 mmc part 可以印出,
mmc 0 這裝置之磁區分割 (Partition)
U-Boot# mmc part
Partition Map for MMC device 0  --   Partition Type: DOS

Part Start Sector Num Sectors UUID  Type
  1 2048       163840     925db895-01 0b Boot
  2 165888     1931264    925db895-02 83

下面 mmc info 可以看到目前 sd card 相關資訊。
U-Boot# mmc info
Device: OMAP SD/MMC
Manufacturer ID: aa
OEM: 5859
Name: QEMU! 
Tran Speed: 25000000
Rd Block Len: 512
SD version 1.0
High Capacity: No
Capacity: 1 GiB
Bus Width: 4-bit


2. bdinfo

查看嵌入式版子資訊,
其中比較需要注意的是第五行 -> start    = 0x80000000,
這跟我們載入開機的記憶體位址有關。
U-Boot# bdinfo
arch_number = 0x0000060A
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x08000000
DRAM bank   = 0x00000001
-> start    = 0x88000000
-> size     = 0x08000000
eth0name    = usb_ether
ethaddr     = (not set)
current eth = usb_ether
ip_addr     = 
baudrate    = 115200 bps
TLB addr    = 0x8FFF0000
relocaddr   = 0x8FF4C000
reloc off   = 0x0FE4C000
irq_sp      = 0x8EF2BEE0
sp start    = 0x8EF2BED0

3. ls

查看 SD Card 內容之檔案目錄。

其中 mmc 0:1 是指 sdcard.img1:
U-Boot# ls mmc 0:1
  1852516   u-boot 
   392152   u-boot.bin 
    51100   mlo 
   392216   u-boot.img 
  2533720   uimage 

5 file(s), 0 dir(s)

其中 mmc 0:2 是指 sdcard.img2:
U-Boot# ls mmc 0:2
       4096 .
       4096 ..
      16384 lost+found
       4096 bin
       4096 boot
       4096 dev
       4096 etc
       4096 home
       4096 lib
       4096 media
       4096 mnt
       4096 opt
       4096 proc
       4096 root
       4096 run
       4096 sbin
       4096 selinux
       4096 srv
       4096 sys
       4096 tmp
       4096 usr
       4096 var

4. reset

重新啟動 U-Boot

5. printenv

印出 u-boot environment 設定檔。


二、建立 uEnv.txt


0. 進入 U-Boot#

參考前一章 Rootfs 植入 sdcard.img 開機 ,
最後面用 runsdcard.sh 進到 U-boot 內。
runsdcard.sh 內容如下:
qemu-system-arm -M beagle -m 512 -nographic -sd sdcard.img

1. printenv -> uEnv.txt

於 U-Boot# 內使用指令 printenv 將全部內容複製,
並貼上建立一個 uEnv.txt ,其原始內容如下:
arch=arm
baudrate=115200
beaglerev=C4
board=beagle
board_name=beagle
bootargs=console=ttyO2,115200n8 mpurate=auto buddy=none camera=none vram=12M omapfb.mode=dvi:640x480MR-16@60 omapdss.def_disp=dvi root=ubi0:rootfs ubi.mtd=4 rootfstype=ubifs
bootcmd=run findfdt; mmc dev ${mmcdev}; if mmc rescan; then if run userbutton; then setenv bootenv uEnv.txt;else setenv bootenv user.txt;fi;echo SD/MMC found on device ${mmcdev};if run loadbootenv; then echo Loaded environment from ${bootenv};run importbootenv;fi;if test -n $uenvcmd; then echo Running uenvcmd ...;run uenvcmd;fi;if run loadimage; then run mmcboot;fi;fi;run nandboot;setenv bootfile uImage;if run loadimage; then run loadfdt;run mmcbootz; fi;
bootdelay=1
bootdir=/
bootenv=uEnv.txt
bootfile=uImage
bootpart=0:1
buddy=none
camera=none
console=ttyO2,115200n8
cpu=armv7
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
ethact=usb_ether
fdt_high=0xffffffff
fdtaddr=0x80f80000
fdtfile=omap3-beagle.dtb
findfdt=if test $beaglerev = AxBx; then setenv fdtfile omap3-beagle.dtb; fi; if test $beaglerev = Cx; then setenv fdtfile omap3-beagle.dtb; fi; if test $beaglerev = C4; then setenv fdtfile omap3-beagle.dtb; fi; if test $beaglerev = xMAB; then setenv fdtfile omap3-beagle-xm-ab.dtb; fi; if test $beaglerev = xMC; then setenv fdtfile omap3-beagle-xm.dtb; fi; if test $fdtfile = undefined; then echo WARNING: Could not determine device tree to use; fi;
importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize
loadaddr=0x80000000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadfdt=run validatefdt; load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
loadimage=load mmc ${bootpart} ${loadaddr} ${bootdir}/${bootfile}
loadramdisk=load mmc ${bootpart} ${rdaddr} ${bootdir}/${ramdisk}
mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
mmcbootz=echo Booting with DT from mmc${mmcdev} ...; run mmcargs; bootz ${loadaddr} - ${fdtaddr}
mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext4 rootwait
mpurate=auto
nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}
ramboot=echo Booting from ramdisk ...; run ramargs; bootm ${loadaddr}
ramdisk=ramdisk.gz
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
soc=omap3
stderr=serial
stdin=serial
stdout=serial
usbtty=cdc_acm
userbutton=if gpio input 173; then run userbutton_xm; else run userbutton_nonxm; fi;
userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;
validatefdt=if test $beaglerev = xMAB; then if test ! -e mmc ${bootpart} ${bootdir}/${fdtfile}; then setenv fdtfile omap3-beagle-xm.dtb; fi; fi;
vendor=ti
ver=U-Boot 2014.07 (Oct 14 2014 - 12:06:49)
vram=12M

2. 整理語法

先將 uEnv.txt 備份為 uEnv.txt.sh ,
並對其內容做語法整理,方便我們了解它寫的內容,
我的整理如下:
arch=arm
baudrate=115200
beaglerev=C4
board=beagle
board_name=beagle

bootargs=console=ttyO2,115200n8
         mpurate=auto
         buddy=none
         camera=none
         vram=12M
         omapfb.mode=dvi:640x480MR-16@60
         omapdss.def_disp=dvi
         root=ubi0:rootfs
         ubi.mtd=4
         rootfstype=ubifs

bootcmd=run findfdt;
        mmc dev ${mmcdev};
        if mmc rescan;  then
                if run userbutton; then
                        setenv bootenv uEnv.txt;
                else
                        setenv bootenv user.txt;
                fi;
                echo SD/MMC found on device ${mmcdev};
                if run loadbootenv; then
                        echo Loaded environment from ${bootenv};
                        run importbootenv;
                fi;
                if test -n $uenvcmd; then
                        echo Running uenvcmd ...;
                        run uenvcmd;
                fi;
                if run loadimage; then
                        run mmcboot;
                fi;
        fi;
        run nandboot;
        setenv bootfile uImage;
        if run loadimage; then
                run loadfdt;
                run mmcbootz;
        fi;

bootdelay=1
bootdir=/
bootenv=uEnv.txt
bootfile=uImage
bootpart=0:1
buddy=none
camera=none
console=ttyO2,115200n8
cpu=armv7
defaultdisplay=dvi
dieid#=51454d5551454d555400000051454d55
dvimode=640x480MR-16@60
ethact=usb_ether
fdt_high=0xffffffff
fdtaddr=0x80f80000
fdtfile=omap3-beagle.dtb

findfdt=if test $beaglerev = AxBx; then
                setenv fdtfile omap3-beagle.dtb;
        fi;
        if test $beaglerev = Cx; then
                setenv fdtfile omap3-beagle.dtb;
        fi;
        if test $beaglerev = C4; then
                setenv fdtfile omap3-beagle.dtb;
        fi;
        if test $beaglerev = xMAB; then
                setenv fdtfile omap3-beagle-xm-ab.dtb;
        fi;
        if test $beaglerev = xMC; then
                setenv fdtfile omap3-beagle-xm.dtb;
        fi;
        if test $fdtfile = undefined; then
                echo WARNING: Could not determine device tree to use;
        fi;

importbootenv=echo Importing environment from mmc ...;
              env import -t $loadaddr $filesize

loadaddr=0x80000000
loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}
loadfdt=run validatefdt; load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
loadimage=load mmc ${bootpart} ${loadaddr} ${bootdir}/${bootfile}
loadramdisk=load mmc ${bootpart} ${rdaddr} ${bootdir}/${ramdisk}

mmcargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${mmcroot} rootfstype=${mmcrootfstype}

mmcboot=echo Booting from mmc ...;
run mmcargs;
bootm ${loadaddr}

mmcbootz=echo Booting with DT from mmc${mmcdev} ...;
         run mmcargs;
         bootz ${loadaddr} - ${fdtaddr}

mmcdev=0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext4 rootwait
mpurate=auto

nandargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} camera=${camera} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${nandroot} rootfstype=${nandrootfstype}

nandboot=echo Booting from nand ...;
         run nandargs;
         nand read ${loadaddr} 280000 400000;
         bootm ${loadaddr}

nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs

ramargs=setenv bootargs console=${console} ${optargs} mpurate=${mpurate} buddy=${buddy} vram=${vram} omapfb.mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} root=${ramroot} rootfstype=${ramrootfstype}

ramboot=echo Booting from ramdisk ...;
        run ramargs;
        bootm ${loadaddr}
ramdisk=ramdisk.gz
ramroot=/dev/ram0 rw ramdisk_size=65536 initrd=0x81000000,64M
ramrootfstype=ext2
rdaddr=0x81000000
soc=omap3
stderr=serial
stdin=serial
stdout=serial
usbtty=cdc_acm

userbutton=if gpio input 173; then
                run userbutton_xm;
           else
                run userbutton_nonxm;
           fi;

userbutton_nonxm=gpio input 7;
userbutton_xm=gpio input 4;

validatefdt=if test $beaglerev = xMAB; then
                if test ! -e mmc ${bootpart} ${bootdir}/${fdtfile}; then
                        setenv fdtfile omap3-beagle-xm.dtb;
                fi;
            fi;

vendor=ti
ver=U-Boot 2014.07 (Oct 14 2014 - 12:06:49)
vram=12M

3. 修改 uEnv.txt內容

我們看的是 uEnv.txt.sh ,
真正最後要載入 sdcard.img 的是 uEnv.txt ,
所以邊看 .sh 那份做修改,同時也要改 uEnv.txt,
兩者同步進行,改的主要項目為:

  • zImage -> uImage
  • loadaddr=0x80200000 -> loadaddr=0x80000000
  • bootpart=0:2 -> bootpart=0:1
  • mmcrootfstype=ext3 -> mmcrootfstype=ext4
  • bootdir=/boot -> bootdir=/

4. 植入 uEnv.txt -> sdcard1

將修變好的 uEnv.txt 植入到 sdcard partition 1 內。
mount -o loop,offset=$[512*2048] sdcard.img /mnt
rsync-av ~/qrmu_img/bootloader/uEnv.txt /mnt

5. 執行 runsdcard.sh

sh runsdcard.sh

執行結果,若正確的話,
應該要自動且快速通過 U-boot ,並直接載入 kernel ,
做正確的開機程序。











Reference:
http://pominglee.blogspot.tw/2013/12/uboot.html

http://pominglee.blogspot.tw/2014/12/uboot.html

2014年12月9日 星期二

Rootfs 植入 sdcard.img 開機


一、將 rootfs 植入到 sdcard.img

0. 準備材料

參考前面文章 建立虛擬 SD Card
sdcard1 要有以下檔案:
MLOu-bootu-boot.binu-boot.imguImage

參考文章 建立 Rootfs
sdcard2 要有 rootfs

1. 先做備份

cp sdcard.img sdcard.img.bak

2. 做連接 + 掛載

前面幾個章節有學到兩個做 offset 的方法:

方法一:

su
losetup /dev/loop0 sdcard.img
losetup -o $[512*2048] /dev/loop1 /dev/loop0
losetup -o $[512*165888] /dev/loop2 /dev/loop0
mkdir /mnt/sdcard1
mkdir /mnt/sdcard2

mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2

方法二:

mkdir /mnt/sdcard1
mkdir /mnt/sdcard2
mount -o loop,offset=$[512*2048] sdcard.img /mnt/sdcard1
mount -o loop,offset=$[512*165888] sdcard.img /mnt/sdcard2

3. 設定 Rootfs 設定檔

參考前面章節 建立 Rootfs 其中的「四、設定 Rootfs」,
修改幾個檔案…
~/qemu_img/rootfs/etc/fstab
~/qemu_img/rootfs/etc/inittab
~/qemu_img/rootfs/etc/network/interfaces
~/qemu_img/rootfs/etc/resolv.conf
~/qemu_img/rootfs/etc/hostname

等 rootfs 完全整理好了,再一次全部 copy 到 /mnt/sdcard2 下。
rsync -av ~/qemu_img/rootfs/* /mnt/sdcard2

4. 做 sdcard 開機用 shell script

vi runsdcard.sh
qemu-system-arm -M beagle -m 512 -nographic -sd sdcard.img

5. 進入 U-Boot 開機進 ARM-Linux

run mmcargs
fatload mmc 0:1 0x80000000 uImage
bootm 0x80000000









2014年12月2日 星期二

一次建立20個使用者帳號

利用 Bash / Shell Script 來一次完成建置 20 個使用者帳號,
且要給每個使用者加入不同的登入密碼,
並且強制要求第一次登入後,要修改使用者密碼。

設定群組:s100
建立帳號:s100a000 ~ s100a020
設置密碼:`date +%N` 來產生亂數

vi buildAccount.sh
# !/bin/bash
# 2014/12/02    Author:Kai-Lin Liao
# Create 20 user
# account:   s100a000 ~ s100a020,
# usergroup: s100

# Setting Parameter
GROUP=s100
USER_HEAD=s100a0

# Check root
if [ `whoami` != "root" ]
then
        echo "===== Permision Deny ====="
        echo "You need login root."
        echo
        exit 0
fi

# Create group
groupadd s100

# Create account 0~9
for i in `seq 0 9`
do
        USER_NAME=${USER_HEAD}0$i
        # Setting account password is ramdon
        PASSWD=`date +%N`
        echo "Creating User 0$i: $USER_NAME"
        echo "Set Password: $PASSWD"
        useradd -m -s /bin/bash -g $GROUP $USER_NAME
        echo $USER_NAME:$PASSWD | chpasswd
        chage -d 0 $USER_NAME
done

# Create account 10~20
for i in `seq 10 20`
do
        USER_NAME=${USER_HEAD}$i
        # Setting account password is ramdon
        PASSWD=`date +%N`
        echo "Creating User $i: $USER_NAME"
        echo "Set Password: $PASSWD"
        useradd -m -s /bin/bash -g $GROUP $USER_NAME
        echo $USER_NAME:$PASSWD | chpasswd
        chage -d 0 $USER_NAME
done



刪除剛剛建的群組:s100,及使用者s100a000 ~ s100a020

vi deleteAccount.sh
# !/bin/bash
# 2014/12/02    Author:Kai-Lin Liao
# Delete 20 user 
# account:   s100a000 ~ s100a020,

# Setting Parameter
GROUP=s100
USER_HEAD=s100a0

# Check root
if [ `whoami` != "root" ]
then
        echo "===== Permision Deny ====="
        echo "You need login root."
        echo
        exit 0
fi


# Create account 0~9
for i in `seq 0 9`
do
        USER_NAME=${USER_HEAD}0$i
        echo "Delete User 0$i: $USER_NAME"
        userdel -r $USER_NAME
done

# Create account 10~20
for i in `seq 10 20`
do
        USER_NAME=${USER_HEAD}$i
        echo "Delete User $i: $USER_NAME"
        userdel -r $USER_NAME
done

# Delete group
groupdel $GROUP

建立橋接網路 br10


0. 整體架構圖
我們要將網路規劃為下圖,
由網際網路(Internet) 連到實體機網卡(eth0),
從實體機網卡(eth0) 建立一個橋接網路(br10),
最後將橋接網路連接到 QEMU 虛擬機( 設 192.168.10.20 ),
並在虛擬機上面建個 Web Server !

其中,從實體機到虛擬機可以互相 ping ,
且實體機開瀏灠器可以連到虛擬機架的 Web Server。

1. 使用 runarm.sh 開啟虛擬機
參考文章 用 QEMU 來開機 arm.img
vi runarm.sh
# !/bin/bash
#
# Run arm.img

qemu-system-arm -M versatilepb -m 512 \
-kernel ~qemu_image/vmlinuz-3.2.0-4-versatile \
-initrd ~qemu_image/initrd.img-3.2.0-4-versatile \
-hda ~qemu_image/arm.img \
-append "root=/dev/sda1" &

2. 安裝 Web server
於虛擬機,安機:
sudo apt-get install apache2

虛擬機關機
halt

3. 備份並修改 runarm.sh
cp runarm.sh runarm.sh.org

vi runarm.sh
qemu-system-arm -M versatilepb -m 512 \
-kernel ~qemu_image/vmlinuz-3.2.0-4-versatile \
-initrd ~qemu_image/initrd.img-3.2.0-4-versatile \
-hda ~qemu_image/arm.img \
-net nic,macaddr=" MAC Address " -net bridge,br=br10 \
-append "root=/dev/sda1" &

4. 安裝 bridge 套件
於實體機
sudo apt-get install bridge-utils uml-utilities

5. 編輯設定 br10 (以 P503 教室為例)
於實體機
vi /etc/network/interfaces

## ==== 本機端 lo ====
auto lo
iface lo inet loopback
## ==== 實體網卡 eth0 ====
allow-hotplug eth0
#iface eth0 inet dhcp
iface eth0 inet static
 address 120.117.72.XX
 netmask 255.255.255.128
 gateway 120.117.72.126
 dns-nameserver 120.117.2.1
## ==== 橋接 br10 ====
auto br10
iface br10 inet static
 address 192.168.10.1
 netmask 255.255.255.0
# 這邊 gateway 是用實體機 eth0 的 ip
 gateway 120.117.72.XX
 bridge_ports tap0
 bridge_fd 9
 bridge_hello 2
 bridge_maxage 12
 bridge_stp off

6. 重啟網卡並確認網路連線
於實體機
/etc/init.d/networking restart
brctl show
ifconfig
ping 192.168.10.1
ping 8.8.8.8

7. 設定 QEMU 設定檔
於實體機
sudo chmod u+s /usr/local/libexec/qemu-bridge-helper

sudo vi /usr/local/etc/qemu/bridge.conf
allow br10

8. 執行修改好的 runarm.sh 重啟虛擬機
於實體機
sh runarm.sh

9. 修改虛擬機網路設定
於虛擬機
vi /etc/network/interfaces
auto lo
iface lo inet loopback
## ==== 虛擬機的 eth0 ====
allow-hotplug eth0
iface eth0 inet static
 address 192.168.10.20
 netmask 255.255.255.0
# 這邊 gateway 要設實體機所建的 br10 之 ip
 gateway 192.168.10.1
# 這邊以學校為例,nameserver 要用同實體機一樣
 dns-nameserver 120.117.2.1

10. 重啟虛擬機網卡並測試
於虛擬機
/etc/init.d/networking restart

測試 br10
ping 192.168.10.1

測試實體機 eth0
ping 120.117.72.XX

啟動 Web Server
/etc/init.d/apache2 restart

11. 至實體機測試
於實體機
ping 192.168.10.20

開啟瀏灠器 -> 192.168.10.20
可以看到 「It's works!!」

12. 設定防火牆,讓虛擬機連到外網
於實體機
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A INPUT -i br10 -j ACCEPT
iptables -t net -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE


















Reference:
http://pominglee.blogspot.tw/2014/12/br10.html

2014年12月1日 星期一

如何將硬碟從GPT格式轉換成MBR

隨機預裝Win8的電腦,硬碟爲GPT格式的,如果需要安裝Win7等早期版本系統,需要轉換爲MBR格式的,使用Diskpart命令即可完成轉換。
操作步驟:
注意:轉換硬碟格式需要清空硬碟中的所有分區和數據,在操作前,請保存好硬碟中所有重要數據。

1.使用Win7光碟或者USB引導,進入系統安裝界面。
2.按Shift + F10打開命令提示符。
3.輸入”Diskpart”(不用輸入引號,下同),並按ENTER,進入操作界面
4.輸入:”list disk”,查看硬碟信息。注意看硬碟容量來選擇。
5.輸入:”select disk 0”,選擇disk 0爲當前操作的硬碟。(注意是否為系統安裝的disk,通常預設為disk 0,但也有例外,所以在執行這部前請再三做確認!)
6.輸入:”Clean”,清空當前硬碟分區。
7.輸入:”convert mbr”,轉換爲MBR分區。
8.操作完成,關閉此命令提示符窗口,繼續按照正常的方法安裝Win7系統即可。
擴展知識:convert命令的其它用法:
convert  basic     -將硬碟從動態轉換爲基本。
convert  dynamic  -將硬碟從基本轉換爲動態。
convert  gpt      -將硬碟從MBR轉換爲GPT。
convert  mbr     -將硬碟從GPT轉換爲MBR。


引用:http://home.gamer.com.tw/creationDetail.php?sn=2117049

2014年11月25日 星期二

Openshot 影像處理軟體

Openshot 主要功能為影片的剪輯、修改,
最大的強項是「穩定、快速、直覺」,
可以直接匯入影片,並且穩穩的跑出影像和聲音,
完全不用調整任何設定!

一、安裝
sudo apt-get update && apt-get install openshot

二、執行
一般 user 下,直接執行 openshot,介面如下:


三、操作

通常進來 openshot 後,第一步驟是「匯入檔案」,
接著,將影音檔拉到下方的影音軌。


可以點上面的「+ 加入影音軌」,可用於穿插字幕、聲音、動畫、其它影像…等,而按右鍵可以「移除影音軌」。

拉動紅色線,選好位置後可以「加入標記」,插入後,
可以方便做剪輯,於紅線上方點右鍵可以依紅線位置下
「全部剪輯切片」,之後可以針對需求做片段的特效,
或改部份片段影片的速度…等等。

基本上,使用都很直覺,
以非藝術工作專業的使用者來說已經相當夠用,

最後剪輯完記得「匯出視訊」,我設定匯出 .avi 如下圖:







Reference:
http://way3sec.blogspot.tw/2010/04/openshot-video-editor.html

建立 Rootfs


一、先準備 arm.img 檔

0. 位置目錄(一般 User 權限)

cd ~/qemu_img

1. 參考 建立一個 arm.img 來建立 arm.img。


2. 做一個最原始檔案的備份

cp arm.img arm_OK.img

3. 將 QEMU 開機

參考 用 QEMU 來開機 arm.img 第 6 步驟
sh runarm.sh

二、第一階段 Rootfs 瘦身

0. 位置

用 QEMU 開啟 arm.img ,登入 Root ,在 QEMU 內瘦身。

1. ATP 更新、清除

apt-get update
apt-get clean
rm -rf /var/lib/apt/lists/*
rm -rf /var/cache/apt/pkgcache.bin
rm -rf /var/cache/apt/srcpkgcache.bin

2. 已安裝套件 (依需求選擇)

視窗環境、瀏灠器等,看有沒有需求,
也可以選擇移除還是留著:
apt-get remove xorg iceweasel

3. 關機 QEMU


三、第二階段 Rootfs 瘦身

0. 位置 (一般 user)

cd ~/qemu_img

1. 做備份紀錄

這邊備份的檔名,以今天日期 arm_1125.img 來做備份。
qemu-img -O raw arm.img arm_1125.img

2. 掛載 arm.img

可以參考 建立虛擬 SD Card 的 loset、mount 步驟,
下面是用較快速的方法來掛載,概念一樣 (要做 offset )。
mount -o loop, offset=`expr 512 \* 2048` arm.img /mnt

3. 建立裝 Rootfs 的資料夾

mkdir ~/qemu_img/rootfs

4. 複製 (ROOT)

將 arm.img 內的檔案複製到 rootfs
rsync -av /mnt/* ~/qemu_img/rootfs/

5. 開始檔案瘦身,刪除不必要的檔案(ROOT)

切記,此步驟在 root 權限下,要非常小心,
注意目錄位置,不要刪錯檔案了!

下面幾個,可以直接刪除:
rm -rf ~/qemu_img/rootfs/root/.cache
rm -rf ~/qemu_img/rootfs/root/.mozilla
rm -rf ~/qemu_img/rootfs/usr/share/man/*
rm -rf ~/qemu_img/rootfs/usr/share/doc/*
rm -rf ~/qemu_img/rootfs/boot/*
rm -rf ~/qemu_img/rootfs/dev/.udev
rm -rf ~/qemu_img/rootfs/var/log/*

這邊有兩個資料夾,要刪除語系資料,
只留我們需要的:

~/qemu_img/rootfs/usr/share/locale/
我們留 en_US、zh_TW,其它殺掉,
可以使用 rm 或 mc 指令來留、刪。

~/qemu_img/rootfs/usr/share/i18n/locale/
這邊留 C、POSIX、en_US、zh_TW,其它殺掉,
一樣可以使用 rm 或 mc 指令來留、刪。

接下來是核心 modules ,一樣刪除,接著
參考文章 編譯 ARM Linux 核心,第七步驟,
把我們做好的模組複製進來該目錄:
rm -rf ~/qemu_img/rootfs/lib/modules/3.2.0-4-versatib
rsync -av ~/qemu_img/kernel/modules/lib/3.4.100 ~/qemu_img/rootfs/lib/modules/

全部瘦身完後,可以在目錄下,
用指令來查看各個目錄中容量較大的東西有哪幾項:
du -sh * | grep M

~/qemu_img/rootfs 目錄,輸出如下:
5.9M  bin
4.7M  boot
4.4M etc
42M lib
5.1M sbin
354M  usr
37M  var

~/qemu_img/rootfs/usr 目錄,輸出如下:
36M bin
192M lib
4.3M sbin
122M share

6. 卸載 arm.img

先看一下 /mnt 有沒有在使用中,卸載需要離開該目錄。
lsof /mnt

卸載
umount /mnt

解除連接(注意順序 大 -> 小)
losetup -a
losetup -d /dev/loop1
losetup -d /dev/loop0
losetup -a

四、設定 Rootfs

1. ~/qemu_img/rootfs/etc/fstab

改成我們需要的設定:
proc            /proc        proc    defaults           0   0
/dev/mmcblk0p2   /           auto   errors=remount-ro   0   1
/dev/mmcblk0p1   /boot       auto   defaults            0   0

2. ~/qemu_img/rootfs/etc/inittab

最後一行加上:
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102

3. ~/qemu_img/rootfs/etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

4. ~/qemu_img/rootfs/etc/resolv.conf

nameserver 8.8.8.8

5. ~/qemu_img/rootfs/etc/hostname

隨便自訂 (例如 leenix)

五、放到 sdcard.img 中

參考 建立虛擬 SD Card 的掛載方式,
將 Rootfs 放至到 sdcard.img 第二分割區。

sdcard1 -> 第 1 個分割區,FAT 16/32 格式,有打開開機旗標,
內含檔案:
-rwxr-xr-x 1 root root   45128 2012-10-30 22:19 MLO
-rwxr-xr-x 1 root root 1215711 2012-10-30 22:19 u-boot
-rwxr-xr-x 1 root root  294672 2012-10-30 22:19 u-boot.bin
-rwxr-xr-x 1 root root  294736 2012-10-30 22:19 u-boot.img
-rwxr-xr-x 1 root root       1 2012-10-30 23:29 uEnv.txt
-rwxr-xr-x 1 root root 2475616 2012-10-30 22:15 uImage

sdcard2 -> 第 2 個分割區,ext4 格式,內含 rootfs 的檔案。





Reference:
http://pominglee.blogspot.tw/2012/10/rootfs.html

http://pominglee.blogspot.tw/2012/11/rootfs.html

2014年11月22日 星期六

gtk-recordmydesktop 錄影工具

一、安裝

apt-get install gtk-recordmydesktop recordmydesktop ffmpeg

二、操作

1. 開啟軟體

gtk-recordmydesktop

2. 出現操作介面,如圖


3. 按紅點,開始錄影錄音…


4. 完成錄影

Ctrl + Alt + S

5. 輸出到家目錄或指定目錄


6. 轉檔 .ogv -> .avi

ffmpeg -i out.ogv -vcodec mpeg4 -sameq -acodec libmp3lame out.avi

三、其他

1. 錄音

可以安裝 gnome-alsamixer ,
用來調整 Mic 的音量設定,

我的 Mic 是插主機後方,設定如下圖:

2. 播放

可以使用 mplayer 播 .ogv 格式之影片檔。

3.整理 Shell Script 快速轉檔

vi toAVI.sh
# !/bin/bash
# .ogv to .avi

if [ -z $1 ] || [ -z $1 ] ;then
        echo
        echo ====== Usage =========
        echo "toAVI.sh [input.ogv] [output.avi]" 
        exit 0
fi

ffmpeg -i $1 -vcodec mpeg4 -sameq -acodec libmp3lame $2








Reference:
http://blog.longwin.com.tw/2009/04/linux-record-recordmydesktop-2009/

http://www.cyberciti.biz/faq/linux-unix-bsd-appleosx-convert-ogv-to-avi-video-audio/

2014年11月4日 星期二

u-boot 編譯

~/qemu_image/bootloader -> 放置 u-boot

一、安裝 toolchain

參考前面文章 安裝 ARM toolchain

二、下載 u-boot


本文下載最新版 u-boot-latest.bz2 (u-boot-2014-07)

mkdir -p ~/qemu_image/bootloader
cd ~/qemu_image/bootloader
wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.bz2
tar xfva  u-boot-latest.bz2

會得到目前最新版 u-boot-2014.10 。

三、查看設定參數

先設我們要用板子是 Beagle Board…
cd ~/qemu_image/bootloader/u-boot-2014.10/
vi boards.cfg

內容如下(可以得知參數為 omap3_beagle ):
omap3_beagle                 arm         armv7       beagle              ti             omap3

下指令設定參數 config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap3_beagle_config

設定完成會出現:
Configuring for omap3_beagle board...

四、編譯 u-boot

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all -j ${core number}

編完會出現四個檔案:
MLO
u-boot
u-boot.bin
u-boot.img

五、測試 u-boot 開機

cat MLO u-boot u-boot.bin u-boot.img > sd.img
qemu-system-arm -M beagle -nographic -sd sd.img

結果會因為沒核心,而當機,如下輸出:
U-Boot SPL 2012.07 (Oct 04 2012 - 11:43:34)
Texas Instruments Revision detection unimplemented
OMAP SD/MMC: 0
mmc_init_stream: timedout waiting for cc!
spl: mmc init failed: err - -19
### ERROR ### Please RESET the board ###


離開 QEMU 方法:
先按 Ctrl + A
放開 Ctrl + A
再單按 X 鍵

Debug
開虛擬機出現下面訊息:
qemu: hardware error: no boot device found
CPU #0:
R00=00000000 R01=00000000 R02=00000000 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=400140a4
PSR=400001d3 -Z-- A svc32
s00=00000000 s01=00000000 d00=0000000000000000
s02=00000000 s03=00000000 d01=0000000000000000
s04=00000000 s05=00000000 d02=0000000000000000
s06=00000000 s07=00000000 d03=0000000000000000
s08=00000000 s09=00000000 d04=0000000000000000
s10=00000000 s11=00000000 d05=0000000000000000
s12=00000000 s13=00000000 d06=0000000000000000
s14=00000000 s15=00000000 d07=0000000000000000
s16=00000000 s17=00000000 d08=0000000000000000
s18=00000000 s19=00000000 d09=0000000000000000
s20=00000000 s21=00000000 d10=0000000000000000
s22=00000000 s23=00000000 d11=0000000000000000
s24=00000000 s25=00000000 d12=0000000000000000
s26=00000000 s27=00000000 d13=0000000000000000
s28=00000000 s29=00000000 d14=0000000000000000
s30=00000000 s31=00000000 d15=0000000000000000
s32=00000000 s33=00000000 d16=0000000000000000
s34=00000000 s35=00000000 d17=0000000000000000
s36=00000000 s37=00000000 d18=0000000000000000
s38=00000000 s39=00000000 d19=0000000000000000
s40=00000000 s41=00000000 d20=0000000000000000
s42=00000000 s43=00000000 d21=0000000000000000
s44=00000000 s45=00000000 d22=0000000000000000
s46=00000000 s47=00000000 d23=0000000000000000
s48=00000000 s49=00000000 d24=0000000000000000
s50=00000000 s51=00000000 d25=0000000000000000
s52=00000000 s53=00000000 d26=0000000000000000
s54=00000000 s55=00000000 d27=0000000000000000
s56=00000000 s57=00000000 d28=0000000000000000
s58=00000000 s59=00000000 d29=0000000000000000
s60=00000000 s61=00000000 d30=0000000000000000
s62=00000000 s63=00000000 d31=0000000000000000
FPSCR: 00000000
已經終

解決:
fdisk sd.img
a
1
w

將開機選項 * 加到 sd.img 第一分割區。






Reference:

安裝 ARM toolchain

官網 Embedded Debian Linux

一、加入 ARM Toolchain 鏡像站位置

sudo vi /etc/apt/sources.list

加入鏡像站 (squeeze)
deb http://www.emdebian.org/debian/ squeeze main

如果上面的鏡像站掛了,可以試試下面的鏡像站 (2014/12/02 更新,來源在此)
deb http://emdebian.bytesatwork.ch/mirror/toolchains squeeze main

二、更新及安裝

1. 先更新套件

sudo apt-get update

要有看到更新到 http://www.emdebian.org squeeze/main .......... 的東東。

#########################################################################
Debug 1:
W: GPG error: http://www.emdebian.org wheezy Release: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY B5B7720097BB3B58

解決 1:
apt-get install emdebian-archive-keyring
#########################################################################

2. 安裝 toolchain

sudo apt-get install gcc-4.4-arm-linux-gnueabi cpp-4.4-arm-linux-gnueabi g++-4.4-arm-linux-gnueabi

#########################################################################
Debug 2:
以 apt 安裝 toolchaain 出現錯誤訊息:

有些套件無法安裝。這可能意謂著您的要求難以解決,或是若您使用的是
unstable 發行版,可能有些必要的套件尚未建立,或是被移出 Incoming 了。
以下的資訊或許有助於解決當前的情況:

下列的套件有未滿足的相依關係:
 cpp-4.4-arm-linux-gnueabi : 相依關係: libgmp3c2 但它卻無法安裝
 g++-4.4-arm-linux-gnueabi : 相依關係: libgmp3c2 但它卻無法安裝
E: 無法修正問題,您保留 (hold) 了損毀的套件。

Sol 2:
Debian 官方下載 libgmp3c2_4.3.2 ,接著:
sudo dpkg -i libgmp3c2_4.3.2+dfsg-1_amd64.deb
#########################################################################

三、做 sub-link

sudo ln -s /usr/bin/arm-linux-gnueabi-gcc-4.4 /usr/bin/arm-linux-gnueabi-gcc
sudo ln -s /usr/bin/arm-linux-gnueabi-g++-4.4 /usr/bin/arm-linux-gnueabi-g++
sudo ln -s /usr/bin/arm-linux-gnueabi-cpp-4.4 /usr/bin/arm-linux-gnueabi-cpp


四、測試及驗證

1. 先看一般 x86_64 的 gcc 版本:

gcc -v

其輸出:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-5)

2. 接著看 ARM 版 gcc 版本:

arm-linux-gnueabi-gcc -v

其輸出:
Using built-in specs.
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.4.5 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-sjlj-exceptions --enable-checking=release --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=arm-linux-gnueabi --with-headers=/usr/arm-linux-gnueabi/include --with-libs=/usr/arm-linux-gnueabi/lib
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8)

五、編寫程式測試

1. 寫一個 hello.c

vi hello.c
#include 
main(){
printf("Hello, World\n");
}


2. 編譯(x86_64):

gcc hello.c -o hello
file hello

輸出:
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x320c1bcd829c0a6407a0331f5243f03110656ee8, not stripped

可能在 x86_64 的機器下直接執行:
./hello

輸出:
Hello, World

3. 編譯(arm):

arm-linux-gnueabi-gcc hello.c -o hello_arm
file hello_arm

輸出:
hello_arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=0x629d4407541731dc7c773ccd05d5bcb4811fa0e9, not stripped

只能在 ARM 的機器下才可以執行。


六、安裝 Jessie 版 ARM Toolchains

參考官方的方法:https://wiki.debian.org/CrossToolchains

1. 加入鏡像站到 /etc/apt/sources.list

deb http://emdebian.org/tools/debian/ jessie main

2.安裝 archive key

curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | sudo apt-key add -

3. 更新並安裝套件

sudo dpkg --add-architecture armhf 
sudo apt-get update 
sudo apt-get install crossbuild-essential-armhf








編譯 ARM Linux 核心


~/qemu_image/ -> 放置 ARM image 之目錄
~/qemu_image/kernel/ -> 放置 ARM Linux 核心編譯目錄
~/qemu_image/kernel/modules -> 放置 ARM Linux 核心模組目錄

一、先確定使用的 ARM Board

在這邊假設我們要使用 Beagle Board ,去官方找硬體 Datasheet ,可以知道其 CPU 為 OMAP 3530(Cortex A8) ,其它資訊可參考:
Beagle Board 官方網站 (http://beagleboard.org/)
OMAP 3530(Cortex A8) 德洲儀器官網 (http://www.ti.com/product/omap3530?247SEM)

二、查看 QEMU 支援

qemu-system-arm -cpu ?

我們看有沒有支援 (Cortex A8) ,指令輸出如下:
Available CPUs:
  arm1026
  arm1136
  arm1136-r2
  arm1176
  arm11mpcore
  arm926
  arm946
  cortex-a15
  cortex-a8
  cortex-a8-r2
  cortex-a9
  cortex-m3
  pxa250
  pxa255
  pxa260
  pxa261
  pxa262
  pxa270-a0
  pxa270-a1
  pxa270
  pxa270-b0
  pxa270-b1
  pxa270-c0
  pxa270-c5
  sa1100
  sa1110
  ti925t

三、下載 ARM Linux Kernel

twaren 載點(version 3.X): http://ftp.twaren.net/Unix/Kernel/linux/kernel/v3.x/

先假設我們選用 linux-3.4.100.tar.xz

cd ~/qemu_image/kernel/
wget http://ftp.twaren.net/Unix/Kernel/linux/kernel/v3.x/linux-3.4.100.tar.xz
tar xfva linux-3.4.100.tar.xz
cd linux-3.4.100/

四、基本參數設定(一般 User)

注意所在目錄位置: ~/qemu_image/kernel/linux-3.4.100/
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- omap2plus_defconfig

輸出:
#
# configuration written to .config
#

五、細部設定 Menuconfig

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
我的設定如下:
General setup  ---> Kernel compression mode (...)  ---> XZ
System Type  ---> ARM system type (...)  ---> TI OMAP
System Type  ---> TI OMAP2/3/4 Specific Features  ---> [*] OMAP3 BEAGLE board
System Type  ---> TI OMAP2/3/4 Specific Features  ---> [*] DEVKIT8000 board
File systems  ---> <*> The Extended 4 (ext4) filesystem

########################################################
Debug 1:
當 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig 
出現:
*** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 ***
 *** Install ncurses (ncurses-devel) and try again.
 ***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error

解決 1
sudo apt-get install libncurses5-dev
########################################################

六、編譯核心 uImage

time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j {core number}

########################################################
Debug 2:
若執行編譯指令,出現:
/bin/sh: 1: arm-linux-gnueabi-gcc: not found
make[2]: *** [scripts/mod/empty.o] Error 127
make[1]: *** [scripts/mod] Error 2
make[1]: *** Waiting for unfinished jobs....

解決 2:
ls -l /usr/bin/arm-linux-gnueabi-*
查看所裝的 g++, gcc, cpp 之版本,例如我的如下:
arm-linux-gnueabi-gcc-4.4
arm-linux-gnueabi-g++-4.4
arm-linux-gnueabi-cpp-4.4

接下來做 sub-link
sudo ln -s /usr/bin/arm-linux-gnueabi-gcc-4.4 /usr/bin/arm-linux-gnueabi-gcc
sudo ln -s /usr/bin/arm-linux-gnueabi-g++-4.4 /usr/bin/arm-linux-gnueabi-g++
sudo ln -s /usr/bin/arm-linux-gnueabi-cpp-4.4 /usr/bin/arm-linux-gnueabi-cpp
########################################################
Debug 3:
若執行編譯指令,出現:
"mkimage" command not found - U-Boot images will not be built
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2

解決 3:
sudo apt-get install u-boot-tools
########################################################

編譯成功後,會出現下面訊息:
Image Name:   Linux-3.4.100
Created:      Tue Nov  4 10:18:34 2014
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2533656 Bytes = 2474.27 kB = 2.42 MB
Load Address: 80008000
Entry Point:  80008000
 Image arch/arm/boot/uImage is ready

可以查看 uImage 檔案屬性:
file ~/qemu_image/kernel/linux-3.4.100/arch/arm/boot/uImage

/home/lin/qemu_image/kernel/linux-3.4.100/arch/arm/boot/uImage: u-boot legacy uImage, Linux-3.4.100, Linux/ARM, OS Kernel Image (Not compressed), 2533656 bytes, Tue Nov  4 10:18:34 2014, Load Address: 0x80008000, Entry Point: 0x80008000, Header CRC: 0x3B853179, Data CRC: 0xB98ABE41

七、編譯核心 modules

0. 注意目錄位置

cd ~/qemu_image/kernel/linux-3.4.100

1. Compile Kernel Modules

time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules -j ${core number}

2. Install Kernel Modules

time make -s ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=~/qemu_image/kernel/modules/ -j ${core number}

3. 製成壓縮檔

cd ~/qemu_image/kernel/modules
tar cfva modules-3.4.100.tar.xz lib

八、總結

1. modules-3.4.100.tar.xz 可以用來取代原始 rootfs 中的 /lib/modules 舊版驅動。

2. 參考建立虛擬 SD Card,並且做連結掛載
losetup /dev/loop0 sdcard.img
losetup -o `expr 512 \ * 2048` /dev/loop1 /dev/loop0
mount /dev/loop1 /sd1

3. 將 uImage 移入 /sd1
cp ~/qemu_image/kernel/linux-3.4.100/arch/arm/boot/uImage /sd1

要在 /sd1 裡面看到下面五個檔案:
-rwxr-xr-x 1 root root   51100 11月 18 11:57 MLO
-rwxr-xr-x 1 root root 1852516 11月 18 11:57 u-boot
-rwxr-xr-x 1 root root  392152 11月 18 11:57 u-boot.bin
-rwxr-xr-x 1 root root  392216 11月 18 11:57 u-boot.img
-rwxr-xr-x 1 root root 2533720 11月 18 11:57 uImage

4. 測試開機(參考 u-boot 編譯 指令)

qemu-system-arm -M beagle -nographic -sd sdcard.img

########################################################
Debug
開虛擬機出現下面訊息:
qemu: hardware error: no boot device found
CPU #0:
R00=00000000 R01=00000000 R02=00000000 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=400140a4
PSR=400001d3 -Z-- A svc32
s00=00000000 s01=00000000 d00=0000000000000000
s02=00000000 s03=00000000 d01=0000000000000000
s04=00000000 s05=00000000 d02=0000000000000000
s06=00000000 s07=00000000 d03=0000000000000000
s08=00000000 s09=00000000 d04=0000000000000000
s10=00000000 s11=00000000 d05=0000000000000000
s12=00000000 s13=00000000 d06=0000000000000000
s14=00000000 s15=00000000 d07=0000000000000000
s16=00000000 s17=00000000 d08=0000000000000000
s18=00000000 s19=00000000 d09=0000000000000000
s20=00000000 s21=00000000 d10=0000000000000000
s22=00000000 s23=00000000 d11=0000000000000000
s24=00000000 s25=00000000 d12=0000000000000000
s26=00000000 s27=00000000 d13=0000000000000000
s28=00000000 s29=00000000 d14=0000000000000000
s30=00000000 s31=00000000 d15=0000000000000000
s32=00000000 s33=00000000 d16=0000000000000000
s34=00000000 s35=00000000 d17=0000000000000000
s36=00000000 s37=00000000 d18=0000000000000000
s38=00000000 s39=00000000 d19=0000000000000000
s40=00000000 s41=00000000 d20=0000000000000000
s42=00000000 s43=00000000 d21=0000000000000000
s44=00000000 s45=00000000 d22=0000000000000000
s46=00000000 s47=00000000 d23=0000000000000000
s48=00000000 s49=00000000 d24=0000000000000000
s50=00000000 s51=00000000 d25=0000000000000000
s52=00000000 s53=00000000 d26=0000000000000000
s54=00000000 s55=00000000 d27=0000000000000000
s56=00000000 s57=00000000 d28=0000000000000000
s58=00000000 s59=00000000 d29=0000000000000000
s60=00000000 s61=00000000 d30=0000000000000000
s62=00000000 s63=00000000 d31=0000000000000000
FPSCR: 00000000
已經終

解決:
fdisd sdcard.img
a
1
w

將開機選項加到 sdcard.img 第一分割區。
########################################################

九、 秘訣攻略

arm 的編譯指令有點長,我們可以利用 alias 來包裝成好記的指令。
vi ~/.bashrc
加入 alias makearm='make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-'
source ~/.bashrc

之後就可以用自訂的指令,
設定核心:
makearm omap2plus_defconfig

核心選單:
makearm menuconfig

編譯 uImage :
time makearm uImage -j 8

編譯 modules :
time makearm modules -s -j 8

編譯 modules_install:
time makearm modules_install INSTALL_MOD_PATH=../modules/ -s -j 8




Reference:

2014年10月30日 星期四

hdparm 硬碟速度測試



sudo apt-get install hdparm

sudo hdparm -Tt /dev/sdX


Timing cached reads:   3164 MB in  2.00 seconds = 1582.31 MB/sec
Timing buffered disk reads: 238 MB in  3.01 seconds =  79.08 MB/sec

2014年10月29日 星期三

WinSetupFromUSB 製作 USB 重灌碟


WinSetupFromUSB 是一套可以製作多系統 USB 安裝碟的工具,
該軟體內整合了數個我們製做重灌開機碟工具,包含:
FBinstTool、Bootice、RMPrepUSB、Grub4dos、Imdisk…等等,
它可以建立開機引導程式 GRUB ,
最重要的是可以直接載入 .iso 映像檔,來做開機碟。

官網:
http://www.winsetupfromusb.com/

官方載點:
WinSetupFromUSB 1.4.exe
WinSetupFromUSB 1.4.7z

接下來進入正式筆記教學,
下面的各個軟體都是網路開放的免軟體,
可以直接 Google 搜尋下載,
同時本站的雲端也有備份,也可以直接從本站下載。

一、規劃開機選單
以本作者所使用的為例,我希望設計如下:

  1. Windows 7 整合版 9 in 1 容量約 4.18 GB
  2. Windows 8.1 容量約 3.60 GB
  3. Debian-7.7.0_amd64 容量約 635  MB
  4. Ubuntu-12.04.04_amd64 容量約 733  MB
  5. CentOS-7.0_amd64 _livecd 容量約 687  MB
  6. Reboot 
  7. Shutdown
合計所需容量約: 9.835 GB 


二、準備東西



三、使用軟體 WinSetupFromUSB_1.4
本作者是使用 64 位元 Windows 7 作業系統的機器下使用。



四、植入檔案

開啟 USB 隨身碟,先建立一個 ISO 目錄,
接著無順序,植入:

/menu.list
/unifont.hex.gz
/ISO/CentOS-7.0_amd64_livecd.iso
/ISO/Debian-7.7.0_amd64.iso
/ISO/Ubuntu-12.04.4_amd64.iso
/ISO/Windows_8.1.iso


五、調整 menu.list




六、QEMU 測試開機







Debug 1:
進入選單後,執行安裝 Windows 8.1 ,出現:


Sol 1:
這可能是 QEMU 虛擬機,設定給的 RAM 不足,可以試試給 1024 MB (或更多) 再開看看。


Debug 2:

Sol 2: 未解決
參考:http://fireball-catcher.blogspot.tw/2012/07/grub4dos.html
用 imdisk 嘗試解決,又出現新的問題:
「缺少數位簽章或是惡意軟體」







Reference:
http://www.coolpc.com.tw/phpBB2/viewtopic.php?f=21&t=53402

http://fireball-catcher.blogspot.tw/2012/07/grub4dos.html

http://520.be/1496-%E5%88%A9%E7%94%A8grub4dos%E8%A3%BD%E4%BD%9Cusb%E9%96%8B%E6%A9%9F%E7%A2%9F.html#lightbox[gallery-DY9l]/6/

http://skynimo.lionfree.net/joomla/index.php?option=com_content&view=category&layout=blog&id=17&Itemid=101&limitstart=15

2014年10月28日 星期二

建立虛擬 SD Card



目標是建立一個 1GB 的 sdcard.img ,其分割區如下圖:



一、先建一個空的 sdcard.img (User 權限)

(其中 bs 是 block size)
dd if=/dev/zero of=sdcard.img bs=1G count=1

查看一下檔案屬性:
file sdcard.img
hexdump sdcard.img

會發現都是 0 組成的空檔案。

二、連接到 /dev/loop0 (Root 權限)

losetup /dev/loop0 sdcard.img

三、磁區分割 (Root 權限)

fdisk 指令參考
sudo fdisk /dev/loop0
n
p
1
[enter]
+80M

n
p
2
[enter]
[enter]
t
1
b

p
w

四、做 Offset (Root 權限)

fdisk -lu /dev/loop0
查看分割,輸出如下:
所用裝置 開機      開始         結束      區塊   識別號  系統
/dev/loop0p1            2048      165887       81920    b  W95 FAT32
/dev/loop0p2          165888     2097151      965632   83  Linux

losetup -o `expr 512 \* 2048` /dev/loop1  /dev/loop0
losetup -o `expr 512 \* 165888` /dev/loop2 /dev/loop0

查看連接結果,輸出如下:
losetup -a
/dev/loop0: [0804]:9701359 (/home/lin/qemu/sdcard.img)
/dev/loop1: [0005]:1218 (/dev/loop0),偏移值 1048576
/dev/loop2: [0005]:1218 (/dev/loop0),偏移值 84934656

五、格式化 (Root 權限)

先裝 filesystem tools
apt-get install dosfstools

fdisk -lu /dev/loop0
查看分割,輸出如下:
所用裝置 開機      開始         結束      區塊   識別號  系統
/dev/loop0p1            2048      165887       81920    b  W95 FAT32
/dev/loop0p2          165888     2097151      965632   83  Linux

開始格式化記得如入 blocks:
mkfs.vfat /dev/loop1 81920
mkfs.ext4 /dev/loop2 965632

看一下 block id ,如下:
blkid /dev/loop1 
/dev/loop1: SEC_TYPE="msdos" UUID="3A38-5A24" TYPE="vfat"
blkid /dev/loop2
/dev/loop2: UUID="dec7a9d5-b0bb-433b-aefb-6b4eecc28aba" TYPE="ext4"

Debug 1: 
如果找不到 mkfs.vfat 的指令

解決 1:
sudo apt-get install dosfstools

七、掛載  (Root 權限)

先建立要掛的目錄
mkdir  /sd1 /sd2

掛載
mount /dev/loop1 /sd1
mount /dev/loop2 /sd2

查看掛載
df -h

八、清除全部(Root 權限)

先卸載
umount /sd1
umount /sd2
df -h

解除連接(注意由下到上)
losetup -a
losetup -d /dev/loop2
losetup -d /dev/loop1
losetup -d /dev/loop0
losetup -a

九、連接及掛載(Root 權限)

  (可以8. 及 9. 反覆練習)
losetup /dev/loop0 sdcard.img
losetup -o `expr 512 * 2048` /dev/loop1
losetup -o `expr 512 * 165888` /dev/loop2
losetup -a

mount /dev/loop1 /sd1
mount /dev/loop2 /sd2
df -h

十、產生檔案

1. bootloader 可參考文章:u-boot 編譯
產生檔案:
MLO
u-boot
u-boot.bin
u-boot.img

2. kernel 可參考文章:編譯 ARM Linux 核心
產生檔案:
uImage
modules

3. Rootfs 可以參考文章:建立 Rootfs
瘦身過後的 Rootfs 全部檔案,
還需要含有步驟 2. 所編譯出來的核心 modules 

4. uEnv.txt 可參考文章:U-Boot 指令及建立 uEnv.txt
uEnv.txt        -> 開機設定檔

十一、分割區整理

sdcard1 -> 

第 1 個分割區,FAT 16/32 格式,有打開開機旗標,
內含檔案:
-rwxr-xr-x 1 root root   45128 2012-10-30 22:19 MLO
-rwxr-xr-x 1 root root 1215711 2012-10-30 22:19 u-boot
-rwxr-xr-x 1 root root  294672 2012-10-30 22:19 u-boot.bin
-rwxr-xr-x 1 root root  294736 2012-10-30 22:19 u-boot.img
-rwxr-xr-x 1 root root       1 2012-10-30 23:29 uEnv.txt
-rwxr-xr-x 1 root root 2475616 2012-10-30 22:15 uImage

sdcard2 -> 

第 2 個分割區,ext4 格式,
內含 rootfs 一些能正常開機執行的檔案,
還包含我們做好的核心 modules

十二、測試 sdcard.img

qemu-system-arm -M beagle -m 512 -nographic -sd sdcard.img








Reference:
http://pominglee.blogspot.tw/2012/10/sd-card.html

2014年10月24日 星期五

OCCT 燒機軟體



OCCT 燒機軟體,常用於測試電腦穩定度,
有玩超頻者的必備工具。

官網:
http://www.ocbase.com/

下載:
OCCTPT4.4.1.zip (免安裝版)
OCCTPT4.4.1.exe (安裝版 )


介面如下圖:


介面右側「Monitoring」可以查看下圖數據:


常用的燒機模式:POWER SUPPLY
可以全機燒機,包含 CPU、GPU、Memory... 等。