[筆記] 使用 qemu/grub 模擬系統啟動(單分區)

背景

最近在學習操作系統,需要從零開始搭建系統,由于教程中給的虛擬機搭建的方式感覺還是過于重量級,因此研究了一下通過 qemu 模擬器,配合 grub 完成啟動系統的搭建。

qemu 介紹

qemu 是一款十分優秀的系統模擬器,可以用于模擬各種CPU架構硬件。你可以在 x86平臺上模擬出 arm 架構的 CPU并在其上運行程序,也可以反過來。總而言之,通過 qemu 可以忽略平臺間的架構差異,完成硬件模擬。

grub 介紹

grub 是一個開源的系統啟動器,用于對計算機進行初始化并引導至操作系統。

操作步驟

整個操作是在 wsl2 中執行的,需要提前安裝一些軟件:

sudo apt install -y qemu-system-x86 qemu-utils grub2

以下命令需要在 root 權限下執行,如果由于權限問題無法執行可以通過在前面加 sudo執行

1. 使用 dd 創建一塊虛擬硬盤

dd 命令在 linux 系統中主要用于創建文件如:

# 創建一個 file.bin 的空文件,寫入塊大小為 512字節,共2M
dd bs=512 count=20000 if=/dev/zero of=file.bin
# 創建一個隨機文件
dd bs=512 count=20000 if=/dev/random of=file.bin

這里使用該命令創建了一個 raw 類型的虛擬磁盤,qemu 可以直接使用這種類型的虛擬磁盤。

# 創建了一個虛擬磁盤文件,其實就是一個全是0 的空文件
dd bs=512 count=102400 if=/dev/zero of=hd.img
# bs=512 單次寫入 512字節
# count=102400 共寫入 102400次,合計 50MB
# if=/dev/zero 寫入源為 zero
# of=hd.img 指定輸出文件名稱

然后通過 losetup -f 將這個虛擬硬盤文件關聯為回環設備:

losetup -f hd.img
# -f 隨機找一個空閑的回環設備,并將 hd.img 附加到上面
losetup -a
/dev/loop0: [2080]:409 (/root/hd.img)
# 這里可以看到我們剛剛創建的虛擬硬盤文件被附加到了 /dev/loop0 這個回環設備上了
# 可以通過 losetup -D 移除關聯

通過 mkfs.ext4 將我們剛剛創建的的虛擬硬盤文件格式化為 ext4 磁盤文件系統類型

mkfs.ext4 hd.img

掛載我們剛剛初始化好的文件系統到當前系統上:

mkdir hdisk && mount hd.img hdisk
# 創建 hdisk 文件夾,并將 hd.img 虛擬硬盤掛載到這個文件夾上

到這里準備工作就完成了,現在我們為虛擬硬盤安裝 grub:

grub-install --boot-directory=./hdisk/boot --no-floppy --force /dev/loop0
# --boot-directory 指定啟動目錄
# --no-floppy 設置沒有軟盤
# --force 只要沒有發生錯誤,就繼續寫入,如果不指定 --force 可能會安裝報錯
# /dev/loop0 指定寫入的磁盤文件,這里填剛剛通過 losetup -a 查詢到的關聯的回環設備文件

現在我們已經可以通過 qemu 啟動這塊硬盤了,雖然啟動后直接是進入到 grub 界面:

qemu-system-x86_64 -hda hd.img
#  qemu-system-x86_64 -drive file=hd.img,index=0,media=disk,format=raw 與上面命令效果一樣

在這里插入圖片描述

當然這只是一個空界面,你可以用 grub 的一些命令做一些初步的操作

insmod part_msdos #GRUB加載分區模塊識別分區
insmod ext2 #GRUB加載ext文件系統模塊識別ext文件系統
set root='hd0' #注意boot目錄掛載的分區,這是我機器上的情況
multiboot2 /boot/HelloOS.bin #GRUB以multiboot2協議加載HelloOS.bin
boot #GRUB啟動HelloOS.bin

如果想要重復練習上面的過程,可以在關閉 qemu 窗口后,接觸對虛擬硬盤的關聯:

umount hdisk
# 接觸 hdisk 目錄與 hd.img 的關聯

