5/30/2013
5/28/2013
5/27/2013
5/21/2013
ISOLinux 如何製作開機光碟
前面已經講過如何製作USBlinux
相關連結
[USB linux] 1.打造2MB 的 linux USB 隨身碟
[USB linux] 2.核心編譯
[USB linux] 3.建立ramdisk的root filesystem (initrd)
[USB linux] 4.建置busybox
[USB linux] 5.最後步驟建置boot loader
至於要如何把自己做的kernel做成開機光碟或者iso檔給別人下載呢?
在ISOLinux中告訴我們要這麼做
相關連結
[USB linux] 1.打造2MB 的 linux USB 隨身碟
[USB linux] 2.核心編譯
[USB linux] 3.建立ramdisk的root filesystem (initrd)
[USB linux] 4.建置busybox
[USB linux] 5.最後步驟建置boot loader
至於要如何把自己做的kernel做成開機光碟或者iso檔給別人下載呢?
在ISOLinux中告訴我們要這麼做
- Make sure you have a recent enough version of mkisofs. I recommend mkisofs 1.13 (distributed with cdrecord 1.9), but 1.12 might work as well (not tested). Binary versions for Windows can be found on the web.
- Download Syslinux
- Create a directory called "CD_root". This is the ISO image master file tree
- Copy all files you want to have on the CD into this directory
- Create a directory called "isolinux" underneath the directory "CD_root"
- Copy "core/isolinux.bin" from the Syslinux archive
- Create "isolinux.cfg" (see example)
- Create directories "images" and "kernel" underneath the directory "CD_root"
- Copy any floppy images you want to boot into "images"
- Copy "memdisk/memdisk" from the Syslinux archive into "kernel"
- Use the following command to create your ISO image:
mkisofs -o output.iso \ -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ CD_root
The file boot.cat will be automatically created.
[USB linux] 5.最後步驟建置boot loader
boot loader的責任是接手BIOS的開機任務,負責找出kernel image的所在位置,
載入kernel到記憶體中,傳給kernel image適當的參數,接著將執行權交給kernel,完成開機
我們要先為隨身碟寫入boot loader,我們使用syslinux
syslinux是一個Linux的boot loader,專為fat檔案系統設計的,
一般的隨身碟通常為fat32,軟碟也適用
syslinux /dev/sdc1
sdc1請更改為你的裝置名稱
如果你不確定你的隨身碟在哪一個裝置,可以用df指令看掛載點
再來要編輯boot loader的設定檔
vi syslinux.cfg
內容如下:
default linux
prompt 1
timeout 10
label linux
kernel bzImage
append initrd=initrd.img vga=792
內容主要指定kernel映像檔、ramdisk、螢幕的參數等
載入kernel到記憶體中,傳給kernel image適當的參數,接著將執行權交給kernel,完成開機
我們要先為隨身碟寫入boot loader,我們使用syslinux
syslinux是一個Linux的boot loader,專為fat檔案系統設計的,
一般的隨身碟通常為fat32,軟碟也適用
syslinux /dev/sdc1
sdc1請更改為你的裝置名稱
再來要編輯boot loader的設定檔
vi syslinux.cfg
內容如下:
default linux
prompt 1
timeout 10
label linux
kernel bzImage
append initrd=initrd.img vga=792
內容主要指定kernel映像檔、ramdisk、螢幕的參數等
[USB linux] 4.建置busybox
Linux下常見的指令,都是由「程式」所組成,但是這些程式如果全部放進來,也會佔掉不少空間,因此有了busybox busybox包含了數十種Linux下常見的標準工具,例如ls, cp, cat, more.... 甚至包含了http server,但是全部加起來都只有幾百k的大小,是作為嵌入式系統工具庫更好的選擇。 下面就來介紹該怎麼組態、編譯、安裝busybox 回到我們的工作目錄,並解開busybox cd ~/build-usb-linux tar -jxf busybox-1.13.2.tar.bz2 cd busybox-1.13.2 先進行組態設定 make menuconfig 先設定安裝目錄,將installation prefix設為剛剛所建立的ramdisk掛載點 這邊不能使用"~"來作為家目錄,所以你必須填上完整的路徑。 Busybox Settings ---> Installation Options ---> (/home/koukai/build-usb-linux/initrd) BusyBox installation prefix 設定交叉編譯器的選項如下的cross compiler prefix,但因為我們要跑在自己電腦上,所以可以忽略交叉編譯器的設定無所謂, Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) () Cross Compiler prefix 例如你所用的是arm-linux-gcc,就要將prefix設為arm-linux- 然後要選取將busybox編為靜態連結!!!! |
[USB linux] 3.建立ramdisk的root filesystem (initrd)
接下來,要建立Linux的root filesystem,也就是打造整個Linux下面的檔案系統環境
為什麼要放在ramdisk呢?一來速度快,二來ramdisk映像檔經過壓縮可以變得更小。
缺點是檔案系統要更新的話很麻煩,要重新掛載映像檔、修改、卸載、壓縮。
不過嵌入式系統的變更頻率不高,這樣做還是ok的。
這個ramdisk叫做是initrd,initial ramdisk。
首先,建立一個zero-filled的檔案,全設為0可以讓壓縮未用的空間更有效率。
我們從/dev/zero處複製一共8192個block到ramdisk這個檔案中,每個block大小為1k,因此這個檔案為8MB
cd ~/build-usb-linux
dd if=/dev/zero of=ramdisk bs=1k count=8192
接著,將他格式化成ext2的格式。
mkfs.ext2 -v -F -m0 ramdisk
我們將他掛載起來,就像掛載虛擬光碟一樣。
mkdir initrd
sudo mount -o loop ramdisk initrd/
為什麼要放在ramdisk呢?一來速度快,二來ramdisk映像檔經過壓縮可以變得更小。
缺點是檔案系統要更新的話很麻煩,要重新掛載映像檔、修改、卸載、壓縮。
不過嵌入式系統的變更頻率不高,這樣做還是ok的。
這個ramdisk叫做是initrd,initial ramdisk。
首先,建立一個zero-filled的檔案,全設為0可以讓壓縮未用的空間更有效率。
我們從/dev/zero處複製一共8192個block到ramdisk這個檔案中,每個block大小為1k,因此這個檔案為8MB
cd ~/build-usb-linux
dd if=/dev/zero of=ramdisk bs=1k count=8192
接著,將他格式化成ext2的格式。
mkfs.ext2 -v -F -m0 ramdisk
我們將他掛載起來,就像掛載虛擬光碟一樣。
mkdir initrd
sudo mount -o loop ramdisk initrd/
[USB linux] 2.核心編譯
核心是Linux最重要的部份,也是最久的部分
直接來吧!回到我們的工作目錄,並解開核心原始檔 cd ~/build-usb-linux
tar -jxf linux-2.6.26.8.tar.bz2
cd linux-2.6.26.8
再來,進行組態設定
make menuconfig選單的操作方式,與怎麼選擇kernel的內部鳥哥的Linux私房菜 核心編譯
這邊暫時全部都使用默認選項,打開menuconfig直接 存檔離開即可,接著便可以開始編譯了
make
大概會跑個好幾十分鐘,如果你用虛擬機器的話,可能會更久Orz
最後在kernel資料夾/arch/$(ARCH)/boot/目錄會產生bzImage,將他複製到隨身碟
$(ARCH)請自行代換成你的cpu架構,可能是ARM、i386(較舊的核心)、x86、x86-64!
直接來吧!回到我們的工作目錄,並解開核心原始檔 cd ~/build-usb-linux
tar -jxf linux-2.6.26.8.tar.bz2
cd linux-2.6.26.8
再來,進行組態設定
make menuconfig選單的操作方式,與怎麼選擇kernel的內部鳥哥的Linux私房菜 核心編譯
這邊暫時全部都使用默認選項,打開menuconfig直接 存檔離開即可,接著便可以開始編譯了
make
大概會跑個好幾十分鐘,如果你用虛擬機器的話,可能會更久Orz
最後在kernel資料夾/arch/$(ARCH)/boot/目錄會產生bzImage,將他複製到隨身碟
$(ARCH)請自行代換成你的cpu架構,可能是ARM、i386(較舊的核心)、x86、x86-64!
檔案傳送與效能分析(4)-程式下載
雖然還沒開始看程式碼,但這邊我還是要先稍微說明一下我程式上的幾個問題點。
(寫在後面就沒人想看了(=...=)
1.由於在寫這份作業時得到重感冒...程式碼的部分寫得非常不好...,這邊很抱歉之後有空我會再改改。
2.不該使用nonblock因為會使效能變差
3.應該要設定SO_SENDTO,在這邊要注意一下select並不能完全的取代掉SO_SENDTO!問題點在於write的buffsize大小會出問題(傳送者大,接收者小時,有機會發生問題)
4.盡量少使用fwrite,盡量使用system calls 也就是write。
5.改使用UDP在傳送時,記得每個封包前面要加上Sequence number,以及最後要判斷data是否遭到串改(類似checksum)。
6.在嵌入式系統的設備上盡量使用udp,因為嵌入式系統的晶片如果用來處理tcp的話,在某些方面來說處理可能太過於複雜。
....等
檔案傳送與效能分析(2)-基本的檔案傳送
因為有太多人不知道怎麼寫檔案傳送..(汗)
在這邊弄一個簡單的範例給各位,不過請別忘了將以下程式修改達到以下目的
------------------------------------------------
1. 將作業一改成用 select, 不需使用http, 只需傳一個大檔, 譬如 1G 的 zip 檔
2. 設計 client, 不需顯示UI, 只需存檔, 只需用 zip 驗證正確性
3. 請不要用 sendfile 來處理, 這是練習
4. 當1個client 連線, 仍夠正確傳完, 分析您的處理過程
5. 當1個client 連線, 但是您的網路頻寬有限, 仍夠正確傳完.
6. 當多個(2個以上)client 連線, 仍夠正確傳完
7. 當接收端 (client), 程式異常終止, 製造SIGPIPE, 參考 man 7 siganl, 與範例
8. 處理 SIGPIPE
9. Server 與 Client 網路速度不匹配, 或bandwidth 不夠, 發生 send 這 system call, block 現象
10. 同時使用 Wireshark 分析TCP 現象
11. 不穩定網路續傳, 這需處理續傳問題, 如同http partial get 的問題
12. 連續傳送過程中, 設計 recv 或 read 回傳值 與期望大小不同的現象
13. 使用pthread 處理多工傳送
14. man 7 socket , SO_SNDTIMEO, 處理 send blocking 問題
15. 不要太相信 SO_LINGER 是好方法
16. pthread如果傳入參數時,會有什麼bug!
17. thread 中的結果如何用一般 stdout/stdin 或透過 unix domain socket 取代 (請參考http/cgi 程式), 這是下份作業
在這邊弄一個簡單的範例給各位,不過請別忘了將以下程式修改達到以下目的
------------------------------------------------
1. 將作業一改成用 select, 不需使用http, 只需傳一個大檔, 譬如 1G 的 zip 檔
2. 設計 client, 不需顯示UI, 只需存檔, 只需用 zip 驗證正確性
3. 請不要用 sendfile 來處理, 這是練習
4. 當1個client 連線, 仍夠正確傳完, 分析您的處理過程
5. 當1個client 連線, 但是您的網路頻寬有限, 仍夠正確傳完.
6. 當多個(2個以上)client 連線, 仍夠正確傳完
7. 當接收端 (client), 程式異常終止, 製造SIGPIPE, 參考 man 7 siganl, 與範例
8. 處理 SIGPIPE
9. Server 與 Client 網路速度不匹配, 或bandwidth 不夠, 發生 send 這 system call, block 現象
10. 同時使用 Wireshark 分析TCP 現象
11. 不穩定網路續傳, 這需處理續傳問題, 如同http partial get 的問題
12. 連續傳送過程中, 設計 recv 或 read 回傳值 與期望大小不同的現象
13. 使用pthread 處理多工傳送
14. man 7 socket , SO_SNDTIMEO, 處理 send blocking 問題
15. 不要太相信 SO_LINGER 是好方法
16. pthread如果傳入參數時,會有什麼bug!
17. thread 中的結果如何用一般 stdout/stdin 或透過 unix domain socket 取代 (請參考http/cgi 程式), 這是下份作業
------------------------------------------------
以下附上"簡單"的檔案傳送接收範例,這只是參考的範例架構並不是本次實驗的目的...!!如果你拿這份來交作業...那我真不知道要說什麼了...
請不要直接複製下面程式碼,因為裡面會包含亂碼唷~ 請盡量自己打
common.h
以下附上"簡單"的檔案傳送接收範例,這只是參考的範例架構並不是本次實驗的目的...!!如果你拿這份來交作業...那我真不知道要說什麼了...
請不要直接複製下面程式碼,因為裡面會包含亂碼唷~ 請盡量自己打
common.h
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 6000 #define LISTENQ 20 #define BUFFSIZE 4096 #define FILE_NAME_MAX_SIZE 512
檔案傳送與效能分析(3)-斷線分析
延續上一篇文章檔案傳送與效能分析(1)-實驗過程與結果
當伺服器 close一個連接時,若client端接著發數據。根據TCP協定的規定,會收到一個RST響應,client再往這個服務器發送數據時,系統會發出一個SIGPIPE信號給進程,告訴進程這個連接已經斷開了,不要再寫了。
根據信號的默認處理規則SIGPIPE信號的默認執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把SIGPIPE設為SIG_IGN
如: signal(SIGPIPE,SIG_IGN);// 這時SIGPIPE交給了系統處理。
這篇要開始講解當程式發生問題時封包的狀態為何?以及一些斷線分析的範例程式碼。
斷線 RST封包問題
當伺服器 close一個連接時,若client端接著發數據。根據TCP協定的規定,會收到一個RST響應,client再往這個服務器發送數據時,系統會發出一個SIGPIPE信號給進程,告訴進程這個連接已經斷開了,不要再寫了。
根據信號的默認處理規則SIGPIPE信號的默認執行動作是terminate(終止、退出),所以client會退出。若不想客戶端退出可以把SIGPIPE設為SIG_IGN
如: signal(SIGPIPE,SIG_IGN);// 這時SIGPIPE交給了系統處理。
註:服務器採用了fork的話,要收集垃圾進程,防止僵屍進程的產生,可以這樣處理: signal(SIGCHLD,SIG_IGN); //交給系統init去回收。這邊拿unpv13e 裡面的範例來修改當例子
這裡子進程就不會產生僵屍程序了。
5/15/2013
資料結構 Tree 建置 與 印出
5/14/2013
檔案傳送與效能分析(1)-實驗過程與結果
建議切換全螢幕高畫質欣賞~!
本程式在實際網路可以正常執行,為了錄影方便所以才在同一台機器上做測試
看影片可能覺得很簡單...,平常的檔案傳輸都是在穩定的網路下做傳輸,而本程式在不穩定的網路下可以做到大檔傳送、斷線續傳、多工、timeout、pipe、reconnect...等功能...,雖然只是單純的傳送檔案...但寫起來要考慮的東西還真不少....。
影片內容忘記錄多工的部分.... ( 0 . 0)
實驗結果如下,之後有空再對步驟以及程式碼做解釋
(以下圖片點及都可以放大)
62byteTXT文字檔
49.9kb小圖檔(jpg)
1.1Mb大圖檔(jpg)
1014.5Mb壓縮檔(zip)
實驗測試網路環境:
1.都在同一台機器中
2.兩台有線網路
3.一台有線網路 一台無線網路 (此為影片拍測的環境)
4.兩台無線網路
傳輸時百分比進度
傳送文字檔封包分析
C語言 如何知道檔案大小
1.利用fseek(或lseek)
FILE* f = fopen(fileName, "r+"); fseek(f, 0, SEEK_END); size = ftell(f); fseek(f, 0, SEEK_SET);
2.用stat函式
struct stat st; stat(fileName, &st); size = st.st_size;
其中stat結構如下
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
5/05/2013
解決 linux 沒有 itoa 問題解法
因為在ANSI-C 與一些compiler中並沒有支援
所以在linux裡沒有itoa(int , char[] ,int) 這個函數
不過可用sprintf(str , "%d" ,i) 代替
itoa( 456 , str , 10)
sprintf(str, "%d" ,456)
訂閱:
文章 (Atom)