作者 主題: 製作 tinycore x64 + memcached server 嵌入式系統  (閱讀 3811 次)

0 會員 與 1 訪客 正在閱讀本文。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
以下內容是參考了一些網路上文章
加上自己不斷嘗試與測試的記錄
如有錯誤,請多多指正 ^_^


(Part 1 remaster tc iso)

先了解如何重新打包(remaster) tc 的開機 iso
然後再來編輯符合自己需求的 rootfs

首先,下載 tinycore 5.x ios 檔
我選用 64bit 版的原因是家裡有幾台 8GB 電腦閑置中
如果用 32bit 雖然有打包好的 memcached 直接可以安裝
但是 32bit 系統只能抓到 4GB 啊,所以還是花點時間
用 64bit 系統來製作

載點:http://distro.ibiblio.org/tinycorelinux/5.x/

(host -> 就是我設定打包 tinycore 所使用的系統)
代碼: [選擇]
$ cd ~
$ mkdir tc
$ cd ~/tc
-----
$ sudo git init
-----

先把 iso 掛載起來,並將裡面的資料複製出來

代碼: [選擇]
$ sudo umount mnt
$ sudo mount -o loop,ro iso/org/CorePure64-5.1.iso ./mnt
$ ls mnt/boot
isolinux  modules64.gz  rootfs64.gz  vmlinuz64

$ mkdir x64
$ cp -a mnt/boot x64
$ chmod -R +w x64

修改開機設定,tc 開機畫面預設等待30秒後自動開機,改成 1/3 秒

代碼: [選擇]
$ sudo vim x64/boot/isolinux/isolinux.cfg
label corepure64
        kernel /boot/vmlinuz64
        initrd /boot/rootfs64.gz,/boot/modules64.gz
        append loglevel=3

timeout 300 => timeout 3
$

rootfs64.gz 其實就是開機後所看到的根目錄『/』裡的資料
modules64.gz 則是放一些 driver,如果想讓系統再小一點
也可以將 modules64.gz 解開刪除一些確定用不到的 driver

代碼: [選擇]
$ mkdir rootfs64 repo
$ cd rootfs64
$ zcat ../x64/boot/rootfs64.gz | sudo cpio -i -H newc -d
$ ls
bin  dev  etc  home  init  lib  mnt  opt  proc  root  run  sbin  sys  tmp  usr  var

不要改變 rootfs64 裡面檔案與目錄的權限
在操作 rootfs64 時要注意不要在路徑最前面加『/』
那會變成是在操作 host 系統『/』下的東西 XD

代碼: [選擇]
-----
$ cd ~/tc
$ sudo git add rootfs64
$ sudo git commit -m "最原始的 rootfs64"
-----

不急著加東西進來,先試看看如何打包 rootfs 與 iso 檔

代碼: [選擇]
$ cd rootfs64
$ sudo vim opt/bootlocal.sh

#!/bin/sh
# put other system startup commands here

sleep 1
echo "Hello, World! ^_^"
$

opt/bootlocal.sh 開機時會自動被執行
加了一行 echo,在開機後顯示一行字串
將修改過的 rootfs64 重新打包並做成新的 iso

代碼: [選擇]
$ pwd
~/tc/rootfs64   <---- 注意現在所在的位置

$ ls -l ../x64/boot/rootfs64.gz
-rwxrwxr-x 1 yamaka yamaka 3334090 Jan  4 16:09 ../x64/boot/rootfs64.gz

$ find | sudo cpio -o -H newc | gzip -9 > ../x64/boot/rootfs64.gz
$ ls -l ../x64/boot/rootfs64.gz
-rwxrwxr-x 1 yamaka yamaka 3434839 Feb 10 15:04 ../x64/boot/rootfs64.gz

這是打包 rootfs,再來是 製作成可開機的 iso 檔

代碼: [選擇]
$ mkisofs -l -J -R -V TC-x64 -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o ../iso/TC-x64-v1.0.1.iso ../x64
I: -input-charset not specified, using utf-8 (detected in locale settings)
Size of boot image is 4 sectors -> No emulation
 93.83% done, estimate finish Mon Feb 10 15:08:38 2014
Total translation table size: 2048
Total rockridge attributes bytes: 1391
Total directory bytes: 4096
Path table size(bytes): 38
Max brk space used 23000
5334 extents written (10 MB)

$ ls -l ../iso/TC-x64.iso
-rw-r--r-- 1 yamaka yamaka 10924032 Feb 10 15:08 ../iso/TC-x64.iso

