Lessons_i_learned_from_softwareDev_through_research (メモ)

めも 研究を通してやったソフトウェア開発で学んだこと まあ、やっぱりアジャイルっぽくはなるので、試作を作って、それを改良していく感じにはなります。 ただ、これだけは忘れないでほしい。試作を作る段階で今後の可能性を狭めない方がいい。 いや、具体例を一言でいうと、ハードコーディングするな。マジで。そのときはいいかもしれないけど、あとで見つけるの、マジでだるい。頼む。 具体例 いやね、tolを変えて評価したいんですわ。でもね、L3prefetcherのところ、tolがハードコーディングされてるのよね。0.1で。これを変えるのがめんどくさすぎるーーーー。

January 19, 2024 · 1 min · 7 words · Me

Gdb

gdbを使えるようになりたい デバッガは使えた方がいいですよ。ステップ実行とかね。まあ、ちゃんとしたソフトウェア開発っやったことないんで、いまいちピンとこないんですよね。でも、大事なことには変わりないです。頑張りましょう。 python3から、c++の共有ライブラリを呼び出すときにおこったバグの見つけ方 chatgptさんに聞きました。 The error message "munmap_chunk(): invalid pointer" typically indicates a memory corruption issue or a double-free error. It means that at some point during the program's execution, it is trying to deallocate memory that has already been freed or that was never allocated in the first place. To identify the exact point where the issue occurs, you can follow these steps 1:Enable address sanitizer (ASAN) in your C++ code to help detect memory issues. You need to recompile your C++ library with ASAN flags (-fsanitize=address) and then rerun your Python script under GDB. ASAN will provide more detailed information about memory errors. Modify your CMakeLists.txt to include ASAN flags: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address") Then rebuild your C++ library. 2: Run your Python script again under GDB with ASAN enabled: gdb -ex r --args python3 crash.py

January 17, 2024 · 1 min · 138 words · Me

Make_tips

makeの高速化 cmake ..でmakeファイルを生成して、最後にmakeすると思うんだけど、これ、高速化する技があるんですね。 make -j <number of cores> で、めっちゃ高速化されます。

January 17, 2024 · 1 min · 9 words · Me

ROS

いつかROSを触ってみたいので、忘れないようにメモ

January 17, 2024 · 1 min · word · Me

Pybinding

