├── .gitmodules ├── .github ├── dependabot.yml └── workflows │ └── build-and-push.yml ├── variant └── vnc │ ├── novnc.sh │ └── Dockerfile ├── LICENSE ├── tools_def.txt.diff ├── amd64 └── Dockerfile ├── arm64 └── Dockerfile └── README.md /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "mikanos-build"] 2 | path = mikanos-build 3 | url = https://github.com/uchan-nos/mikanos-build.git 4 | branch = master 5 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "gitsubmodule" 4 | directory: "/" 5 | schedule: 6 | interval: "monthly" 7 | - package-ecosystem: "github-actions" 8 | directory: "/" 9 | schedule: 10 | interval: "monthly" 11 | groups: 12 | github-actions: 13 | patterns: 14 | - "*" 15 | -------------------------------------------------------------------------------- /variant/vnc/novnc.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | 3 | # https://github.com/microsoft/vscode-dev-containers/blob/e646d525e1e5ca5d872977905eb23424e36dd558/script-library/docs/desktop-lite.md 4 | prefix="" 5 | if [[ $(id -u) -ne 0 ]]; then 6 | prefix="sudo" 7 | fi 8 | 9 | if [[ -d "/usr/local/novnc" ]] && [[ $(ps -Af | grep /usr/local/novnc/noVNC*/utils/launch.sh | grep -v grep) == '' ]]; then 10 | $prefix bash -c " 11 | while :; do 12 | $prefix /usr/local/novnc/noVNC*/utils/launch.sh --listen ${NOVNC_PORT:-6080} --vnc localhost:${VNC_PORT:-5900}; 13 | done 2>&1" > /dev/null & 14 | fi 15 | 16 | exec "$@" 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Sarisia 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /variant/vnc/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG BASE=ghcr.io/sarisia/mikanos:latest 2 | FROM ${BASE} 3 | 4 | ARG NOVNC_VERSION=1.2.0 5 | ARG WEBSOCKIFY_VERSION=0.9.0 6 | 7 | RUN apt-get update \ 8 | && apt-get install -y --no-install-recommends \ 9 | python-is-python3 \ 10 | python3-numpy \ 11 | && apt-get clean -y \ 12 | && rm -rf /var/lib/apt/lists 13 | 14 | # Install noVNC 15 | # Thanks https://github.com/microsoft/vscode-dev-containers/blob/e646d525e1e5ca5d872977905eb23424e36dd558/script-library/docs/desktop-lite.md 16 | RUN mkdir -p /usr/local/novnc \ 17 | && curl -L -o /tmp/novnc.zip https://github.com/novnc/noVNC/archive/v${NOVNC_VERSION}.zip \ 18 | && unzip /tmp/novnc.zip -d /usr/local/novnc/ \ 19 | && cp /usr/local/novnc/noVNC-${NOVNC_VERSION}/vnc.html /usr/local/novnc/noVNC-${NOVNC_VERSION}/index.html \ 20 | && curl -L -o /tmp/websockify.zip https://github.com/novnc/websockify/archive/v${WEBSOCKIFY_VERSION}.zip \ 21 | && unzip /tmp/websockify.zip -d /usr/local/novnc/ \ 22 | && ln -sf /usr/local/novnc/websockify-${WEBSOCKIFY_VERSION} /usr/local/novnc/noVNC-${NOVNC_VERSION}/utils/websockify \ 23 | && rm -rf /tmp/novnc.zip /tmp/websockify.zip 24 | 25 | COPY novnc.sh /usr/local/share 26 | 27 | ENTRYPOINT ["/usr/local/share/novnc.sh"] 28 | # We need to re-define CMD here! See: 29 | # https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact 30 | CMD ["/bin/sh", "-c", "echo Container started ; trap \"exit 0\" 15; while sleep 1 & wait $!; do :; done"] 31 | -------------------------------------------------------------------------------- /tools_def.txt.diff: -------------------------------------------------------------------------------- 1 | diff --git a/edk2/Conf/tools_def.txt b/edk2/Conf/tools_def.txt 2 | index 933b316..6cb8dcc 100755 3 | --- a/edk2/Conf/tools_def.txt 4 | +++ b/edk2/Conf/tools_def.txt 5 | @@ -2615,7 +2615,7 @@ DEFINE CLANG38_IA32_PREFIX = ENV(CLANG38_BIN) 6 | DEFINE CLANG38_X64_PREFIX = ENV(CLANG38_BIN) 7 | 8 | DEFINE CLANG38_IA32_TARGET = -target i686-pc-linux-gnu 9 | -DEFINE CLANG38_X64_TARGET = -target x86_64-pc-linux-gnu 10 | +DEFINE CLANG38_X64_TARGET = -target x86_64-linux-gnu 11 | 12 | DEFINE CLANG38_WARNING_OVERRIDES = -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unused-const-variable -Wno-varargs -Wno-unknown-warning-option 13 | DEFINE CLANG38_ALL_CC_FLAGS = DEF(GCC48_ALL_CC_FLAGS) DEF(CLANG38_WARNING_OVERRIDES) -fno-stack-protector -mms-bitfields -Wno-address -Wno-shift-negative-value -Wno-unknown-pragmas -Wno-incompatible-library-redeclaration -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -msoft-float -mno-implicit-float -ftrap-function=undefined_behavior_has_been_optimized_away_by_clang -funsigned-char -fno-ms-extensions -Wno-null-dereference 14 | @@ -2682,7 +2682,7 @@ NOOPT_CLANG38_IA32_DLINK2_FLAGS = DEF(GCC5_IA32_DLINK2_FLAGS) -O0 15 | *_CLANG38_X64_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANG38_X64_TARGET) 16 | *_CLANG38_X64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANG38_X64_TARGET) 17 | 18 | -DEBUG_CLANG38_X64_CC_FLAGS = DEF(CLANG38_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -Oz -flto DEF(CLANG38_X64_TARGET) -g 19 | +DEBUG_CLANG38_X64_CC_FLAGS = DEF(CLANG38_ALL_CC_FLAGS) -m64 "-DEFIAPI=__attribute__((ms_abi))" -mno-red-zone -mcmodel=small -fpie -Oz -flto DEF(CLANG38_X64_TARGET) -g -I/usr/x86_64-linux-gnu/include 20 | DEBUG_CLANG38_X64_DLINK_FLAGS = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Wl,-Oz -Wl,-melf_x86_64 -Wl,--oformat=elf64-x86-64 -Wl,-pie -mcmodel=small 21 | DEBUG_CLANG38_X64_DLINK2_FLAGS = DEF(GCC5_X64_DLINK2_FLAGS) -O3 22 | 23 | -------------------------------------------------------------------------------- /.github/workflows/build-and-push.yml: -------------------------------------------------------------------------------- 1 | name: build and publish container image 2 | on: 3 | push: 4 | pull_request: 5 | workflow_dispatch: 6 | schedule: 7 | # every sunday 3:00 am jst 8 | - cron: '0 18 * * 0' 9 | 10 | env: 11 | TARGET_IMAGE: ghcr.io/sarisia/mikanos 12 | 13 | permissions: 14 | contents: read 15 | packages: write 16 | 17 | jobs: 18 | build: 19 | strategy: 20 | matrix: 21 | include: 22 | - arch: amd64 23 | os: ubuntu-24.04 24 | - arch: arm64 25 | os: ubuntu-24.04-arm 26 | runs-on: ${{ matrix.os }} 27 | steps: 28 | - uses: actions/checkout@v4 29 | 30 | - name: build 31 | run: | 32 | docker buildx build -t ${{ env.TARGET_IMAGE }}:${{ matrix.arch }} --platform linux/${{ matrix.arch }} ${{ matrix.arch }} && \ 33 | docker buildx build -t ${{ env.TARGET_IMAGE }}:vnc-${{ matrix.arch }} --platform linux/${{ matrix.arch }} --build-arg BASE=${{ env.TARGET_IMAGE }}:${{ matrix.arch }} variant/vnc 34 | 35 | - uses: docker/login-action@v3 36 | # run only when images are pushed 37 | if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' 38 | with: 39 | registry: ghcr.io 40 | username: ${{ github.actor }} 41 | password: ${{ github.token }} 42 | 43 | - name: push 44 | # do not push when triggered by push 45 | if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' 46 | run: | 47 | docker push ${{ env.TARGET_IMAGE }}:${{ matrix.arch }} && \ 48 | docker push ${{ env.TARGET_IMAGE }}:vnc-${{ matrix.arch }} 49 | 50 | - uses: sarisia/actions-status-discord@v1 51 | if: always() 52 | with: 53 | webhook: ${{ secrets.DISCORD_WEBHOOK }} 54 | title: ghcr.io/sarisia/mikanos (${{ matrix.arch }}) 55 | 56 | manifest: 57 | runs-on: ubuntu-24.04 58 | needs: build 59 | if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' 60 | steps: 61 | - uses: docker/login-action@v3 62 | with: 63 | registry: ghcr.io 64 | username: ${{ github.actor }} 65 | password: ${{ github.token }} 66 | 67 | - name: amend manifest 68 | run: | 69 | docker manifest create ${{ env.TARGET_IMAGE }}:latest \ 70 | --amend ${{ env.TARGET_IMAGE }}:arm64 \ 71 | --amend ${{ env.TARGET_IMAGE }}:amd64 && \ 72 | docker manifest push ${{ env.TARGET_IMAGE }}:latest && \ 73 | docker manifest create ${{ env.TARGET_IMAGE }}:vnc \ 74 | --amend ${{ env.TARGET_IMAGE }}:vnc-arm64 \ 75 | --amend ${{ env.TARGET_IMAGE }}:vnc-amd64 && \ 76 | docker manifest push ${{ env.TARGET_IMAGE }}:vnc 77 | 78 | - uses: sarisia/actions-status-discord@v1 79 | if: always() 80 | with: 81 | webhook: ${{ secrets.DISCORD_WEBHOOK }} 82 | title: ghcr.io/sarisia/mikanos (amend) 83 | -------------------------------------------------------------------------------- /amd64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/vscode/devcontainers/base:ubuntu-20.04 2 | 3 | ARG USERNAME=vscode 4 | 5 | # install development tools 6 | RUN apt-get update \ 7 | && apt-get install -y --no-install-recommends \ 8 | build-essential \ 9 | llvm-7-dev \ 10 | lld-7 \ 11 | clang-7 \ 12 | nasm \ 13 | acpica-tools \ 14 | uuid-dev \ 15 | qemu-system-x86 \ 16 | qemu-utils \ 17 | xauth \ 18 | unzip \ 19 | # added 20 | qemu-system-gui \ 21 | dosfstools \ 22 | git \ 23 | python3-distutils \ 24 | && apt-get clean -y \ 25 | && rm -rf /var/lib/apt/lists 26 | 27 | # set alternatives 28 | RUN for item in \ 29 | llvm-PerfectShuffle \ 30 | llvm-ar \ 31 | llvm-as \ 32 | llvm-bcanalyzer \ 33 | llvm-cat \ 34 | llvm-cfi-verify \ 35 | llvm-config \ 36 | llvm-cov \ 37 | llvm-c-test \ 38 | llvm-cvtres \ 39 | llvm-cxxdump \ 40 | llvm-cxxfilt \ 41 | llvm-diff \ 42 | llvm-dis \ 43 | llvm-dlltool \ 44 | llvm-dwarfdump \ 45 | llvm-dwp \ 46 | llvm-exegesis \ 47 | llvm-extract \ 48 | llvm-lib \ 49 | llvm-link \ 50 | llvm-lto \ 51 | llvm-lto2 \ 52 | llvm-mc \ 53 | llvm-mca \ 54 | llvm-modextract \ 55 | llvm-mt \ 56 | llvm-nm \ 57 | llvm-objcopy \ 58 | llvm-objdump \ 59 | llvm-opt-report \ 60 | llvm-pdbutil \ 61 | llvm-profdata \ 62 | llvm-ranlib \ 63 | llvm-rc \ 64 | llvm-readelf \ 65 | llvm-readobj \ 66 | llvm-rtdyld \ 67 | llvm-size \ 68 | llvm-split \ 69 | llvm-stress \ 70 | llvm-strings \ 71 | llvm-strip \ 72 | llvm-symbolizer \ 73 | llvm-tblgen \ 74 | llvm-undname \ 75 | llvm-xray \ 76 | ld.lld \ 77 | lld-link \ 78 | clang \ 79 | clang++ \ 80 | clang-cpp \ 81 | ; do \ 82 | update-alternatives --install "/usr/bin/${item}" "${item}" "/usr/bin/${item}-7" 50 \ 83 | ; done 84 | 85 | # switch to unprivileged 86 | USER ${USERNAME} 87 | WORKDIR /home/${USERNAME} 88 | 89 | # build EDK II 90 | # 38c8be123aced4cc8ad5c7e0da9121a181b94251 is known latest good version 91 | # do not use --depth=1 since some git upstream does not support fetching single commit? 92 | # still dont get it why this only happens on arm64 and not amd64 93 | RUN git init edk2 && \ 94 | cd edk2 && \ 95 | git remote add origin https://github.com/tianocore/edk2.git && \ 96 | git fetch --no-recurse-submodules origin 38c8be123aced4cc8ad5c7e0da9121a181b94251 && \ 97 | git checkout FETCH_HEAD && \ 98 | git submodule update --init --recursive && \ 99 | make -C BaseTools/Source/C 100 | 101 | # clone mikanos devenv 102 | RUN git clone https://github.com/uchan-nos/mikanos-build.git osbook 103 | 104 | # download standard libraries 105 | RUN curl -L https://github.com/uchan-nos/mikanos-build/releases/download/v2.0/x86_64-elf.tar.gz \ 106 | | tar xzvf - -C osbook/devenv 107 | 108 | # switch back to root 109 | USER root 110 | 111 | # add ~/osbook/devenv to PATH 112 | ENV PATH="/home/${USERNAME}/osbook/devenv:${PATH}" 113 | 114 | # set X11 server address 115 | ENV DISPLAY=host.docker.internal:0 116 | 117 | # override startup command, taken from VSCode Devcontainer logs 118 | CMD ["/bin/sh", "-c", "echo Container started ; trap \"exit 0\" 15; while sleep 1 & wait $!; do :; done"] 119 | -------------------------------------------------------------------------------- /arm64/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ghcr.io/sarisia/vscode-dev-containers-multiarch/base:ubuntu-20.04 2 | 3 | ARG USERNAME=vscode 4 | 5 | # install development tools 6 | RUN apt-get update \ 7 | && apt-get install -y --no-install-recommends \ 8 | build-essential \ 9 | llvm-7-dev \ 10 | lld-7 \ 11 | clang-7 \ 12 | nasm \ 13 | acpica-tools \ 14 | uuid-dev \ 15 | qemu-system-x86 \ 16 | qemu-utils \ 17 | xauth \ 18 | unzip \ 19 | # added 20 | qemu-system-gui \ 21 | dosfstools \ 22 | git \ 23 | python3-distutils \ 24 | # for arm64 cross-compile 25 | libc6-dev-amd64-cross \ 26 | binutils-x86-64-linux-gnu \ 27 | && apt-get clean -y \ 28 | && rm -rf /var/lib/apt/lists 29 | 30 | # set alternatives 31 | RUN for item in \ 32 | llvm-PerfectShuffle \ 33 | llvm-ar \ 34 | llvm-as \ 35 | llvm-bcanalyzer \ 36 | llvm-cat \ 37 | llvm-cfi-verify \ 38 | llvm-config \ 39 | llvm-cov \ 40 | llvm-c-test \ 41 | llvm-cvtres \ 42 | llvm-cxxdump \ 43 | llvm-cxxfilt \ 44 | llvm-diff \ 45 | llvm-dis \ 46 | llvm-dlltool \ 47 | llvm-dwarfdump \ 48 | llvm-dwp \ 49 | llvm-exegesis \ 50 | llvm-extract \ 51 | llvm-lib \ 52 | llvm-link \ 53 | llvm-lto \ 54 | llvm-lto2 \ 55 | llvm-mc \ 56 | llvm-mca \ 57 | llvm-modextract \ 58 | llvm-mt \ 59 | llvm-nm \ 60 | llvm-objcopy \ 61 | llvm-objdump \ 62 | llvm-opt-report \ 63 | llvm-pdbutil \ 64 | llvm-profdata \ 65 | llvm-ranlib \ 66 | llvm-rc \ 67 | llvm-readelf \ 68 | llvm-readobj \ 69 | llvm-rtdyld \ 70 | llvm-size \ 71 | llvm-split \ 72 | llvm-stress \ 73 | llvm-strings \ 74 | llvm-strip \ 75 | llvm-symbolizer \ 76 | llvm-tblgen \ 77 | llvm-undname \ 78 | llvm-xray \ 79 | ld.lld \ 80 | lld-link \ 81 | clang \ 82 | clang++ \ 83 | clang-cpp \ 84 | ; do \ 85 | update-alternatives --install "/usr/bin/${item}" "${item}" "/usr/bin/${item}-7" 50 \ 86 | ; done 87 | 88 | 89 | # switch to unprivileged 90 | USER ${USERNAME} 91 | WORKDIR /home/${USERNAME} 92 | 93 | # build EDK II 94 | # 38c8be123aced4cc8ad5c7e0da9121a181b94251 is known latest good version 95 | # do not use --depth=1 since some git upstream does not support fetching single commit? 96 | # still dont get it why this only happens on arm64 and not amd64 97 | RUN git init edk2 && \ 98 | cd edk2 && \ 99 | git remote add origin https://github.com/tianocore/edk2.git && \ 100 | git fetch --no-recurse-submodules origin 38c8be123aced4cc8ad5c7e0da9121a181b94251 && \ 101 | git checkout FETCH_HEAD && \ 102 | git submodule update --init --recursive && \ 103 | make -C BaseTools/Source/C 104 | 105 | # clone mikanos devenv 106 | RUN git clone https://github.com/uchan-nos/mikanos-build.git osbook 107 | 108 | # download standard libraries 109 | RUN curl -L https://github.com/uchan-nos/mikanos-build/releases/download/v2.0/x86_64-elf.tar.gz \ 110 | | tar xzvf - -C osbook/devenv 111 | 112 | # switch back to root 113 | USER root 114 | 115 | 116 | # for cross compiler toolchain 117 | # this is so confusing for user... 118 | RUN for item in \ 119 | addr2line \ 120 | ar \ 121 | as \ 122 | c++filt \ 123 | dwp \ 124 | elfedit \ 125 | gprof \ 126 | ld \ 127 | ld.bfd \ 128 | ld.gold \ 129 | nm \ 130 | objcopy \ 131 | objdump \ 132 | ranlib \ 133 | readelf \ 134 | size \ 135 | strings \ 136 | strip \ 137 | ; do \ 138 | update-alternatives --install "/usr/bin/${item}" "${item}" "/usr/bin/x86_64-linux-gnu-${item}" 50 \ 139 | ; done 140 | 141 | 142 | # add ~/osbook/devenv to PATH 143 | ENV PATH="/home/${USERNAME}/osbook/devenv:${PATH}" 144 | 145 | # set X11 server address 146 | ENV DISPLAY=host.docker.internal:0 147 | 148 | # override startup command, taken from VSCode Devcontainer logs 149 | CMD ["/bin/sh", "-c", "echo Container started ; trap \"exit 0\" 15; while sleep 1 & wait $!; do :; done"] 150 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MikanOS-Docker 2 | 3 | [![build and publish container image](https://github.com/sarisia/mikanos-docker/actions/workflows/publish-image.yml/badge.svg)](https://github.com/sarisia/mikanos-docker/actions/workflows/publish-image.yml) 4 | 5 | ![image](https://user-images.githubusercontent.com/33576079/112739400-29e73880-8faf-11eb-9f59-acca01470a62.png) 6 | 7 | [ゼロからのOS自作入門](https://zero.osdev.jp/) で開発するOS (MikanOS) の 8 | 開発環境が設定された Docker イメージ. 9 | 10 | [github.com/uchan-nos/mikanos-build](https://github.com/uchan-nos/mikanos-build) 11 | リポジトリで解説されているツール, ファイルを収録しています. 12 | 13 | [Docker ではじめる "ゼロからのOS自作入門" | Zenn](https://zenn.dev/sarisia/articles/6b57ea835344b6) 14 | 15 | - :star: 最終章終了時のMikanOSのビルド, 実行を確認! ([github.com/uchan-nos/mikanos](https://github.com/uchan-nos/mikanos)) 16 | - :star: Docker for ( Windows (WSL2, Hyper-V) | Mac (Intel, M1) ), Linux に対応! (たぶん) 17 | - :star: X11対応!ホストのX11 Serverに簡単接続! 18 | - :star: VSCode Devcontainer対応! ([github.com/sarisia/mikanos-devcontainer](https://github.com/sarisia/mikanos-devcontainer)) 19 | - :star: M1 Mac ネイティブ対応! `arm64` イメージあります! 20 | 21 | # 配布している Docker イメージ 22 | 23 | | Image | Tags | Arch | 24 | | :---: | :--: | :---: | 25 | | `ghcr.io/sarisia/mikanos` | `latest` | `linux/amd64`, `linux/arm64` | 26 | | `ghcr.io/sarisia/mikanos` | `vnc` | `linux/amd64`, `linux/arm64` | 27 | 28 | # 使い方 29 | 30 | ## VSCode Devcontainer (推奨) 31 | 32 | VSCode Devcontainer を使うことで, 33 | コンテナを用いた完全な作業環境を簡単に設定することができます. 34 | 35 | 詳細は [github.com/sarisia/mikanos-devcontainer](https://github.com/sarisia/mikanos-devcontainer) 36 | を参照してください. 37 | 38 | ## コンテナイメージを直接起動 39 | 40 | **`--privileged` をつけてください!ビルドスクリプトの `mount` ができません!** 41 | 42 | ``` 43 | $ docker run --privileged --user vscode -it ghcr.io/sarisia/mikanos /bin/bash 44 | vscode ➜ ~ $ 45 | ``` 46 | 47 | 適宜コンテナ内で頑張ったり, ホストのディレクトリをマウントしたりしてお使いください. 48 | 49 | # VNC イメージについて 50 | 51 | `ghcr.io/sarisia/mikanos:vnc` イメージを提供しています. VNC イメージを利用することで, 52 | ホスト環境に X11 Server を用意することなく, MikanOS の動作確認をすることが可能です. 53 | また, [GitHub Codespaces](https://github.com/features/codespaces) を利用することで, ブラウザのみでコーディング&動作確認を 54 | 完結することができます. 55 | 56 | ## 使い方 57 | 58 | VSCode Devcontainer を推奨しています. 詳細は [mikanos-devcontainer](https://github.com/sarisia/mikanos-devcontainer#github-codespaces) の 59 | ドキュメントを参照して下さい. 60 | 61 | それ以外の場合は, 通常のイメージと同様の使い方が可能です. コンテナ起動時に自動で [noVNC](https://novnc.com/info.html) が 62 | 起動し, コンテナ実行中は常に常駐します. QEMU を実行する際に, オプションとして `-vnc :0` を指定することで, 63 | ブラウザから `http://localhost:6080` を開いて動作確認ができます. 64 | 65 | ## カスタマイズ 66 | 67 | noVNC のポートなどを変更する際は, 以下の環境変数を設定して下さい. 68 | 69 | | Environment Variable | Default | Note | 70 | | :---: | :---: | :---- | 71 | | `NOVNC_PORT` | `6080` | noVNC Webクライアントと WebSocket API のポート番号 | 72 | | `VNC_PORT` | `5900` | QEMU が待ち受ける VNC ポート番号. デフォルトでは `5900 + <ディスプレイ番号>` となります. 例えば, QEMU を `-vnc :1` オプションで起動した場合, `VNC_PORT` は `5901` です. | 73 | | (参考) `QEMU_OPTS` | | QEMU を実行する際の追加オプション. `~/osbook/devenv/run_image.sh` 内で展開されます. `-vnc :0` などと設定しておくと便利です. | 74 | 75 | # FAQ 76 | 77 | ## M1 Mac での動作は? 78 | 79 | 可能です. `linux/arm64` アーキテクチャに対応したイメージを用意しています. 80 | 81 | ただし, X64 向けにブートローダをビルドするため, クロスコンパイル関連の設定が必要です. 82 | [ゼロからのOS自作入門](https://zero.osdev.jp/) 2.2節で生成される `/$HOME/edk2/Conf/tools_def.txt` 83 | に対し, 当リポジトリの [`tools_def.txt.diff`](tools_def.txt.diff) を参考に, 設定を変更して下さい. 84 | 85 | その他の手順は, 書籍に従います. 86 | 87 |
88 | エミュレータを用いた互換動作 89 | 90 | 書籍と違う設定を行うことに抵抗がある, もしくは前述の方法が上手く行かない場合は, 91 | 明示的に `linux/amd64` イメージを互換レイヤを通して利用することが可能です. 92 | 93 | ただし, 互換レイヤを通すことでパフォーマンスは大きく劣化し, コンパイル時や 94 | QEMU を用いたテスト動作時の速度は遅くなります. 95 | 96 | 互換レイヤを用いるには, `ghcr.io/sarisia/mikanos:amd64` イメージを取得した後, 97 | コンテナ実行時に `--platform linux/amd64` を指定して実行してください: 98 | 99 | ``` 100 | $ docker run --platform linux/amd64 --privileged -it --user vscode ghcr.io/sarisia/mikanos:amd64 /bin/bash 101 | ``` 102 | 103 |
104 | 105 | ## WSLg での動作は? 106 | 107 | 正常な動作を確認しました. [ドキュメント](https://github.com/microsoft/wslg) に従い WSLg を設定した後, 108 | X11 のソケットをコンテナ内にバインドして下さい: 109 | 110 | ``` 111 | $ docker run --privileged -it --user vscode --mount type=bind,source=/tmp/.X11-unix,target=/tmp/.X11-unix ghcr.io/sarisia/mikanos /bin/bash 112 | ``` 113 | 114 | # トラブルシューティング 115 | 116 | [Wiki をご確認ください.](https://github.com/sarisia/mikanos-docker/wiki/Troubleshooting) 117 | 118 | # ライセンス 119 | 120 | 当 Dockerfile のライセンスは MIT です. 121 | 122 | ただし, 当 Dockerfile からビルドされるコンテナイメージ, 及び配布された 123 | ビルド済みイメージに含まれる著作物のライセンスは, それぞれの固有のライセンスに 124 | 従います. 125 | 126 | # バグ, 要望 127 | 128 | [Twitter (@A1ces)](https://twitter.com/A1ces) や [Issues](https://github.com/sarisia/mikanos-docker/issues) で教えてくださると嬉しいです! 129 | --------------------------------------------------------------------------------