將這個 iso 掛到 vm 然後開機,開機過程不用再等待30秒或按 enter 鍵
開機進入系統後會看到畫面上顯示『Hello, World! ^_^』字串。

代碼: [選擇]
-----
$ scp ../iso/TC-x64-v1.0.1.iso yamaka@uYmk:~/tmp/.
$ cd ~/tc
$ sudo git add rootfs64
$ sudo git commit -m "rootfs64 開機後顯示『Hello, World! ^_^』字串"
-----

PS:
64bit 版的 iso 預設有兩個 gz 檔,如果想將這兩個合併,可以用下面指令

(合併 rootfs64.gz modules64.gz)
代碼: [選擇]
$ zcat *.gz | gzip > boot2/rootfs64.gz
然後要修改 x64/boot/isolinux/isolinux.cfg

    initrd /boot/rootfs64.gz

刪除『,/boot/modules64.gz』


Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
(Part 2 openssh install)

加入 openssh 並在開機後自動啟用

相關套件:

gcc_libs.tcz
openssl-1.0.0.tcz
openssh.tcz

怎麼知道要安裝哪些套件?
一個最快速的方式就是直接在 tc 系統下安裝一次
等跑完安裝後去看一下 /tmp/tce/optional 有哪些 tcz 檔就知道了
這裡也必需要先安裝 openssh,因為要用到 scp 指令將 /tmp/tce/ 打包抓回來