事始め HPCの分野はやはりc/c++で開発されることが多いよね。しかしね、やはりc/c++はビルドとか、マジで面倒くさいんですわ。コンパイル型言語はよ。 だからインタープリタ型言語から、c/c++のライブラリを呼び出せたらいいよね、っていうので作られたのがpybind11とかっていうやつなんだよね。 今回は、c/c++で書かれた科学技術データ向けの非可逆圧縮アルゴリズムの一つである cuSZp をpythonから呼び出す方法を 記録します。 前例 けいち先生がすでにMGARDをpythonから呼び出せるようにpybindをやってくれています。 これを参考にしたいと思います。ということで、先生が何をやったのか、の解析から始めたいと思います。 pymgardのcmake 解説しながら進めていきたいと思います。大事なところだけ。 project( MGARD HOMEPAGE_URL "https://github.com/CODARcode/MGARD" VERSION "${MGARD_VERSION_MAJOR}.${MGARD_VERSION_MINOR}.${MGARD_VERSION_PATCH}" #CUDA will be enabled below if `MGARD_ENABLE_CUDA` is `ON`. LANGUAGES CXX ) include(MgardXGenerateSource) find_package(PkgConfig REQUIRED) add_executable(mgard-x ${CMAKE_CURRENT_SOURCE_DIR}/src/mgard-x/Executables/mgard-x.cpp) target_link_libraries(mgard-x mgard-library ${CMAKE_DL_LIBS}) target_include_directories(mgard-x PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>) install(TARGETS mgard-x) add_executable(mgard-x-autotuner ${CMAKE_CURRENT_SOURCE_DIR}/src/mgard-x/Executables/mgard-x-autotuner.cpp) target_link_libraries(mgard-x-autotuner mgard-library ${CMAKE_DL_LIBS}) target_include_directories(mgard-x-autotuner PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>) install(TARGETS mgard-x-autotuner) #Adding library here so we can set compile definitions for it. add_library(mgard-library) if(MGARD_ENABLE_CUDA) enable_language(CUDA) set(CMAKE_CUDA_STANDARD_REQUIRED TRUE) if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES) set(CMAKE_CUDA_ARCHITECTURES 70) endif() find_package(nvcomp REQUIRED) find_package(CUDAToolkit REQUIRED) target_compile_definitions(mgard-library PUBLIC MGARD_ENABLE_CUDA) set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr -w --generate-line-info") set (MGARD_X_SEPARATE_COMPILE_COMPILATION_OPTION CUDA_SEPARABLE_COMPILATION ON) set_source_files_properties(${MGARD_X_CUDA_SRC} PROPERTIES LANGUAGE CUDA) endif() find_package(ZLIB REQUIRED) find_package(PkgConfig REQUIRED) set( MGARD_LIBRARY_CPP src/compress.cpp src/compress_internal.cpp src/compressors.cpp src/format.cpp ) set(MGARD_GENERATE_DIMENSION_SWITCH "${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_dimension_switch.py") set(MGARD_COMPRESS_INTERNAL_CPP "${MGARD_FILE_FORMAT_SRCDIR}/compress_internal_generated.cpp") add_custom_command( OUTPUT "${MGARD_COMPRESS_INTERNAL_CPP}" COMMAND "${PYTHON3}" ARGS "${MGARD_GENERATE_DIMENSION_SWITCH}" "--decompress" "${MAXIMUM_DIMENSION}" "${MGARD_COMPRESS_INTERNAL_CPP}" ) list(APPEND MGARD_LIBRARY_CPP "${MGARD_COMPRESS_INTERNAL_CPP}") target_sources( mgard-library PRIVATE ${MGARD_LIBRARY_CPP} ${MGARD_CUDA_SRC} ${MGARD_X_SRC} ${MGARD_X_SERIAL_SRC} ${MGARD_X_OPENMP_SRC} ${MGARD_X_CUDA_SRC} ${MGARD_X_HIP_SRC} ${MGARD_X_SYCL_SRC} ) set_target_properties(mgard-library PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON) set_target_properties(mgard-library PROPERTIES OUTPUT_NAME mgard) target_link_libraries(mgard-library PUBLIC PkgConfig::protobuf) install(TARGETS mgard-library EXPORT mgard-targets) install(FILES "${PROJECT_BINARY_DIR}/include/MGARDConfig.hpp" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mgard") install(FILES "${PROJECT_BINARY_DIR}/include/MGARDXConfig.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mgard/mgard-x/RuntimeX") install(DIRECTORY "include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mgard") install(FILES "${MGARD_FILE_FORMAT_HPP}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mgard/${MGARD_FILE_FORMAT_INCLUDESUBDIR_COMPONENT}") if(MGARD_ENABLE_PYTHON) find_package(Python COMPONENTS Interpreter Development.Module REQUIRED) include(FetchContent) FetchContent_Declare( pybind11 GIT_REPOSITORY https://github.com/pybind/pybind11.git GIT_TAG stable ) FetchContent_MakeAvailable(pybind11) pybind11_add_module(_mgard src/python/bindings.cpp) target_link_libraries(_mgard PRIVATE mgard-library) install(TARGETS _mgard LIBRARY DESTINATION python/mgard) endif() # Add all targets to the build-tree export set export( TARGETS mgard-library NAMESPACE mgard:: FILE "${PROJECT_BINARY_DIR}/mgard-targets.cmake" ) bindings.cpp 今回のcuSZpで、確認してみよう CMakelist.txtの中身 # Specify the minimum version of CMake required to build the project cmake_minimum_required(VERSION 3.21) project(cuSZp VERSION 0.0.2 DESCRIPTION "Error-bounded GPU lossy compression library" ) set(namespace "cuSZp") enable_language(CXX) enable_language(CUDA) find_package(CUDAToolkit REQUIRED) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(CUSZP_ENABLE_PYTHON "Enable Python bindings." OFF) set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER}) set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) set(CMAKE_CUDA_STANDARD "17") set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 75) set(CUDA_PROPAGATE_HOST_FLAGS ON) set(CUDA_LIBRARY CUDA::cudart) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY VALUE Release) endif() # add_library(${PROJECT_NAME} STATIC) add_library(${PROJECT_NAME} SHARED) target_sources(${PROJECT_NAME} PRIVATE src/cuSZp_f32.cu src/cuSZp_f64.cu src/cuSZp_utility.cu src/cuSZp_timer.cu src/cuSZp_entry_f32.cu src/cuSZp_entry_f64.cu ) target_include_directories(${PROJECT_NAME} PRIVATE # where the library itself will look for its internal headers ${CMAKE_CURRENT_SOURCE_DIR}/src PUBLIC # where top-level project will look for the library's public headers $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # where external projects will look for the library's public headers $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) #target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) target_link_libraries(${PROJECT_NAME} PRIVATE CUDA::cudart) set(public_headers include/cuSZp_f32.h include/cuSZp_f64.h include/cuSZp_utility.h include/cuSZp_timer.h include/cuSZp_entry_f32.h include/cuSZp_entry_f64.h ) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(Installing) if(CUSZP_ENABLE_PYTHON) find_package(Python COMPONENTS Interpreter Development.Module REQUIRED) # よく出てくる。ライブラリがあるかを確認。cmakeがいい感じにいろいろやってくれる find_package(CUDAToolkit REQUIRED) enable_language(CUDA) set(CUDA_LIBRARY CUDA::cudart) include(FetchContent) # 便利 FetchContent_Declare( pybind11 GIT_REPOSITORY https://github.com/pybind/pybind11.git GIT_TAG stable ) FetchContent_MakeAvailable(pybind11) pybind11_add_module(_cuSZp src/python/bindings.cpp) # ここで作成するライブラリを指定。add_libraryてきなののpybind版 target_include_directories(_cuSZp PRIVATE "/usr/local/cuda/include/" "/usr/local/cuSZp/") target_include_directories(${PROJECT_NAME} PRIVATE # where the library itself will look for its internal headers ${CMAKE_CURRENT_SOURCE_DIR}/src PUBLIC # where top-level project will look for the library's public headers $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> # where external projects will look for the library's public headers $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) target_link_libraries(_cuSZp PRIVATE cuSZp CUDA::cudart) install(TARGETS _cuSZp LIBRARY DESTINATION python/cuSZp) endif() option(CUSZP_BUILD_EXAMPLES "Option to enable building example programs" ON) if (CUSZP_BUILD_EXAMPLES) add_subdirectory(examples) endif () pybinding.cppの中身 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <cuSZp_utility.h> #include <cuSZp_entry_f32.h> #include <pybind11/numpy.h> #include <pybind11/pybind11.h> namespace py = pybind11; py::buffer compress(py::array_t<float> original, float tol) { unsigned char *compressed_data = nullptr; size_t compressed_size = 0; compressed_data = new unsigned char[original.size()]; // pointer_to_original_data(float*), pointer_to_compressed_data(unsigned char*), size_of_original_data(int/size_t), pointer_to_compressed_size, tolerance SZp_compress_hostptr_f32(const_cast<float*>(original.data()), compressed_data, original.size(), &compressed_size, tol); return py::array_t<unsigned char>({compressed_size}, {1}, // stride of the array static_cast<unsigned char *>(compressed_data), py::capsule(compressed_data, [](void *ptr) { delete ptr; })); } ちょっと、 ...

January 17, 2024 · 3 min · 527 words · Me

Cmake_cheat_sheat

c/c++を使うならcmake! を使えるようになろう 前提知識 c/c++をライブラリとして提供するときに必要な奴ら /include, /lib, だよね。 /includeにはヘッダーが入っていて、/libには、コンパイルによって生成されたライブラリが入ります。hogehoge.soとか、hogehoge.aとか。 で、こいつらは基本的に、/usr/local/いかに格納されます。 ヘッダーについても説明しておく。ヘッダーは簡単にいうと、関数の入出力を規定したファイルです。 プログラムをビルドする流れは、コンパイルー>リンク だけど、コンパイルの時点では、ライブラリとして読み込まれたファイルがどんな ヘッダーファイルの種類 ヘッダーファイルには2種類ある。 #include<stdio.h> #include "my_library.h" みたいな感じで、<>で囲まれているやつと、““で囲まれているやつ。<>は、システムのライブラリを読み込むときに使われます。システムライブラリのヘッダーは、/usr/local/includeとか、 /usr/include/に置かれます。ライブラリ (オブジェクトファイル) 本体は、/usr/libとか、/usr/lib64とかにおかれます。 一方、““はユーザが作ったライブラリを読み込むために使われます。““を使うと、コンパイラはカレントディレクトリの中で該当するヘッダーファイルを探します。 ライブラリとヘッダーは、一対一対応します。つまり、 プログラムからライブラリを読み出すときは必ず、ヘッダーでインクルードして、最後リンクする必要があります。 ユーザが定義したヘッダーでも同じです。まず、hogehoge.hppとhogehoge.cppを作って、コンパイルするときに g++ main.cpp hogehoge.cpp みたいな感じで、hogehoge.cppもコンパイルします。オブジェクトができて、最後にリンクしています。 コンパイルー>リンクって流れを覚えておけば問題ないです。 サーチパスを追加したいときは、-Iで、ヘッダーのディレクトリ、-Lでライブラリのディレクトリをつけます。 ld (リンカー) がデフォルトで見に行くディレクトリパス LD_LIBRARY_PATH という環境変数で定義されています。これは変えられます。次のようにサーチパスを追加します。 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ちなみに、ldっていうのは、 Origins of the name "ld" are "LoaDer" and "Link eDitor" らしいです。知らんけど。 共有ライブラリと静的ライブラリ 共有ライブラリは、実行時に動的に読まれるのに対して、静的ライブラリは、コンパイル時に実行ファイルに組み込まれる。 どちらがいいかはわからないけど、共有ライブラリは、実行ファイル (実行バイナリ) の大きさが小さくなるよね。 ちなみに、共有ライブラリはShared Objectだから、.soっていう拡張子が付きます。一方、静的ライブラリは、 a collection of object files bundled together into a single archive fileなので、arichveの.aが付きます。 つまり、hogehoge.soとhogehoge.aですね。 ...

January 17, 2024 · 4 min · 833 words · Me

Singularity_and_docker

事始め 再び、singularity環境でコンテナをビルドする必要が生じた。cuSZで圧縮を実現するために 去年の10月にsingularityを使ってpymgardを作った時に殴り書きしたメモ 1. まずは、ちゃんとネットワーク越しに動くようにしたいです。そのために、singularityのコンテナを作ろうと思います。頑張ってください。 いま、eclairでSingularityのSandboxを作っています。Dockerfile的なのが、singularityにもあるらしくね、Singularity.defってのが、それから今作っています。Sandboxを。 singularity build --fakeroot --sandbox pymgard.sandbox Singularity.def WARNING: The underlying filesystem on which resides "/home/gp.sc.cc.tohoku.ac.jp/aoyagir/new_research/The_Middleware/src/python/pymgard.sandbox" won't allow to set ownership, as a consequence the sandbox could not preserve image's files/directories ownerships >>> compressed = mgard.compress(original, 0.1, 0, mgard.ErrorBoundType.REL, config) GPUassert: CUDA driver version is insufficient for CUDA runtime version /MGARD/include/mgard-x/Hierarchy/../RuntimeX/DeviceAdapters/DeviceAdapterCuda.h 628 cuda (ランタイム) はドライバーより古くても大丈夫。つまり、 なので、もしかしてまたエラーが起こるかもしれないです。つまり、/tmpで作ってくださいって話です。 で、ドライバーが最新のmuffin2で実行したら、普通に行けました。ナイスです。めっちゃナイスです。 --> ナイスですねー。あとは、そうですね、monakaで今後実験していくことになるので、monakaのipでハードコーディングしちゃってください! ここに来るまでに売ったコマンド、ちょっとまとめておきますか。 sudo singularity build --fakeroot --sandbox pymgard.sif Singularity.def # SingularityのDockerfile的なの -> sandboxの. ここ、pymgard.sifじゃなくて、pymgard.sanxboxのが正しいのではないかな?まあいいや。 sudo singularity config fakeroot -add aoyagir singularity shell --fakeroot -writable pymgard.sandbox singularity build --fakeroot pymgard.sif pymgard.sandbox # sandbox -> sif singularity shell --nv pymgard.sif ポイントとしては、 1. singualrityはホームディレクトリを共有するからファイルを移動させる必要がないこと 2. fakerootを使うには、上のコマンドでfakerootが使えるように設定する必要があること 3. sandoboxじゃないと新しいモジュールはダウンロードできないこと 4. sifじゃないとなんか知らんけど、cudaがうまく使えないってこと。だから、sandboxからsifに変換する必要があるってこと。 --> sharkでも同じことをしました。sharkのGPUを使って評価したいと思いますー--。 singularityにおけるDockerfile的なの Bootstrap: docker From: nvidia/cuda:12.1.1-devel-ubuntu22.04 %post apt-get update && \ apt-get install -y curl cmake git g++ pkg-config protobuf-compiler libprotobuf-dev libzstd-dev python3 python3-dev python3-pip curl -sL https://developer.download.nvidia.com/compute/nvcomp/2.6.1/local_installers/nvcomp_2.6.1_x86_64_12.x.tgz | tar xzvf - --directory=/usr/local pip3 install numpy pip3 install tiledb pip3 install h5py git clone https://github.com/szcompressor/cuSZ.git cusz-latest cd cusz-latest && mkdir build && cd build cmake .. \ -DPSZ_BACKEND=cuda \ -DPSZ_BUILD_EXAMPLES=on \ -DCMAKE_CUDA_ARCHITECTURES="75;80;86" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_COLOR_DIAGNOSTICS=on \ -DCMAKE_INSTALL_PREFIX=[/path/to/install/dir] make -j make install %environment export PYTHONPATH=/MGARD/build/lib 拡張子は、.defです。この名前じゃないとだめなのかはわかりませんが。 ...

January 15, 2024 · 5 min · 884 words · Me

Comments_on_linux_plus_command_newbies

これはなにか 西村めぐみさんが書いた「Linux + コマンド入門」 のまとめです。学んだことを箇条書きで書いていきます。 画面のクリア方法 clearってやるとクリアされるのはわかりますね。まあ、俺はあまりクリアすることはないんですけどね。。。。 これ以外に、ctrl + lでクリアできるってのを覚えておくといいかもね。lって、割とホームポジションの近くだし、覚えやすいのでは。 画面がフリーズした時の対処法 ctrl + sでターミナルへの出力が停止されます。 これは、ctrl + qで解除することができます。 uname周りについて unameはシステムの基本情報を出すコマンドだよね。 uname -a すべての情報。これだけ覚えておけばいいかな。あ、でもしたのも覚えておくといいかも uname -r これは、カーネルのリリース情報を出力するコマンドです。 よく、特定のカーネルパッケージをインストールしたいときとか、$(uname -r)って、シェル変数にしてコマンドを実行することがあるよね。 manコマンドを使いこなそうって話だ もうね、そろそろインターネットの情報ではなく、公式な情報から知識を得る方向にシフトしていった方がいい。情報の発信源ってのはすごく大事だからね。ってことで、 man <コマンド> で、そのコマンドの詳細を見られます。 chmodとパーミッションについて ls -laで、そのディレクトリのすべてのファイルの属性の詳細がみられますよね。 chmodでパーミッションを変更できます。 僕はいつも、数字で変更していますが、 chmod <対象> <操作> でも変更できます。 <対象> : u,g,o <操作> : + <r,w,x>, - <r,w,x>, = <r,w,x> って感じですね。 chownとchgrp chownで、ファイルの所有者とグループを変更できますよね。 実は、chgrpで、ファイルのグループだけを変更することができます。 ちなみに、自分が所属しているグループであれば、sudoが必要ありませんが、 それ以外のグループである場合は、sudoが必要であるということです。 また、自分が所属しているグループは、idとか、groupsで確認できるということです。 さらに、ちなみになんだけど、ユーザはデフォルトでプライマリグループっていう、自分一人のグループに強制的に加入させられているらしいです。 で、それ以外のグループをセカンダリグループっていいます。 findを使いこなせ まだ使いこなせていない。 find <場所> -name <名前> find / -name .bash* は、ルートディレクトリ以下で、.bashって名前が付くファイルを探せって意味だね。 いや、これ以外と使えるかもしれない。あのね、なんかね、findを使うといっつもめっちゃバーッて出てくるじゃない。あれって実は権限がないために出てくるエラーだったっていう、衝撃の事実。 findを使うときは、エラー出力を抑制する2>/dev/nullとセットで使おうって話です。 こんな感じです。 ...

January 13, 2024 · 1 min · 99 words · Me

Virtual_box

ことはじめ Linux + コマンド入門って本を買いました。 今更入門!?って感じですが、やっぱりどんな本も学ぶべきものはあります。この本では、「いきなりLinuxの物理コンピュータを準備するのは初心者には難しいから、最初はVMでLinuxをいじってみよう!」って書いてあるんですね。で、vmは大学2年の時に触ったのですが、ちゃんと理解したことがなかったので、これを機にまとめてみようって感じですね。 前提知識 OSが起動されるまでの流れを改めておさらいしておきたいと思います。コンピュータが付きます。ROMに保存されているBIOSが起動されます。UEFIとも言いますね。BIOSがブートローダを起動します。GRUBっていうやつです。こいつは、カーネルをメインメモリにロードする役割を担います。ブートローダがカーネルをメインメモリにロードします。カーネルは、systemdを起動して、systemdがそれぞれのプロセスを順番に起動していきます。 さらに、仮想マシンが何かについて、改めておさらいしておきたいですね 仮想マシンですね。ハードウェアで実行される命令セットレベルでマシンの動きを再現しているので、Dockerとかのコンテナ仮想化に比べてかなり動きが遅いですね。 virtualboxのインストール方法 公式ホームページに富んで、インストーラからインストールしてください。 osのインストール方法 まずは物理サーバにインストールするときと同じように、ホストOSのストレージにインストールをしないといけません。 ちなみに、ホストOS (windows) 上で、ゲストosがインストールされるのは、C:/Users/hoge/VirtualBox Vmsってところです。ここに各vmごとにディレクトリが作られる感じです。 で、インストールの仕方ですが、まずはISOファイルってのを、各ディストリビューションプロバイダー?からダウンロードします。これがOSの元です。 余談ですが、「ISOイメージは、国際標準化機構 の定義した形式の光ディスク用アーカイブファイル」。ってかんじで、別にOSのために作られた専用のファイル形式とかではないって感じですね。わかりました。 で、virtualBox開いて、割り当てる資源量とかを設定して、起動するって感じですね。自動インストール設定がONになっていると、自動でインストールしようとしますが、大体失敗します。ですが、ここであきらめずにどのISOをマウントするか聞かれるので、マウントするISOを選択して再起動するとうまくマウントされます。 ネットワーク周りの設定 仮想化ソフトウェア (virtualBox) は、vm用に新しいネットワークを作ります。10.x.x.xとかだった気がしますが。 で、このネットワークのデフォルトゲートウェイが仮想化ソフトウェアってことです。ルータでもありますね。外界とインタラクションするには、NATをする必要があるってことです。 設定で変更が可能です。しかし、NATの設定は、基本的に内部ネットワークから外部への通信を可能にするだけで、外部から内部への通信はできませんよね。 それを可能にするためには、ネットワーク設定を「ブリッジモード」にする必要があります。これにすると、ipアドレスが割り振られますね。そのipアドレスにホストosからsshすると、ちゃんとつながるんですね。こりゃすごいことです。まあ、当たり前っちゃ当たり前なのかもしれませんが。僕は結構すごいと思っちゃいます。 ただね、ブリッジモードにした時の疑問なんですが、なんか知らんけど、ゲストOSと同じネットワークのIPをもらっちゃってるんですね。これ、どういうこっちゃと。 また、NATだけでは、vm同士の通信はできません。 vm同士を通信させたいときは、NATネットワークモードで動かしましょう。 centos上で、特定のuserにsudo権限を与える方法 centosではデフォルトでroot以外のユーザのsudo権限が与えられていません。いかにsudo権限の与え方を載せておきます。 rootでログインして、visudoをしてください。以下の方ナ行があると思うんで、 ## Allow root to run any commands anywhere root ALL=(ALL) ALL この下に、username ALL=(ALL) ALL を追記しましょう。 疑問 仮想マシンは命令セットレベルでコンピュータの動きを再現しているってのは理解しました。だから、ISOファイルをインストールするときは、armなのか、x86-64なのかを選んでインストールしないとだめなんですよね。ただですね、わからないのが、vmがいつどの段階で命令セットを理解しているのかって話。どの段階で命令セットアーキテクチャを理解するのだ?わからない。 x86_64上で動かしているから、x86_64じゃないと動かないのか、もしかして!そんな気がしてきた

January 13, 2024 · 1 min · 52 words · Me

Kernel_module_and_driver

カーネルモジュールとドライバーについて Driver: A driver is a software component that allows an operating system to communicate with and control a specific piece of hardware, such as a graphics card, network adapter, or printer. Drivers are typically provided by the hardware manufacturer and are loaded into the operating system to enable it to interact with and manage the hardware device properly. Drivers can be part of the kernel (built-in) or loadable as kernel modules. Kernel Module: A kernel module, also known as a loadable kernel module or LKM, is a piece of code that can be dynamically loaded into the running kernel of an operating system to add or extend its functionality. Kernel modules are often used to support new hardware devices or add additional features to the kernel without having to rebuild the entire kernel. While drivers are one type of kernel module (specifically, those that handle hardware), kernel modules can serve other purposes beyond hardware support, such as adding file systems, networking protocols, or other kernel-level services. In summary, a driver is a specific type of kernel module responsible for hardware device interaction, but not all kernel modules are drivers. Kernel modules can serve various purposes within the operating system, extending its functionality in different ways.

January 12, 2024 · 1 min · 206 words · Me