Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

UEFIで始めるLinux From Scratch

217 views

Published on

第8回 自作OSもくもく会
https://atnd.org/events/90124
の発表スライドです。

Published in: Software
  • Be the first to comment

  • Be the first to like this

UEFIで始めるLinux From Scratch

  1. 1. UEFIで始める Linux From Scratch @yohgami 2017/09/18
  2. 2. 自己紹介 ● 大神 祐真 – http://yuma.ohgami.jp ● 組み込みCPUボードメーカーの技術営業 ● 趣味: フルスクラッチでのOS自作 – OS5: QEMU(i386)上で動作 ● ブートローダー・カーネル・ユーザーランドをシンプルに実装 ● 全体で3000行程度(内カーネル2000行程度) – PoiOS(OS6): 実機のUEFIファームウェア上で動作 ● UEFIの機能を呼び出すだけでOSっぽいものが作れるのでは? ● CUI・GUIでファイル操作が行える1000行弱の実行バイナリ
  3. 3. 自己紹介 Ohgami's Commentary on OS5 フルスクラッチで作る! UEFIベアメタルプログラミング フルスクラッチ自作OS(OS5)の 全ソースコード+コメンタリー本 エディタとコンパイラのみで UEFIファームウェアを叩き OSっぽいもの(poiOS)を作る本
  4. 4. 今日お話すること ● UEFIだとLFSを簡単に始められる!
  5. 5. 今日お話すること ● UEFIだとLFSを簡単に始められる! ● Linuxカーネルが起動し、 /bin/shが立ち上がるまでを QEMUと実機でやってみる
  6. 6. QEMU
  7. 7. 1. Linuxカーネルを用意 1.1. ダウンロード https://www.kernel.org/ $ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.13.2.tar.xz $ tar Jxf linux-4.13.2.tar.xz
  8. 8. 1. Linuxカーネルを用意 1.2. ビルド環境構築 $ sudo apt-get build-dep linux-image-$(uname -r) $ sudo apt install libncurses5-dev-dev
  9. 9. 1. Linuxカーネルを用意 1.3. カーネルコンフィグ設定 $ cd linux-4.13.2 $ make x86_64_defconfig $ make menuconfig => CONFIG_EFI_STUB を有効化
  10. 10. 1. Linuxカーネルを用意 1.4. ビルド $ make -j $(nproc) ・・・ ・・・ ・・・ $ ls arch/x86/boot/bzImage arch/x86/boot/bzImage
  11. 11. 2. BusyBoxを用意 2.1. ダウンロード https://busybox.net/ $ wget http://busybox.net/downloads/busybox-1.27.2.tar.bz2 $ tar jxf busybox-1.27.2.tar.bz2
  12. 12. 2. BusyBoxを用意 2.2. ビルド環境構築 $ sudo apt-get build-dep busybox
  13. 13. 2. BusyBoxを用意 2.3. コンフィグ設定 $ cd busybox-1.27.2 $ make defconfig $ make menuconfig => CONFIG_STATIC を有効化
  14. 14. 2. BusyBoxを用意 2.4. ビルド $ make -j $(nproc) ・・・ ・・・ ・・・ $ ls busybox busybox
  15. 15. 3. 配置 3.1. パーティションと見なすディレクトリ作成 $ mkdir p1 p2 3.2. Linuxカーネルイメージと   BusyBoxバイナリを配置 $ cp linux-4.13.2/arch/x86/boot/bzImage p1/bzImage.efi $ mkdir p2/bin $ cp busybox-1.27.2/busybox p2/bin/busybox $ ln -s busybox p2/bin/sh
  16. 16. 4. QEMUで起動 4.1. QEMUとUEFIファームウェアインストール $ sudo apt install qemu-system-x86 ovmf 4.1. QEMU起動 $ qemu-system-x86_64 -bios OVMF.fd -hda fat:p1 -hdb fat:p2 4.1. UEFI ShellからLinux起動 Shell> fs0: fs0> bzImage.efi root=/dev/sdb1 init=/bin/sh rootwait 終了はウィンドウを閉じてしまっても良いが、 Ctrl+Alt+2 でQEMUモニターへ入り、quitコマンドでも終了できる
  17. 17. 実機
  18. 18. 1. USBフラッシュメモリ準備 1.1. パーティション作成 $ sudo fdisk /dev/sdb Welcome to fdisk (util-linux 2.25.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): d Partition number (1,2, default 2): Partition 2 has been deleted. Command (m for help): d Selected partition 1 Partition 1 has been deleted. Command (m for help): d No partition is defined yet! Could not delete partition 1 既存のパーティションを全て削除
  19. 19. 1. USBフラッシュメモリ準備 1.1. パーティション作成 Command (m for help): o Created a new DOS disklabel with disk identifier 0x4c953ff5. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (1-4, default 1): First sector (2048-31277055, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-31277055, default 31277055): +128M Created a new partition 1 of type 'Linux' and of size 128 MiB. UEFIファームウェア用パーティション作成
  20. 20. 1. USBフラッシュメモリ準備 1.1. パーティション作成 Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (2-4, default 2): First sector (264192-31277055, default 264192): Last sector, +sectors or +size{K,M,G,T,P} (264192-31277055, default 31277055): Created a new partition 2 of type 'Linux' and of size 14.8 GiB. ルートファイルシステム用パーティション作成
  21. 21. 1. USBフラッシュメモリ準備 1.1. パーティション作成 Command (m for help): t Partition number (1,2, default 2): 1 Hex code (type L to list all codes): b If you have created or modified any DOS 6.x partitions, please see the fdisk documentation for additional information. Changed type of partition 'Linux' to 'W95 FAT32'. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. パーティションタイプ設定、設定反映
  22. 22. 1. USBフラッシュメモリ準備 1.2. フォーマット $ sudo mkfs.vfat -F 32 /dev/sdb1 $ sudo mkfs.ext4 /dev/sdb2
  23. 23. 2. 配置 2.1. マウント $ mkdir mp1 mp2 $ sudo mount /dev/sdb1 mp1 $ sudo mount /dev/sdb2 mp2 2.3. アンマウント $ sudo umount mp1 $ sudo umount mp2 2.2. Linuxカーネルイメージと   BusyBoxバイナリを配置 $ sudo cp p1/* mp1/ $ sudo cp -r p2/* mp2/
  24. 24. 2. 配置 2.3. UEFI Shellをダウンロード、配置 $ wget https://github.com/tianocore/edk2/raw/master/EdkShellBinPkg/FullShell/X64/Shell_Full.efi 2.3. アンマウント $ sudo umount mp1 $ sudo umount mp2 https://github.com/tianocore/edk2/tree/master/EdkShellBinPkg/FullShell/X64 $ sudo mkdir -p mp1/EFI/BOOT $ sudo cp Shell_Full.efi mp1/EFI/BOOT/BOOTX64.EFI
  25. 25. 3. 実機で起動 3.1. 起動ディスクの優先順位を変更し、   USBフラッシュメモリから起動 3.2. UEFI ShellからLinux起動 PCメーカー毎に、適宜行ってください Shell> fs0: fs0> bzImage.efi root=/dev/sdb2 init=/bin/sh rootwait shutdown、haltコマンド等無いので、電源ボタンで終了させてください ルートファイルシステム(USBフラッシュメモリ第2パーティション)は、 Read Onlyでマウントされているため、ファイルシステム破壊の問題はありません。
  26. 26. おまけ: debootstrap LFSでは無くなりますが、 aptが使えるルートファイルシステムを 手っ取り早く構築するには、 debootstrap というツールがあります。 $ sudo mount /dev/sdb2 mp2 $ sudo debootstrap sid mp2 (Debianのunstableを構築) その後、UEFI Shellから以下の様なコマンドで 起動できます Shell> fs0: fs0> bzImage.ef root=/dev/sdb2 rootwait
  27. 27. 技術書典3に参加します! 配置: か13 新刊 【技術書典3】 日時: 2017/10/22(日)    11:00〜17:00 場所: アキバ・スクエア

×