代碼: [選擇]
tc@box:$ tce-load -wi openssh
..........
$
tc@box:$ ls /tmp/tce/optional/*.tcz
(這裡就會看到有3個上面說的那些檔案)

將 /tmp/tce 打包抓回來

代碼: [選擇]
tc@box:$ cd /tmp
tc@box:$ tar czf /tmp/for-ssh.tar.gz tce
tc@box:$ scp /tmp/for-ssh.tar.gz yamaka@192.168.1.14:~/tc/repo/.

(host)
代碼: [選擇]
$ cd ~/tc
$ ls -l repo/for-ssh.tar.gz
-rw-r--r-- 1 yamaka yamaka 2517773 Feb 11 10:36 repo/for-ssh.tar.gz

-----
$ sudo git checkout -b add-openssh
-----

將壓縮包解到 tmp,在 tmp 就可以看到剛才在 tc 系統裡安裝的套件包

代碼: [選擇]
$ cd rootfs64/tmp
$ tar zxf ../../repo/for-ssh.tar.gz
$ sudo chown -R 1001:50 tce
$ ls -l tce/{optional,}
tce/:
total 8
-rw-r--r-- 1 1001 staff   12 Feb 11 10:29 onboot.lst
drwxr-xr-x 2 1001 staff 4096 Feb 11 10:29 optional

tce/optional:
total 2492
-rw-r--r-- 1 1001 staff  249856 Feb 11 10:28 gcc_libs.tcz
-rw-r--r-- 1 1001 staff      47 Feb 11 10:28 gcc_libs.tcz.md5.txt
-rw-r--r-- 1 1001 staff  659456 Feb 11 10:29 openssh.tcz
-rw-r--r-- 1 1001 staff      31 Feb 11 10:28 openssh.tcz.dep
-rw-r--r-- 1 1001 staff      46 Feb 11 10:29 openssh.tcz.md5.txt
-rw-r--r-- 1 1001 staff 1626112 Feb 11 10:29 openssl-1.0.0.tcz
-rw-r--r-- 1 1001 staff      52 Feb 11 10:28 openssl-1.0.0.tcz.md5.txt


一般來說,在 tc 安裝套件後要用 filetool.sh 來保存狀態
這樣在系統 reboot 之後,所有安裝與設定的東西才不會消失
而且系統 reboot 之後也會自動掛載之前所安裝的套件
不過這招只對有掛『可儲存』裝置有用,例如硬碟或記憶卡之類
網路爬了幾天看了好多文章,都是對『可儲存』系統操作
只有光碟(iso檔)開機的環境,用 filetool.sh 無效

所以只好用暴力方式在開機後自動掛 tcz
本來是想說在 opt/bootlocal.sh 加個 tce-load 就好
簡單又省事,但可惜 tce-load 要用 tc 的身分跑
而 opt/bootlocal.sh 則是以 root 身分執行
因此這個最簡單方式一下子就破功了 XD

既然是要用 tc 身分跑,而系統開機後又剛好會自動登入 tc
那就在系統開機後第一次登入 tc 時來做這事吧,當然啦~
要避免發生每次登入時都會跑一次的情形
所以先建立一個 script 跑 tce-load
然後在 ~/.ashrc 執行這個 script

這裡又有一個問題,如果看一下上面的 rootfs64/home 就如道
裡面是空的,但是在開機後系統裡 /home/tc 是有東西
當然也有 ~/.ashrc 這個檔案,那也就是說
/home/tc 這個家目錄是開機時才建立
.ashrc 也是開機後才由某個檔案複製過來
查看了 etc/skel 發現裡面有一個 .ashrc
而且檔案內容家目錄裡的完全一樣...所以...

(host)
代碼: [選擇]
$ cd ~/tc/roottfs64
-----
$ sudo git add rootfs64
$ sudo git commit -m "已加入openssh與相依套件"
-----
$ sudo vim etc/skel/.ashrc
(最底端加入)

if [ "$HOME" = "/home/tc" ] && [ -f "$HOME"/restore.sh ]; then
  "$HOME"/restore.sh
  rm -rf "$HOME"/restore.sh
fi

設定 tc 的家目綠

代碼: [選擇]
$ sudo mkdir -p home/tc/.ssh
$ sudo chown -R 1001:50  home/tc

建立掛載新套件的 script

代碼: [選擇]
$ sudo vim home/tc/restore.sh
#!/bin/sh

for fn in $(cat /tmp/tce/onboot.lst); do
  tce-load -i $fn
done
sudo cp /usr/local/etc/ssh/sshd_config_example /usr/local/etc/ssh/sshd_config

設定 restore.sh 權限

代碼: [選擇]
$ sudo chmod +x home/tc/restore.sh
設定 ssh 登入免密碼,如果沒 id_rsa.pub,先建立一個

代碼: [選擇]
$ sudo chmod 0700 home/tc/.ssh
$ sudo cp ~/.ssh/id_rsa.pub home/tc/.ssh/authorized_keys
$ sudo chown -R 1001:50 home/tc
$ sudo ls -l home/tc/.ssh
開機時自動啟動 sshd

代碼: [選擇]
$ sudo vim opt/bootlocal.sh
#!/bin/sh
# put other system startup commands here

sleep 1
/opt/eth0.sh &
/usr/local/etc/init.d/openssh start
$

開機後設定固定的 IP

代碼: [選擇]
$ sudo vim opt/eth0.sh
#!/bin/sh
pkill udhcpc
ifconfig eth0 192.168.1.111 netmask 255.255.255.0 broadcast 192.168.1.255 up
route add default gw 192.168.1.1
echo nameserver 8.8.8.8 > /etc/resolv.conf
echo nameserver 168.95.1.1 >> /etc/resolv.conf
$
$ sudo chmod +x opt/eth0.sh

完成~ 打包開機看看

(這裡要改用 sudo find)
代碼: [選擇]
$ sudo find | sudo cpio -o -H newc | gzip -9 > ../x64/boot/rootfs64.gz
$ mkisofs -l -J -R -V TC-x64 -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o ../iso/TC-x64-v1.0.2.iso ../x64

開機過程就可以看到有3個套件掛載 OK,而且還有 sshd 啟動的畫面訊息
因為已經在開機時修改過 IP 相關設定,現在可以從 host ssh 登入進 tc

(host)
代碼: [選擇]
$ ssh-keygen -R 192.168.1.111
# Host 192.168.1.111 found: line 17 type ECDSA
~/.ssh/known_hosts updated.
Original contents retained as ~/.ssh/known_hosts.old
$ ssh tc@192.168.1.111
The authenticity of host '192.168.1.111 (192.168.1.111)' can't be established.
ECDSA key fingerprint is fe:d4:ef:6e:6e:18:ec:db:62:e5:2c:86:62:ed:c2:bb.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.111' (ECDSA) to the list of known hosts.
 (�-
 //\   Core is distributed with ABSOLUTELY NO WARRANTY.
 v_/_           www.tinycorelinux.com

tc@box:$

免密碼順利登入 tc 了 ^_^

如果開機時不想顯示那些訊息,改一下 script

代碼: [選擇]
$ sudo vim opt/bootlocal.sh
#!/bin/sh
# put other system startup commands here

sleep 1
/opt/eth0.sh &
/usr/local/etc/init.d/openssh start > /dev/null 2>&1


代碼: [選擇]
$ sudo vim home/tc/restore.sh
#!/bin/sh

for fn in $(cat /tmp/tce/onboot.lst); do
  tce-load -i $fn > /dev/null 2>&1
done
sudo cp /usr/local/etc/ssh/sshd_config_example /usr/local/etc/ssh/sshd_config
sudo /usr/local/etc/init.d/openssh start > /dev/null 2>&1

代碼: [選擇]
-----
$ scp ../iso/TC-x64-v1.0.2.iso yamaka@uYmk:~/tmp/.
$ cd ~/tc
$ sudo git add rootfs64
$ sudo git commit -m "開機自動掛載並啟動openssh,可免密碼登入tc,完成!"
$ sudo git checkout -b install-gcc
-----

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
(Part 3 gcc install)

這部分相對來說就比較簡單了,直接用 Part 2 的方式加套件
在 tc 要建立 gcc 編譯環境不是直接安裝 gcc 套件
還有其他相關工具像是 make 等等編譯時會用到的東西
或是相依的函數庫之類的套件,還好 tc 已經將這些
打包成一個 tcz --> compiletc
所以實際上要安裝的是 compiletc.tcz
另外還要安裝 openssl-1.0.0-dev
這個在編譯 memcached 時要用到
file 套件也順便裝上,檢查檔案格式用的
squashfs-tools 將編譯完成的檔案打包成 tcz 的工具
tcztools 則是負則打包的工作,這個沒有被放在 tc 的 repo 裡
所以要自己用 wget 抓到 /tmp/tce/optional

代碼: [選擇]
tc@box:$ wget http://tcztools.googlecode.com/hg/tcztools.tcz -cP /tmp/tce/optional
tc@box:$ tce-load -wi file openssl-1.0.0-dev compiletc squashfs-tools
.........
tc@box:$ ls /tmp/tce/optional/*.tcz
tce/optional/binutils.tcz            tce/optional/gcc_libs-dev.tcz              tce/optional/openssh.tcz
tce/optional/bison.tcz               tce/optional/gcc_libs.tcz                  tce/optional/openssl-1.0.0-dev.tcz
tce/optional/cloog.tcz               tce/optional/gcc.tcz                       tce/optional/openssl-1.0.0.tcz
tce/optional/compiletc.tcz           tce/optional/glibc_base-dev.tcz            tce/optional/patch.tcz
tce/optional/diffutils.tcz           tce/optional/gmp.tcz                       tce/optional/pkg-config.tcz
tce/optional/e2fsprogs_base-dev.tcz  tce/optional/grep.tcz                      tce/optional/ppl.tcz
tce/optional/file.tcz                tce/optional/linux-3.8.10_api_headers.tcz  tce/optional/sed.tcz
tce/optional/findutils.tcz           tce/optional/m4.tcz                        tce/optional/squashfs-tools.tcz
tce/optional/flex.tcz                tce/optional/make.tcz                      tce/optional/tcztools.tcz
tce/optional/gawk.tcz                tce/optional/mpc.tcz                       tce/optional/util-linux_base-dev.tcz
tce/optional/gcc_base-dev.tcz        tce/optional/mpfr.tcz                      tce/optional/zlib_base-dev.tcz

裝了不少套件,先測試一下有沒有 gcc 指令

代碼: [選擇]
tc@box:$ gcc --version
gcc (GCC) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

OK~ 把 tce 整個目錄打包傳回 host 倒進 rootfs64/tmp/tce

代碼: [選擇]
tc@box:$ cd /tmp
tc@box:$ tar czf /tmp/for-gcc.tar.gz tce
tc@box:$ scp /tmp/for-gcc.tar.gz yamaka@192.168.1.14:~/tc/repo/.
tc@box:$ exit

(host)
代碼: [選擇]
$ cd rootfs64/tmp
$ sudo tar zxf ../../repo/for-gcc.tar.gz
$ sudo chown -R 1001:50 tce

確認一下 onboot.lst 有這幾行

代碼: [選擇]
$ sudo vim tmp/tce/onboot.lst
openssh.tcz
file.tcz
openssl-1.0.0-dev.tcz
compiletc.tcz
tcztools.tcz
squashfs-tools.tcz

這裡呢,把 opt/bootlocal.sh 裡啟動 ssh 那行移到 home/tc/restore.sh

代碼: [選擇]
$ sudo vim home/tc/restore.sh

#!/bin/sh
for fn in $(cat /tmp/tce/onboot.lst); do
  tce-load -i $fn
done
sudo cp /usr/local/etc/ssh/sshd_config_example /usr/local/etc/ssh/sshd_config
sudo /usr/local/etc/init.d/openssh start > /dev/null 2>&1

這樣至少能確定在掛上 openssh 套件之後才啟動
打包囉~

代碼: [選擇]
$ cd ..
$ sudo find | sudo cpio -o -H newc | gzip -9 > ../x64/boot/rootfs64.gz
$ mkisofs -l -J -R -V TC-x64 -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o ../iso/TC-x64-v1.0.3-gcc.iso ../x64

用 TC-x64-v1.0.3-gcc.iso 開機測試 gcc 指令

代碼: [選擇]
tc@box:$ gcc --version
gcc (GCC) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

tc@box:$ file /usr/local/bin/gcc
/usr/local/bin/gcc: symbolic link to `/tmp/tcloop/gcc/usr/local/bin/gcc'
tc@box:$ file /tmp/tcloop/gcc/usr/local/bin/gcc
/tmp/tcloop/gcc/usr/local/bin/gcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.21, stripped

tc@box:$ exit

代碼: [選擇]
-----
$ scp ../iso/TC-x64-v1.0.3-gcc.iso yamaka@uYmk:~/tmp/.
$ cd ~/tc
$ sudo git add rootfs64
$ sudo git commit -m "gcc 編譯環境安裝設定完成!"
$ sudo git checkout add-openssh
$ sudo git branch make-memcached-iso-#002
$ sudo git checkout make-memcached-iso-#002

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
(Part 4 compile memcached)

tc 官網只提供 32bit 版 memcached,64bit 版一直都沒提供
所以只能抓原始碼來自己編譯,gcc 環境都建立好了,要編個東西就很簡單了

代碼: [選擇]
tc@box:$ sudo mkdir /usr/local/src
tc@box:$ cd /usr/local/src
tc@box:$ sudo wget http://www.memcached.org/files/memcached-1.4.17.tar.gz
tc@box:$ sudo tar zxf memcached-1.4.17.tar.gz
tc@box:$ cd memcached-1.4.17
tc@box:$ sudo ./configure --prefix=/usr/local --with-libevent=/usr/lib
........
checking for libevent directory... configure: error: libevent is required.  You can get it from http://www.monkey.org/~provos/libevent/

      If it's already installed, specify its path using --with-libevent=/dir/


官網也沒有提供已編譯好的 libevent 64bit 版套件包,也要自己抓原始碼編譯

代碼: [選擇]
tc@box:$ cd ..
tc@box:$ wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
wget: not an http or ftp url: https://github.com/........

也就是說,tc 的 wget 不支援 https 連線,那只好由 host 抓,然後再丟回到 tc

代碼: [選擇]
tc@box:$ ssh yamaka@192.168.1.14 'wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz -O -|cat -' > /tmp/libevent-2.0.21-stable.tar.gz
tc@box:$ sudo tar zxf /tmp/libevent-2.0.21-stable.tar.gz
tc@box:$ cd libevent-2.0.21-stable
tc@box:$ sudo ./configure --prefix=/usr/local
tc@box:$ sudo make
tc@box:$ sudo make install

編譯 libevent 會用到 openssl-1.0.0-dev
如果沒安裝 openssl-1.0.0-dev 會出現錯誤

bufferevent_openssl.c:60:25: fatal error: openssl/bio.h: No such file or directory
compilation terminated.

代碼: [選擇]
tc@box:$ ls /usr/local/lib/libevent*.*
........

OK,再回去編 memcached

代碼: [選擇]
tc@box:$ cd ../memcached-1.4.17
tc@box:$ sudo ./configure --prefix=/usr/local --with-libevent=/usr/lib

這樣就能過關了。

代碼: [選擇]
tc@box:$ sudo make
tc@box:$ sudo make install

看一下編出來的是什麼格式

代碼: [選擇]
tc@box:$ file /usr/local/bin/memcached
/usr/local/bin/memcached: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.21, not stripped

是 64bit 沒錯,啟動看看

代碼: [選擇]
tc@box:$ sudo memcached -u tc -d -m 320 -l 192.168.1.111 -p 11231
memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

找不到檔案,那就建一個連結到 /lib 試試

代碼: [選擇]
tc@box:$ sudo ln -s /usr/local/lib/libevent-2.0.so.5 /lib/.
tc@box:$ sudo memcached -u tc -d -m 320 -l 192.168.1.111 -p 11231
tc@box:$ ps ax|grep mem
10205 tc       memcached -u tc -d -m 320 -l 192.168.1.111 -p 11231

成功啟動了,測試一下

(host)
代碼: [選擇]
$ echo -e 'add myKey1 0 60 11\r\nhello world\r' | nc 192.168.1.111 11231
STORED
$ echo -e 'add myKey2 0 60 18\r\n嗨!大家好~\r' | nc 192.168.1.111 11231
STORED
$ echo -e 'get myKey1\r' | nc 192.168.1.111 11231
VALUE myKey 0 11
hello world
END
$ echo -e 'get myKey2\r' | nc 192.168.1.111 11231
VALUE myKey2 0 18
嗨!大家好~
END

確定 memcached 能正常工作,再來要將剛才編譯好的東西包成 tcz

看了一些文章,都只說用 tcztools 或直接用 mksquashfs
但是在用這兩個工具之前,如何將要打包的檔案放在正確的路徑裡
還有一些必要的 link 也是啊,這部分一直找不到相關討論或說明
總不可能自己將已安裝檔案跟連結一個一個抓來放到要打包的路徑吧
雖然說大概知道是有哪些檔案,但總是有可能會出錯...

剛才編譯時有指定一個路徑 『--prefix=/usr/local』
這個是 make install 時預設安裝的路徑
如果把路徑指到要打包的位置,那 make install 時
不就會將檔案安裝在要打包的位置?! 試試看就知道了

代碼: [選擇]
tc@box:$ cd /usr/local/src/libevent-2.0.21-stable
tc@box:$ mkdir -p /tmp/tcz/usr/local
tc@box:$ sudo ./configure --prefix=/tmp/tcz/usr/local
tc@box:$ sudo make

如果剛剛沒有 make clean 就不會再重編一次

代碼: [選擇]
tc@box:$ sudo make install
tc@box:$ ls /tmp/tcz/usr/local/lib
libevent-2.0.so.5               libevent_core.a                 libevent_extra.so               libevent_pthreads-2.0.so.5.1.9
libevent-2.0.so.5.1.9           libevent_core.la                libevent_openssl-2.0.so.5       libevent_pthreads.a
libevent.a                      libevent_core.so                libevent_openssl-2.0.so.5.1.9   libevent_pthreads.la
libevent.la                     libevent_extra-2.0.so.5         libevent_openssl.a              libevent_pthreads.so
libevent.so                     libevent_extra-2.0.so.5.1.9     libevent_openssl.la             pkgconfig/
libevent_core-2.0.so.5          libevent_extra.a                libevent_openssl.so
libevent_core-2.0.so.5.1.9      libevent_extra.la               libevent_pthreads-2.0.so.5

tc@box:$ cd ../memcached-1.4.17
tc@box:$ sudo ./configure --prefix=/tmp/tcz/usr/local --with-libevent=/usr/lib
tc@box:$ sudo make
tc@box:$ sudo make install

接下來就開始打包成 tcz

代碼: [選擇]
tc@box:$ cd /tmp/tcz
tc@box:$ mkdir memcached
tc@box:$ mv usr memcached
tc@box:$ echo "/tmp/tcz/tce" > .tce_dir
tc@box:$ sudo mv .tce_dir /opt/
tc@box:$ mkdir -p tce/optional
tc@box:$ tcz-pack memcached
Your name please? Yamaka
And your email address? yamaka67@gmail.com 
This information was saved in /home/tc/.tcztoolsrc.
EXIT: A stub info file memcached.tcz.info was created in the current directory.
Please edit it to fill in the missing fields and pack memcached again.

要求在 memcached.tcz.info 填一些資料
反正只是自己在用,就隨便填一下...

代碼: [選擇]
tc@box:$ vi memcached.tcz.info
Title:          memcached.tcz
Description:    memcached & libevent (TESTING)
Version:        v0.1
Author:         ----
Original-site:  ----
Copying-policy: ----
Size:           ----
Extension_by:   Yamaka
Comments:       ----
Change-log:     2014/02/12
Current:        2014/02/12

再 tcz-pack 一次

代碼: [選擇]
tc@box:$ tcz-pack memcached
Packing memcached from ./memcached into /tmp/tcztools/memcached.tcz...
memcached.tcz: OK
Reboot with "norestore lst=none tce=hdxy" and run 'tce-load -i memcached'.
You can 'tcz-submit memcached' afterwards to submit it to the Tiny Core team.
tc@box:$ ls tce/optional
total 1860
-rw-rwS--- 1 tc staff  1.8M Feb 12 08:18 memcached.tcz
-rw-rwS--- 1 tc staff    48 Feb 12 08:18 memcached.tcz.md5.txt

這樣就完成新的 tcz 套件包,將套件包打包丟回 host

代碼: [選擇]
tc@box:$ tar czf /tmp/for-memcached.tar.gz tce
tc@box:$ scp for-memcached.tar.gz yamaka@192.168.1.14:~/tc/repo/.
tc@box:$ exit

如果怕會出錯要重新操作一次就先不要離開。

(host)
代碼: [選擇]
$ cd rootfs64/tmp
$ ls tce/optional
$ sudo tar zxf ../../repo/for-memcached.tar.gz
$ sudo chmod 0644 tce/optional/*
$ sudo chown -R 1001:50 tce
$ ls tce/optional
gcc_libs.tcz          memcached.tcz.md5.txt  openssh.tcz.md5.txt
gcc_libs.tcz.md5.txt  openssh.tcz            openssl-1.0.0.tcz
memcached.tcz         openssh.tcz.dep        openssl-1.0.0.tcz.md5.txt

修改 onboot.lst,加入新的套件包

代碼: [選擇]
$ cd ..
$ sudo vim tmp/tce/onboot.lst
openssh.tcz
memcached.tcz

然後在 home/tc/restore.sh 還要建立一個連結檔跟啟動 memcached

代碼: [選擇]
$ sudo vim home/tc/restore.sh

#!/bin/sh
for fn in $(cat /tmp/tce/onboot.lst); do
  tce-load -i $fn > /dev/null 2>&1
done
sudo cp /usr/local/etc/ssh/sshd_config_example /usr/local/etc/ssh/sshd_config
sudo /usr/local/etc/init.d/openssh start > /dev/null 2>&1
sudo ln -s /usr/local/lib/libevent-2.0.so.5 /lib/.
sleep 1s
sudo memcached -u tc -d -m 320 -l 192.168.1.111 -p 11231

打包囉~

代碼: [選擇]
$ sudo find | sudo cpio -o -H newc | gzip -9 > ../x64/boot/rootfs64.gz
$ mkisofs -l -J -R -V TC-x64 -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o ../iso/TC-x64-v1.0.4-memcached.iso ../x64

新的 iso 掛上 vm 啟動
代碼: [選擇]
-----
$ scp ../iso/TC-x64-v1.0.4-memcached.iso yamaka@uYmk:~/tmp/.
$ cd ~/tc
$ sudo git add rootfs64
$ sudo git commit -m "memcached iso 製作完成!"

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
(Part 5 PXE boot)

最後工作就是將 TC-x64-v1.0.4-memcached.iso 掛載到 PXE Server
這樣才是真正完成『無碟』的 memcached server

我本來就有一個用 dnsmasq 架設的 PXE Server,只要掛上新的 iso 檔
再改一下開機選單就可以了

(host)
代碼: [選擇]
$ cd ~/tc
$ scp iso/TC-x64-v1.0.4-memcached.iso yamaka@192.168.1.244:~/.

(PXE Server)
$ cd /var/lib/tftpboot
$ sudo mv ~/TC-x64-v1.0.4-memcached.iso .
$ sudo mkdir boot/TC-x64-memcached
$ sudo mount -o loop,ro TC-x64-v1.0.4-memcached.iso boot/TC-x64-memcached
$ sudo vim /var/lib/tftpboot/pxelinux.cfg/default

LABEL TinyCore x64 memcached 192.168.1.111
MENU LABEL Tiny Core x64 5.1 Memcached Server
kernel boot/TC-x64-memcached/boot/vmlinuz64
append initrd=boot/TC-x64-memcached/boot/rootfs64.gz,boot/TC-x64-memcached/boot/modules64.gz

OK!vm 卸掉 iso 檔重新開機...

(如附圖)

選第一個開機......

很可惜,雖然成功開機,但是卻出現問題
tcz 檔沒有掛載上去,也不知道是啥原因
到是有找到兩篇相關文章

http://forum.tinycorelinux.net/index.php?topic=3937.10;wap2
http://ebalaskas.gr/wiki/TinyCoreLinux

兩篇都說要將 tcz 解開打包進 rootfs,也沒說原因,也許是 PXE 開機的限制吧
那就來試看看吧

代碼: [選擇]
-----
$ cd ~/tc
$ sudo git add rootfs64
$ sudo git commit -m "memcached iso PXE boot 有問題"
$ sudo git checkout 898d190
$ sudo git checkout -b extract-tcz
-----

(host)
代碼: [選擇]
$ cd ~/tc
$ mkdir -p tczfs/tcz
$ cd tczfs
$ cp ../rootfs64/tmp/tce/optional/*.tcz tcz
$ cd tcz

unsquashfs 不接受用萬用字元,所以用 for 來解開所有 tcz 檔

代碼: [選擇]
$ for fn in $(ls tcz/*); do unsquashfs -f $fn;done
$ cd squashfs-root

打包成 fs 格式

代碼: [選擇]
$ find|cpio -o -H newc|gzip -9 > ../tczfs.gz
23122 blocks
$ cd ../../rootfs64
$ cp ../tczfs/tczfs.gz ../x64/boot/.
$ sudo rm -rf tmp/tce
$ sudo mkdir var/ssh
$ sudo chmod 0755 var/ssh
$ sudo vim home/tc/restore.sh

修改開機設定,將 tczfs.gz 加入

代碼: [選擇]
$ sudo vim ../x64/boot/isolinux/isolinux.cfg
label corepure64
        kernel /boot/vmlinuz64
        initrd /boot/rootfs64.gz,/boot/modules64.gz,/boot/tczfs.gz
        append loglevel=3

打包
代碼: [選擇]
$ sudo find | sudo cpio -o -H newc | gzip -9 > ../x64/boot/rootfs64.gz
$ sudo mkisofs -l -J -R -V TC-x64 -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o ../iso/TC-x64-v1.0.5-memcached.iso ../x64

先用 iso 開機看看,如果正常開機並啟動 ssh & memcached 再掛 PXE

(PXE Server)
代碼: [選擇]
$ cd /var/lib/tftpboot
$ sudo umount boot/TC-x64-memcached
$ sudo mv ~/TC-x64-v1.0.5-memcached.iso .
$ sudo mkdir boot/TC-x64-memcached
$ sudo mount -o loop,ro TC-x64-v1.0.5-memcached.iso boot/TC-x64-memcached
$ sudo vim /var/lib/tftpboot/pxelinux.cfg/default

LABEL TinyCore x64 memcached 192.168.1.111
MENU LABEL Tiny Core x64 5.1 Memcached Server
kernel boot/TC-x64-memcached/boot/vmlinuz64
append initrd=boot/TC-x64-memcached/boot/rootfs64.gz,boot/TC-x64-memcached/boot/modules64.gz,boot/TC-x64-memcached/boot/tczfs.gz

vm 移除 iso 檔重新開機...

代碼: [選擇]
-----
$ scp ../iso/TC-x64-v1.0.5-memcached.iso yamaka@192.168.1.244:~/.
$ scp ../iso/TC-x64-v1.0.5-memcached.iso yamaka@uYmk:~/tmp/.
$ cd ~/tc
$ sudo git rm -r tmp/tce
$ sudo git add rootfs64
$ sudo git commit -m "memcached PXE Boot done"
$ sudo git log --all --graph --color --decorate --oneline

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
(Part 6 最後修飾)

啟動 memcached 時是要指定使用固定大小的記憶體
但也許這次主機只有256MB可用,下次可能高達8GB可用
必須要能依照目前系統所擁有的記憶體量來自動設定
最簡單的方式就是抓 free 指令的資料來計算

代碼: [選擇]
tc@box:~$ free -mt
             total         used         free       shared      buffers
Mem:           495           39          456            0            0
-/+ buffers:                 39          456
Swap:          113            0          113
tc@box:~$ free -mt|grep Mem|echo $(expr $(awk '{print $4}') - 10)
445

將這行加到 memcached 啟動指令裡

(host)
代碼: [選擇]
$ cd ~/tc/rootfs64
$ sudo vim home/tc/restore.sh

MSIZE=$(free -mt|grep Mem|echo $(expr $(awk '{print $4}') - 10))
sudo memcached -u tc -d -m $MSIZE -l 192.168.1.111 -p 11231

打包掛上 PXE 開機後的結果

代碼: [選擇]
tc@box:~$ free -mt
             total         used         free       shared      buffers
Mem:           495           40          455            0            0
-/+ buffers:                 40          455
Swap:          111            0          111
tc@box:~$ ps ax|grep mem
  427 tc       memcached -u tc -d -m 445 -l 192.168.1.111 -p 11231
  484 tc       grep mem

---------
以上,這是我的第一個嵌入式系統 ;D


PS:好累啊~~ 有什麼問題或是可以改進的地方,一起來討論 ^_^