スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Raspberry Piへbuildrootでのrootfs構築

Raspberry Piへbuildrootで作成したrootfsを入れてシリアル(UART0)から入出力できる所まで行います。


Raspberry Pi を購入して 2年超となりました。私の使用方法はかなり確立していて、MPDを入れてUSB-DACとセットでジュークボックスとして使用しています。他の使い道は…今の所ないです。

rootfsに入れているディストリビューションはraspbianですが、これってジュークボックスとして使用するだけなら多くの機能が入りすぎています。不要な物を削って使用していたのですが、最近になってbuildrootの存在を思い出した。

buildrootは小ROM/RAM構成のハードにもLinuxを入れられる様にしたディストリビューション(?)で大概のコマンドは busybox という1つの代替コマンドで構成されています。代替できないコマンドはそれぞれの適切なバージョンを引っ張ってきて組み込みます。その内容を眺めていると…MPDの文字がありました。そう、buildrootでもMPDサーバとして動作させることが出来るのだ(と思う)。また、docを見ると Raspberry Pi にも対応していそうな事が書かれていたので、早速これを試してみる事にした。自力でソースコードをコンパイルしてインストールできるのであればディストリビューションに入って無くてもインストールすることは出来るのですがね。

buildrootは頻繁に更新されていてその最新をgitで持ってくる事ができるのですが、一定のレベルで固められた版が用意されていて、それをダウンロードできるので、今回はそれを持て来て構築します(gitで取得してtagをたどってcheckoutしてもおそらく同じ物になります)。因みに、buildroot自体の容量は小さい。が、入れるコマンド等を選択した後にそれぞれのソースコードをダウンロードしつつ全てコンパイルするので、コンパイル時はオブジェクトも含めるとそれなりな容量になるのと、時間がかかるので要注意です。……使用量を調べてみるとデフォルト構成でコンパイル中のオブジェクトを含めても4Mbyteくらいしか使用していなかった…。以外に少ない事にビックリ!

クロスコンパイルはWindows7(64bit)にインストールしたVMware上にUbuntu 14.04(32bit)をインストールし、その上で行いました。

一発目はデフォルト設定でとにかく起動するかの確認を行います。
以下の順でコンパイルをしました。

$ sudo apt-get install build-essential bison flex gettext libncurses5-dev texinfo autoconf automake libtool
$ wget http://buildroot.uclibc.org/downloads/buildroot-2014.11.tar.bz2
$ tar xvf buildroot-2014.11.tar.bz2
$ cd ./buildroot-2014.11/
$ make raspberrypi_defconfig
$ make


手順は buildroot-2014.11/board/raspberry_pi/readme.txt に記載されていました。
buildroot-2014.11/config/raspberrypi_defconfig に反映する内容が書かれているのですが、これ、カーネルも持ってきてコンパイルする事になってます。相当時間がかかりそうだったので、makeを実行してからしばし買い物に出かけて…6時間後くらいに様子を見てみたらコンパイルが終了していました。これは回線の速度にもよるので一概に何時間かかるとは言えないです。

もともと、kernelをコンパイルしていた環境だったのでコマンドの不足もなくエラーもなくすんなりと正常終了していました(apt-getの行は過去の記憶をたどって入れた物を記載しています)。これをSDカードに書き込みます。SDカードは raspbian を入れた物をそのまま使用したので、ファイルを全部削除するだけであえてフォーマットしてないです。構成は第一パーティションがvfat,約60Mbyte、第二パーティションがext4,約2Gbyte。