然后接觸 hd.img 與本地回環設備的關聯:

losetup -D
# 移除所有關聯的本地回環設備
losetup -a
# 查看是否已經解除關聯

最后刪除掉當前目錄中的 hd.img 和 hdisk 目錄.重新操作即可.

內核加載部分不做介紹.

參考資料

  • 02 | 幾行匯編幾行C:實現一個最簡單的內核
  • grub命令 – 交互式的管理GRUB引導程序
    原文鏈接:https://www.linuxcool.com/grub

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215583.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215583.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux上進行Nacos安裝

Nacos安裝指南 僅供參考,若有錯誤,歡迎批評指正! 后期會繼續上傳docker安裝nacos的過程! 1.Windows安裝 開發階段采用單機安裝即可。 1.1.下載安裝包 在Nacos的GitHub頁面,提供有下載鏈接,可以下載編譯好…

《C++新經典設計模式》之第7章 單例模式

《C新經典設計模式》之第7章 單例模式 單例模式.cpp 單例模式.cpp #include <iostream> #include <memory> #include <mutex> #include <vector> #include <atomic> using namespace std;// 懶漢式&#xff0c;未釋放 namespace ns1 {class Gam…

手動搭建koa+ts項目框架(日志篇)

文章目錄 前言一、安裝koa-logger二、引入koa-logger并使用總結如有啟發&#xff0c;可點贊收藏喲~ 前言 本文基于手動搭建koats項目框架&#xff08;路由篇&#xff09;新增日志記錄 一、安裝koa-logger npm i -S koa-onerror and npm i -D types/koa-logger二、引入koa-lo…

【每日一題】【12.11】1631.最小體力消耗路徑

&#x1f525;博客主頁&#xff1a; A_SHOWY&#x1f3a5;系列專欄&#xff1a;力扣刷題總結錄 數據結構 云計算 數字圖像處理 1631. 最小體力消耗路徑https://leetcode.cn/problems/path-with-minimum-effort/這道題目的核心思路是&#xff1a;使用了二分查找和BFS &a…

PHP基礎(2)

目錄 一、PHP 數據類型 二、PHP 字符操作函數 strlen() str_word_count() strrev() strpos() str_replace() 一、PHP 數據類型 PHP 有八種基本數據類型和兩種復合數據類型&#xff1a; 整型&#xff08;int&#xff09;&#xff1a;表示整數&#xff0c;可以是正數或負數&am…

線程Thread源代碼思想學習1

1.啟動線程代碼 public class MultiThreadExample {public static void main(String[] args) {// 創建兩個線程對象Thread thread1 new Thread(new Task());Thread thread2 new Thread(new Task());// 啟動線程thread1.start();thread2.start();} }class Task implements Ru…

EXPLAIN 執行計劃

有了慢查詢語句后&#xff0c;就要對語句進行分析。一條查詢語句在經過 MySQL 查詢優化器的各種基于成本和規則的優化會后生成一個所謂的執行計劃&#xff0c;這個執行計劃展示了接下來具體執行查詢的方式&#xff0c;比如多表連接的順序是什么&#xff0c;對于每個表采用什么訪…

記錄 DevEco 開發 HarmonyOS 應用開發問題記錄 【持續更新】

HarmonyOS 應用開發問題記錄 HarmonyOS 應用開發問題記錄一、預覽器無法成功運行?如何定位預覽器無法編譯問題? 開發遇到的問題 HarmonyOS 應用開發問題記錄 一、預覽器無法成功運行? 大家看到這個是不是很頭疼? 網上能看到許多方案,基本都是關閉一個配置 但是他們并…

InitializingBean初始化--Spring容器管理

目錄 InitializingBean--自動執行一些初始化操作spring初始化bean有兩種方式&#xff1a;1.優點2.缺點2.PostConstruct 注解2.舉例使用InitializingBean接口 和PostConstruct3.初始化交給容器管理4.與main入口函數有什么區別5.在 Spring 中&#xff0c;有兩種主要的初始化 bean…

【Java SE】帶你識別什么叫做異常!!!

&#x1f339;&#x1f339;&#x1f339;個人主頁&#x1f339;&#x1f339;&#x1f339; 【&#x1f339;&#x1f339;&#x1f339;Java SE 專欄&#x1f339;&#x1f339;&#x1f339;】 &#x1f339;&#x1f339;&#x1f339;上一篇文章&#xff1a;【Java SE】帶…

Android獲取Wifi網關

公司有這樣一個應用場景&#xff1a;有一臺球機設備&#xff0c;是Android系統的&#xff0c;它不像手機&#xff0c;它沒有觸摸屏幕&#xff0c;所以我們對球機的操作很不方便&#xff0c;于是我們搞這樣一個設置&#xff1a;點擊球機電源鍵5次分享出一個熱點&#xff0c;然后…

【JVM從入門到實戰】(一) 字節碼文件

一、什么是JVM JVM 全稱是 Java Virtual Machine&#xff0c;中文譯名 Java虛擬機。 JVM 本質上是一個運行在計算機上的程序&#xff0c;他的職責是運行Java字節碼文件。 二、JVM的功能 解釋和運行 對字節碼文件中的指令&#xff0c;實時的解釋成機器碼&#xff0c;讓計算機…

C++類模板不是一開始就創建的,而是調用時生成

類模板中的成員函數和普通類中成員函數創建時機有區別的&#xff1a; 普通類中的成員函數一開始就可以創建模板類中的成員函數調用的時候才可以創建 總結;類模板中的成員函數并不是一開始就創建的&#xff0c;再調用時才去創建 #include<iostream> using namespace st…

微信小程序:模態框(彈窗)的實現

效果 wxml <!--新增&#xff08;點擊按鈕&#xff09;--> <image classimg src"{{add}}" bindtapadd_mode></image> <!-- 彈窗 --> <view class"modal" wx:if"{{showModal}}"><view class"modal-conten…

Vue中$props、$attrs和$listeners的使用詳解

文章目錄 透傳屬性如何禁止“透傳屬性和事件”多根節點設置透傳訪問“透傳屬性和事件” $props、$attrs和$listeners的使用詳解 透傳屬性 透傳屬性和事件并沒有在子組件中用props和emits聲明透傳屬性和事件最常見的如click和class、id、style當子組件只有一個根元素時&#xf…

jOOQ指南中使用的數據庫

jOOQ指南中使用的數據庫 本指南中使用的數據庫將在本節中進行總結和創建 使用Oracle方言來創建 # 創建語言 CREATE TABLE language (id NUMBER(7) NOT NULL PRIMARY KEY,cd CHAR(2) NOT NULL,description VARCHAR2(50) );# 創建作者 CREATE TABLE author (id NUMBER(7) NOT …

mysql:需要準確存儲的帶小數的數據,要使用DECIMAL類型

需要準確存儲的帶小數的數據&#xff0c;要使用DECIMAL&#xff0c;特別是涉及金錢類的業務。而不要使用FLOAT或者DOUBLE。 因為DECIMAL是準確值&#xff0c;不會損失精度。 而FLOAT或者DOUBLE是近似值&#xff0c;會損失精度。 https://dev.mysql.com/doc/refman/8.2/en/fixe…

差生文具多系列之最好看的編程字體

&#x1f4e2;?聲明&#xff1a; &#x1f344; 大家好&#xff0c;我是風箏 &#x1f30d; 作者主頁&#xff1a;【古時的風箏CSDN主頁】。 ?? 本文目的為個人學習記錄及知識分享。如果有什么不正確、不嚴謹的地方請及時指正&#xff0c;不勝感激。 直達博主&#xff1a;「…

數據結構 | Floyd

參考博文&#xff1a; floyd算法 弗洛伊德算法 多源最短路徑算法_弗洛伊德算法例題-CSDN博客

【文心一言】AI試用寫代碼體會:delphi、php

一、前言&#xff1a; 二、讓【文心一言】編寫一個函數 1. Delphi 語言&#xff08;文心一言的回復&#xff09; 2. php 語言&#xff08;文心一言回復&#xff09; 三、總結 一、前言&#xff1a; 眾所周知&#xff0c;chatGPT是可以自動編寫程序的&#xff0c;甚至可以運…