$ sudo rm -rf /media/boot/*
$ sudo rm -rf /media/rootfs/*
$ cp ./output/images/zImage /media/boot/
$ cp ./output/images/rpi-firmware/* /media/boot/
$ sudo tar xvf ./output/images/rootfs.tar -C /media/rootfs/


このSDカードをRaspberry Piへ装着して実行してみる。Raspberry Piとはシリアル-USB変換ケーブルで繋いでいるので、システム出力は全て拾える様にしている……。

Uncompressing Linux... done, booting the kernel.


あれっ!?
電源を入れてもこんな出力しか出てこないです…。

これはおそらくbootloaderの出力。カーネル以降のログが出力されていない状態。気になったので、HDMI出力をモニタに繋いでみると……カーネル以降の起動ログとログインプロンプトが表示されているではありませんか!! ヘッドレス(Headless:モニター、キーボードを繋がない)構成で使用する予定なので、このままでは都合が悪いです。まだLANの設定もしてないのでSSHで入る事もできないし。

とにかく調査開始です。
カーネル以降の出力がHDMI側へ出ているという事は、起動時のgettyのポート指定が間違っているという事。SDカードの中身をPCで確認してみることに。

rootfsの内容を確認してみると、普段使用しているLinux内容と大違い。まっ、ディストリビューション毎に構成が違うのはLinux(広義)の常ですからね。そこで分かったことはbuildrootのinitはSysVinit…というか busybox init !? だという事。普段使用しているUbuntuはUpstartですからね。まっ、知識の無いsystemdが使われてるよりましです。

/etc/inittab の内容を確認するとシリアル出力先がtty1になってました。これをRaspberry PiのUART0(ttyAMA0)に設定します。

# tty1::respawn:/sbin/getty -L  tty1 115200 vt100 # GENERIC_SERIAL
ttyAMA0::respawn:/sbin/getty -L ttyAMA0 115200 vt100 # GENERIC_SERIAL


それと起動時にkernelの引数として渡している値も変更します。これは第一パーティションに入れている cmdline.txt に記載してある内容を編集します。consoleの所です。何故かconsoleは2回定義されていたので不要と思われる方を削除しておきました。

dwc_otg.fiq_fix_enable=1 sdhci-bcm2708.sync_after_dma=0 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootwait


で再起動してみると、カーネル起動以降の出力もUART0の方へ出力されるようになりました。

Uncompressing Linux... done, booting the kernel.
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 3.12.28-quick (jujurou@ubuntu) (gcc version 4.8.3 (Buildroot 2014.11) ) #1 PREEMPT Fri Jan 9 12:15:18 JST 2015
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: BCM2708
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 104648
[ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=1920 bcm2708_fb.fbheight=1080 bcm2708.boardrev=0xf bcm2708.serial=0xb9e9487d smsc95xx.macaddr=B8:27:EB:E9:48:7D sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000 dwc_otg.fiq_fix_enable=1 sdhci-bcm2708.sync_after_dma=0 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootwait
[ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[ 0.000000] Memory: 411608K/421888K available (3867K kernel code, 195K rwdata, 1684K rodata, 135K init, 610K bss, 10280K reserved)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xda000000 - 0xff000000 ( 592 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xd9c00000 ( 412 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc0573fcc (5552 kB)
[ 0.000000] .init : 0xc0574000 - 0xc0595c38 ( 136 kB)
[ 0.000000] .data : 0xc0596000 - 0xc05c6ca0 ( 196 kB)
[ 0.000000] .bss : 0xc05c6cac - 0xc065f6d8 ( 611 kB)
[ 0.000000] Preemptible hierarchical RCU implementation.
[ 0.000000] NR_IRQS:394
[ 0.000000] sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 4294967ms
[ 0.000000] Switching to timer-based delay loop
[ 0.000000] Console: colour dummy device 80x30
[ 0.000472] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=10000)
[ 0.000495] pid_max: default: 32768 minimum: 301
[ 0.000836] Mount-cache hash table entries: 512
[ 0.001588] CPU: Testing write buffer coherency: ok
[ 0.001974] Setting up static identity map for 0xc03ccf00 - 0xc03ccf5c
[ 0.003514] devtmpfs: initialized
[ 0.019360] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
[ 0.019959] regulator-dummy: no parameters
[ 0.020299] NET: Registered protocol family 16
[ 0.025172] DMA: preallocated 4096 KiB pool for atomic coherent allocations
[ 0.025508] cpuidle: using governor ladder
[ 0.025530] cpuidle: using governor menu
[ 0.025998] bcm2708.uart_clock = 0
[ 0.027300] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[ 0.027320] hw-breakpoint: maximum watchpoint size is 4 bytes.
[ 0.027335] mailbox: Broadcom VideoCore Mailbox driver
[ 0.027433] bcm2708_vcio: mailbox at f200b880
[ 0.027512] bcm_power: Broadcom power driver
[ 0.027532] bcm_power_open() -> 0
[ 0.027544] bcm_power_request(0, 8)
[ 0.528256] bcm_mailbox_read -> 00000080, 0
[ 0.528273] bcm_power_request -> 0
[ 0.528284] Serial: AMBA PL011 UART driver
[ 0.528439] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83, base_baud = 0) is a PL011 rev3
[ 0.846096] console [ttyAMA0] enabled
[ 0.871486] bio: create slab at 0
[ 0.876786] SCSI subsystem initialized
[ 0.880865] usbcore: registered new interface driver usbfs
[ 0.886555] usbcore: registered new interface driver hub
[ 0.892044] usbcore: registered new device driver usb
[ 0.897510] Advanced Linux Sound Architecture Driver Initialized.
[ 0.904736] Switched to clocksource stc
[ 0.908890] FS-Cache: Loaded
[ 0.911990] CacheFiles: Loaded
[ 0.926876] NET: Registered protocol family 2
[ 0.932558] TCP established hash table entries: 4096 (order: 3, 32768 bytes)
[ 0.939910] TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.946470] TCP: Hash tables configured (established 4096 bind 4096)
[ 0.952893] TCP: reno registered
[ 0.956169] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 0.962016] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.968634] NET: Registered protocol family 1
[ 0.973427] RPC: Registered named UNIX socket transport module.
[ 0.979438] RPC: Registered udp transport module.
[ 0.984139] RPC: Registered tcp transport module.
[ 0.988868] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 0.996073] bcm2708_dma: DMA manager at f2007000
[ 1.000775] bcm2708_gpio: bcm2708_gpio_probe c05a2150
[ 1.006195] vc-mem: phys_addr:0x00000000 mem_base=0x1ec00000 mem_size:0x20000000(512 MiB)
[ 1.017084] FS-Cache: Netfs 'nfs' registered for caching
[ 1.022778] NFS: Registering the id_resolver key type
[ 1.028030] Key type id_resolver registered
[ 1.032217] Key type id_legacy registered
[ 1.036620] msgmni has been set to 803
[ 1.041761] io scheduler noop registered
[ 1.045834] io scheduler deadline registered
[ 1.050128] io scheduler cfq registered (default)
[ 1.055255] BCM2708FB: allocated DMA memory 59540000
[ 1.060258] BCM2708FB: allocated DMA channel 0 @ f2007000
[ 1.089326] Console: switching to colour frame buffer device 240x67
[ 1.113896] bcm2708_rng_init=da41a000
[ 1.126372] brd: module loaded
[ 1.133907] loop: module loaded
[ 1.137474] vchiq: vchiq_init_state: slot_zero = 0xda004000, is_master = 0
[ 1.145539] usbcore: registered new interface driver ax88179_178a
[ 1.151799] usbcore: registered new interface driver smsc95xx
[ 1.157823] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[ 1.363925] Core Release: 2.80a
[ 1.367157] Setting default values for core params
[ 1.371982] Finished setting default values for core params
[ 1.577735] Using Buffer DMA mode
[ 1.581058] Periodic Transfer Interrupt Enhancement - disabled
[ 1.586911] Multiprocessor Interrupt Enhancement - disabled
[ 1.592479] OTG VER PARAM: 0, OTG VER FLAG: 0
[ 1.596865] Dedicated Tx FIFOs mode
[ 1.600605] WARN::dwc_otg_hcd_init:1042: FIQ DMA bounce buffers: virt = 0xda422000 dma = 0x59594000 len=9024
[ 1.610495] FIQ FSM acceleration enabled for :
[ 1.610495] Non-periodic Split Transactions
[ 1.610495] Periodic Split Transactions
[ 1.610495] High-Speed Isochronous Endpoints
[ 1.627266] WARN::hcd_init:473: FIQ at 0xc02c6584
[ 1.631968] WARN::hcd_init:474: FIQ ASM at 0xc02c685c length 36
[ 1.637932] WARN::hcd_init:500: MPHI regs_base at 0xda41c000
[ 1.643604] dwc_otg bcm2708_usb: DWC OTG Controller
[ 1.648561] dwc_otg bcm2708_usb: new USB bus registered, assigned bus number 1
[ 1.655878] dwc_otg bcm2708_usb: irq 32, io mem 0x00000000
[ 1.661389] Init: Port Power? op_state=1
[ 1.665413] Init: Power Port (0)
[ 1.668924] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.675762] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 1.682982] usb usb1: Product: DWC OTG Controller
[ 1.687719] usb usb1: Manufacturer: Linux 3.12.28-quick dwc_otg_hcd
[ 1.693983] usb usb1: SerialNumber: bcm2708_usb
[ 1.699449] hub 1-0:1.0: USB hub found
[ 1.703267] hub 1-0:1.0: 1 port detected
[ 1.708797] bcm2708 watchdog, heartbeat=10 sec (nowayout=0)
[ 1.714627] bcm2835-cpufreq: min=700000 max=700000 cur=700000
[ 1.720572] bcm2835-cpufreq: switching to governor powersave
[ 1.726310] bcm2835-cpufreq: switching to governor powersave
[ 1.732053] sdhci: Secure Digital Host Controller Interface driver
[ 1.738275] sdhci: Copyright(c) Pierre Ossman
[ 1.742822] mmc-bcm2835: Unable to initialise DMA channels. Falling back to PIO
[ 1.784794] Load BCM2835 MMC driver
[ 1.788512] sdhci-pltfm: SDHCI platform and OF driver helper
[ 1.794466] usbcore: registered new interface driver usbhid
[ 1.800216] usbhid: USB HID core driver
[ 1.812551] TCP: cubic registered
[ 1.816004] NET: Registered protocol family 17
[ 1.822706] Key type dns_resolver registered
[ 1.837055] regulator-dummy: incomplete constraints, leaving on
[ 1.846233] ALSA device list:
[ 1.849217] #0: bcm2835 ALSA
 1.852722] Waiting for root device /dev/mmcblk0p2...
[ 1.866272] mmc0: host does not support reading read-only switch. assuming write-enable.
[ 1.874496] mmc0: new SDHC card at address 9c7d
[ 1.879629] mmcblk0: mmc0:9c7d SD08G 7.40 GiB
[ 1.886344] mmcblk0: p1 p2
[ 1.904974] Indeed it is in host mode hprt0 = 00021501
[ 1.966232] EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities
[ 1.979093] EXT4-fs (mmcblk0p2): couldn't mount as ext2 due to feature incompatibilities
[ 2.011844] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[ 2.020145] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 2.037752] devtmpfs: mounted
[ 2.042094] Freeing unused kernel memory: 132K (c0574000 - c0595000)
[ 2.095153] usb 1-1: new high-speed USB device number 2 using dwc_otg
[ 2.102099] Indeed it is in host mode hprt0 = 00001101
[ 2.203310] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered
Starting logging: OK
Initializing random number generator... [ 2.315399] usb 1-1: New USB device found, idVendor=0424, idProduct=9512
[ 2.322138] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
done.
[ 2.375752] hub 1-1:1.0: USB hub found
Starting network...
[ 2.395685] hub 1-1:1.0: 3 ports detected

Welcome to Buildroot
buildroot login: [ 2.694925] usb 1-1.1: new high-speed USB device number 3 using dwc_otg
[ 2.815201] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[ 2.822089] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.832911] smsc95xx v1.0.4
[ 2.898830] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:e9:48:7d

Welcome to Buildroot
buildroot login:


因みにHDMIの出力はこんな感じでラズベリーの絵が表示されるだけになりました(元はこの下に上記のログが出力されてました)。

rpi_builroot_01.jpg

この状態でのRAMの使用状況はというと…。

# free
total used free shared buffers
Mem: 411740 8960 402780 0 512
-/+ buffers: 8448 403292
Swap: 0 0 0


あれれっ、totalのメモリ容量が少ない気が…。どうやらbuildrootで生成されるconfig.txtとimagesディレクトリに展開されるFirmwareはGPU用のメモリをそれなりに確保する方(デフォルト)のみでGPU使用メモリを最小限にした構成の方はファイルすら置かれていないようです(Memのtotalの量によって判断)。この部分の修正方法は簡単。必要なファイル(fixup_cd.dat, start_cd.elf)を持ってきてconfig.txtの内容を編集するだけ。

$ cp ./output/build/rpi-firmware-53162d55fa557e60453c0652aa00fa3daf4ed618/boot/fixup_cd.dat
$ cp ./output/build/rpi-firmware-53162d55fa557e60453c0652aa00fa3daf4ed618/boot/start_cd.elf


config.txt は gpu_mem=16 を追記します。gpu_mem_256, gpu_mem_512 は不要となるのでコメントアウトしておきました。

arm_freq=700
core_freq=250
kernel=zImage
disable_overscan=1
# gpu_mem_256=100
# gpu_mem_512=100
sdram_freq=400
over_voltage=0

#set GPU mem size
gpu_mem=16


これでGPU使用RAMを最小限にすることが出来ます。が、今のカーネルでは描画用の処理が走ってしまうのでこの部分も削除しておく必要があります。カーネルの再コンパイルとなるのでどのように設定するんだ? と思ったら、ちゃんと方法が用意されてました。以下のコマンドを打つとカーネルの menuconfig を実行出来ます。これはbuildrootのマニュアルにちゃんと書いてあります。

make linux-menuconfig


Device Drivers → Graphics support に出てくる項目全てのチェックを外します。後は make をするとできあがりですが、rootfs.tar も書き換えられちゃうので注意が必要です。/etc/inittab の編集をしないとまたシステム出力が出てくれません。実はこの点に限っては解決策があって、.config の内容を編集することで自動生成してくれます。buildrootのマニュアルを見直した時に気がつきました。

#
# getty options
#
BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y
BR2_TARGET_GENERIC_GETTY_BAUDRATE="115200"
BR2_TARGET_GENERIC_GETTY_TERM="vt100"
BR2_TARGET_GENERIC_GETTY_OPTIONS=""


これらを実施してSDカードに書き込んだ結果、以下の様になりました。

# free
total used free shared buffers
Mem: 497264 8388 488876 0 500
-/+ buffers: 7888 489376
Swap: 0 0 0


そして、HDMIに出力される内容はというと、おそらくBCM2835のデフォルト出力内容であろう内容が表示さてました。

rpi_builroot_02.jpg


既にDHCPをつかってLANに繋がるところまで確認していますが、その内容はおいおいという事で…。
スポンサーサイト

tag : RaspberryPi

tag : buildroot

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

RaspberryPi ぺるけ Linux TRminiWatterPart4 トランジスタ式ミニワッター MPD イーサネットコンバータ OpenOCD DAC FON2405E buildroot FM3ペリフェラル BeagleBoneBlack library FM3評価ボード ODROID-U2 mingw OpenGL TL-WR700N Edison bitbake KiCad VMware シングル FM4 ミニワッター 6N6P 計測 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。