VirtualBox安装虚拟机

安装Centos7

网络连接

VirtualBox 提供多种网络连接模式,每种模式对应不同的网络拓扑和通信能力。以下是 桥接模式、NAT模式、Host-Only模式 的核心区别:

特性 桥接模式 (Bridged) NAT模式 (NAT) Host-Only模式 (Host-Only)
网络位置 与宿主机同级,在同一个局域网 宿主机后方,独立子网 宿主机私有的隔离网络
IP分配 由路由器分配(与宿主机同网段) 由VirtualBox虚拟路由器分配(10.0.2.x) 由VirtualBox DHCP分配(192.168.56.x)
访问外网 ✅ 直接访问 ✅ 通过宿主机NAT转换访问 无法访问外网
宿主机访问虚拟机 ✅ 直接访问 ❌ 默认不可访问(需端口转发) ✅ 直接访问
虚拟机互访 ✅(同一局域网内) ❌(各虚拟机隔离) ✅(所有Host-Only虚拟机互通)
局域网设备访问虚拟机 ❌(仅宿主机可访问)
安全级别 中(暴露在局域网) 高(隔离在NAT后) 高(完全隔离)
典型应用场景 服务器对外服务 浏览器上网、下载软件 搭建封闭测试环境

本机采用NAT + Host-only模式搭建网络,使用NAT访问外网,使用Host-only来访问Samba、SSH。

配置步骤:

  1. 在VirtualBox中配置两个网卡,如下:

    image-20250623174331700 image-20250623174356302
  2. 启动虚拟机后,可以看到两个有两个网卡,我们使用enp0s8网卡来访问ssh和samba。

    image-20250623174759628
  3. 配置enp0s8网卡的IP为静态IP

    # 进入/etc/sysconfig/network-scripts目录
    cd /etc/sysconfig/network-scripts
    
    # 创建一个文件ifcfg-enp0s8,文件内容如下
    [root@vbox network-scripts]# cat ifcfg-enp0s8
    OTPROTO=static
    NAME=enp0s8
    DEVICE=enp0s8
    ONBOOT=yes
    IPADDR=192.168.56.101
    NETMASK=255.255.255.0
    GATEWAY=192.168.56.1
    DNS1=8.8.8.8
    
  4. 如果只配置一个网卡,并采用NAT模式,可以通过添加端口转发来连接SSH,但是无法访问Samba。配置完成后,使用ssh登录127.0.0.1的5555端口即可。

image-20250623161901924

更新镜像

直接使用Centos7默认带的镜像下载不了,需要更新镜像,更新方式如下:CentOS 7 yum无法使用解决方法Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch= - 愚生浅末 - 博客园

安装Samba服务

默认Centos7 minimal没有安装Samba

解决方式:

  1. 下载samba应用

    yum -y install samba samba-client 
    
  2. 查看samba状态并启动服务

    systemctl status smb
    systemctl start smb nmb
    systemctl status smb
    
  3. Samba服务器安装完毕,生成配置文件目录在/etc/samba/etc/samba/smb.conf是samba的核心配置文件

  4. 新增samba用户,grace用户之前已经创建

    [root@vbox yum.repos.d]# smbpasswd -a grace
    New SMB password:
    Retype new SMB password:
    Added user grace.
    
  5. 在虚拟机中测试samba是否正常

    [root@vbox samba]# smbclient //192.168.56.101/grace -U grace
    Enter SAMBA\grace's password: 
    Try "help" to get a list of possible commands.
    smb: \> ls
      .                                   D        0  Mon Jun 23 16:39:47 2025
      ..                                  D        0  Mon Jun 23 14:40:05 2025
      .bash_logout                        H       18  Thu Nov 25 00:33:26 2021
      .bash_profile                       H      193  Thu Nov 25 00:33:26 2021
      .bashrc                             H      231  Thu Nov 25 00:33:26 2021
      .bash_history                       H       68  Mon Jun 23 15:49:30 2025
      a.txt                               N        0  Mon Jun 23 16:39:47 2025
    
                    17811456 blocks of size 1024. 15983264 blocks available
    smb: \> exit
    
  6. 设置samba服务自启动

    systemctl enable samba
    
  7. 如果连接提示没有权限问题,比如:image-20250623172225649,解决方式:

    setenforce 0      # 临时关闭selinux
    
    # 永久关闭方式
    vi /etc/selinux/config
    
    # 永久禁用(需修改为 SELINUX=disabled)
    
    # 查看当前模式
    getenforce
    

安装卸载软件

  • 查看已经安装的软件

    yum list installed
    
  • 安装软件

    yun install 软件包名
    
  • 卸载已经安装的软件

    yum remove 软件包名
    

扩展磁盘空间

参考:如何在virtualbox中对虚拟机进行磁盘扩容? - yinhuachen - 博客园

  1. 选择虚拟介质管理

    image-20250625100312957
  2. 配置要扩展的内存大小

    image-20250625100552653
  3. 启动虚拟机,这时候磁盘只是虚拟分配了,并未实际分配,要用fdisk命令增加新分区来使用。先查看当前的大小,可以看到虚拟内存是分配了。

    image-20250625100825278
  4. 接下来使用fdisk命令来新建分区

    [root@vbox grace]# fdisk /dev/sda
    欢迎使用 fdisk (util-linux 2.23.2)。
    
    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。
    
    
    命令(输入 m 获取帮助):m		# 查看帮助信息
    命令操作
       a   toggle a bootable flag
       b   edit bsd disklabel
       c   toggle the dos compatibility flag
       d   delete a partition
       g   create a new empty GPT partition table
       G   create an IRIX (SGI) partition table
       l   list known partition types
       m   print this menu
       n   add a new partition
       o   create a new empty DOS partition table
       p   print the partition table
       q   quit without saving changes
       s   create a new empty Sun disklabel
       t   change a partition's system id
       u   change display/entry units
       v   verify the partition table
       w   write table to disk and exit
       x   extra functionality (experts only)
    
    命令(输入 m 获取帮助):n			# 新建一个分区
    Partition type:
       p   primary (2 primary, 0 extended, 2 free)
       e   extended
    Select (default p): p		# 配置分区类型
    分区号 (3,4,默认 3):			# 配置分区号,这里使用默认值3
    起始 扇区 (41943040-125829119,默认为 41943040):
    将使用默认值 41943040
    Last 扇区, +扇区 or +size{K,M,G} (41943040-125829119,默认为 125829119):
    将使用默认值 125829119
    分区 3 已设置为 Linux 类型,大小设为 40 GiB
    
    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sda:64.4 GB, 64424509440 字节,125829120 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x000b1502
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048     2099199     1048576   83  Linux
    /dev/sda2         2099200    41943039    19921920   8e  Linux LVM
    /dev/sda3        41943040   125829119    41943040   83  Linux	# 可以看到分区号已经增加
    
    命令(输入 m 获取帮助):w		# 写入并退出
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    正在同步磁盘。
    
  5. 根据上面的提示可以看出,新建分区后,需要执行reboot重启。

  6. 重启完成后,将新建分区格式化一个ext4文件系统

    [root@vbox grace]# mkfs -t ext4 /dev/sda3 
    mke2fs 1.42.9 (28-Dec-2013)
    文件系统标签=
    OS type: Linux
    块大小=4096 (log=2)
    分块大小=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    2621440 inodes, 10485760 blocks
    524288 blocks (5.00%) reserved for the super user
    第一个数据块=0
    Maximum filesystem blocks=2157969408
    320 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
            32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
            4096000, 7962624
    
    Allocating group tables: 完成                            
    正在写入inode表: 完成                            
    Creating journal (32768 blocks): 完成
    Writing superblocks and filesystem accounting information: 完成   
    
  7. 接下来需要挂载新的分区到一个路径,我这里选择的是/home/grace/sda3

    # 先获取新建分区的uuid
    [root@vbox grace]# lsblk -f | grep ext4
    └─sda3          ext4              f91deefe-f56e-41ec-8906-305ef802fe5b 
    
    # 更改/etc/fstab 文件,目的是每次启动可以自动挂载,在文件末新增一行
    [grace@vbox ~]$ cat /etc/fstab 
    
    #
    # /etc/fstab
    # Created by anaconda on Mon Jun 23 14:36:09 2025
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    UUID=8a6eefc7-2b65-4fe7-8e4f-2b54c14a6aef /boot                   xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    
    UUID=f91deefe-f56e-41ec-8906-305ef802fe5b  /home/grace/sda3 ext4 defaults 0 0
    
  8. 执行reboot重启,然后使用df -h命令可以看到新分区已经分配成功

    [grace@vbox ~]$ df -h
    文件系统                 容量  已用  可用 已用% 挂载点
    devtmpfs                 908M     0  908M    0% /dev
    tmpfs                    919M     0  919M    0% /dev/shm
    tmpfs                    919M  8.6M  911M    1% /run
    tmpfs                    919M     0  919M    0% /sys/fs/cgroup
    /dev/mapper/centos-root   17G  3.2G   14G   19% /
    /dev/sda3                 40G   49M   38G    1% /home/grace/sda3
    /dev/sda1               1014M  152M  863M   15% /boot
    tmpfs                    184M     0  184M    0% /run/user/1000
    
  9. 由于我之前的操作都是root权限操作的,因此新区分是只有root账户权限,我需要更改为grace用户使用,更改命令如下

    sudo chown -R grace:grace /home/grace/sda3
    

安装Ubuntu

镜像下载地址:Index of /ubuntu-releases/,我下载的是18.04。

配置双网卡

virtualBOX的配置步骤和centos7一样,但是启动之后,第二个网卡不会默认配置ip,因此需要更改/etc/netplan/00-installer-config.yaml文件的配置。

root@grace:/home/grace# cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      dhcp4: false
      addresses: [192.168.56.102/24]
  version: 2

新增了enp0s8的网络配置。更改完之后,应用配置:

sudo netplan apply
ip addr

网络配置

DNS配置文件在: /etc/resolv.conf,一般如下:

nameserver 8.8.8.8
nameserver 8.8.4.4

网络配置文件在: /etc/netplan/00-installer-config.yaml,该文件在系统启动时会自动加载,不需要单独的命令启用。但修改配置后需要手动应用才能使更改生效。

安装Samba服务

默认没有安装Samba

# 安装服务
apt install samba

# 查看服务状态
systemctl status smbd

# 设置开机启动
systemctl enable smbd

# 新增samba用户
smbpasswd -a grace

需要更改/etc/samba/smb.conf文件,新增下面的内容:

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[global]
   map to guest = never
   security = user

安装卸载软件

# 卸载软件
apt remove qemu-system-mips

QEMU仿真

目的:在Ubuntu中同时使用两个qemu虚拟机,一个是aarch64架构(小端),一个是mips64架构(大端)。

网络连接:两个qemu虚拟机和宿主机之间的通信方式如下

image-20250630155514082

MIPS64

版本:

  • 使用的是buildroot + qemu自己进行编译

    • buildroot:buildroot-2022.02.2

    • qemu:qemu-7.2.0

编译:

  • buildroot:

    make qemu_mips64_malta_defconfig
    make
    

    编译完成后,输出文件在output目录,使用到的一些文件夹说明:

    • build/linux-6.12.27:编译后的内核源码
    • host/bin/mips64-buildroot-linux-gnu-:编译使用的工具链
  • qemu:

    ../configure --target-list=mips64el-softmmu,mips64-softmmu --enable-debug --enable-vnc --enable-kvm --enable-tools --disable-curl
    make
    make install
    

    编译完成后,生成的qemu-system-aarch64 在bin目录

运行:

  1. 将生成的 qemu-system-mips64 拷贝到buildroot的output/images目录

  2. 更改output/images/start-qemu.sh启动脚本,主要新增了网络相关配置,如下:

     ./qemu-system-mips64 -M malta -kernel vmlinux  -drive file=rootfs.ext2,format=raw -append "rootwait root=/dev/sda" -nographic \
             -net nic,macaddr=00:16:3e:00:00:01 -net tap,ifname=tap1,script=no,downscript=no
    
  3. 启动时,可能会遇到一些找不到文件问题,参考网上的方式解决即可

AARCH64

版本:

  • 使用的是buildroot + qemu自己进行编译

    • buildroot:buildroot-2022.02.2

    • qemu:qemu-7.2.0

编译:

  • buildroot:

    make qemu_aarch64_virt_defconfig
    make
    

    编译完成后,输出文件在output目录,使用到的一些文件夹说明:

    • build/linux-5.15.18/:编译后的内核源码
    • host/bin/aarch64-buildroot-linux-uclibc-:编译使用的工具链
  • qemu:

    ./configure --prefix=$PWD --target-list=aarch64-softmmu --enable-debug --enable-vnc --enable-kvm --enable-tools --disable-curl
    make
    make install
    

    编译完成后,生成的qemu-system-aarch64 在bin目录

运行:

  1. 将生成的qemu-system-aarch64 拷贝到buildroot的output/images目录

  2. 更改output/images/start-qemu.sh启动脚本,主要新增了网络相关配置,如下:

    ./qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -smp 1 -kernel Image -append "rootwait root=/dev/vda console=ttyAMA0" \
            -drive file=rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -nographic -device edu \
            -net nic,model=virtio -net tap,ifname=tap0,script=no
    
  3. 启动时遇到的问题:

    root@grace:/home/grace/sda4/qemu+aarch64/buildroot-2022.02.2/output/images# ./start-qemu.sh 
    qemu-system-aarch64: failed to find romfile "efi-virtio.rom"
    qemu-system-aarch64: network script /home/grace/sda4/qemu+aarch64/buildroot-2022.02.2/output/images/../etc/qemu-ifdown failed with status 256
    

    解决方式:下载一个efi-virtio.rom文件

    wget https://github.com/qemu/qemu/raw/master/pc-bios/efi-virtio.rom
    sudo mkdir -p /usr/share/qemu
    sudo cp efi-virtio.rom /usr/share/qemu/
    

网络配置

单个qemu虚拟机网络配置

如果是单个qemu虚拟机,可以按照下面的拓扑配置:

[   互联网      ]
     ↑↓
[物理网卡 enp0s3] 
     ↑↓ ←bridge→
[主机网桥 br0   ]
     ↑↓ ←tap→
[虚拟机网卡 eth0]

配置步骤:

  1. 宿主机上配置下面的命令,注意:我的宿主机网卡名是enp0s3,并且在10.0.2.1/24网段

    # 1.1 创建TAP设备(提前创建,避免QEMU自动脚本)
    ip tuntap add tap0 mode tap
    ip link set tap0 up
    
    # 1.2 创建网络桥接设备
    ip link add br0 type bridge
    ip link set br0 up
    
    # 1.3 将物理网卡(如eth0)和TAP设备加入网桥
    ip link set enp0s3 master br0
    ip link set tap0 master br0
    
    # 1.4 配置IP地址(示例使用192.168.100.0/24网段)
    ip addr add 10.0.2.1/24 dev br0
    ip addr flush dev enp0s3  # 清除物理网卡IP
    
    # 1.5 启用IP转发(用于NAT上网)
    sysctl -w net.ipv4.ip_forward=1
    iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
    iptables -I FORWARD -i br0 -j ACCEPT
    
    # 验证:
    ip addr show br0
    ping 192.168.100.1  # 应通
    
    $ ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
        link/ether 08:00:27:f6:ba:60 brd ff:ff:ff:ff:ff:ff
    3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 08:00:27:42:75:92 brd ff:ff:ff:ff:ff:ff
        inet 192.168.56.102/24 brd 192.168.56.255 scope global enp0s8
           valid_lft forever preferred_lft forever
        inet6 fe80::a00:27ff:fe42:7592/64 scope link 
           valid_lft forever preferred_lft forever
    4: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel master br0 state DOWN group default qlen 1000
        link/ether 86:b0:b9:41:ee:87 brd ff:ff:ff:ff:ff:ff
    5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 08:00:27:f6:ba:60 brd ff:ff:ff:ff:ff:ff
        inet 10.0.2.1/24 scope global br0
           valid_lft forever preferred_lft forever
        inet6 fd17:625c:f037:2:1083:aed:7fc7:4d31/64 scope global temporary dynamic 
           valid_lft 86332sec preferred_lft 14332sec
        inet6 fd17:625c:f037:2:a00:27ff:fef6:ba60/64 scope global dynamic mngtmpaddr 
           valid_lft 86332sec preferred_lft 14332sec
        inet6 fe80::82a:f8ff:fe2c:6a78/64 scope link 
           valid_lft forever preferred_lft forever
    
  2. 启动qemu虚拟机,会自动分配IP。同时也可以访问外网,因为宿主机的enp0s3和外网是联通的。

    # ifconfig 
    eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
              inet addr:10.0.2.16  Bcast:10.0.2.255  Mask:255.255.255.0
              inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
              inet6 addr: fd17:625c:f037:2:5054:ff:fe12:3456/64 Scope:Global
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:9 errors:0 dropped:0 overruns:0 frame:0
              TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:1826 (1.7 KiB)  TX bytes:1290 (1.2 KiB)
    
    # ping 10.0.2.1
    PING 10.0.2.1 (10.0.2.1): 56 data bytes
    64 bytes from 10.0.2.1: seq=0 ttl=64 time=8.292 ms
    64 bytes from 10.0.2.1: seq=1 ttl=64 time=2.754 ms
    64 bytes from 10.0.2.1: seq=2 ttl=64 time=2.094 ms
    
    # ping www.baidu.com
    PING www.baidu.com (183.2.172.177): 56 data bytes
    64 bytes from 183.2.172.177: seq=0 ttl=255 time=37.433 ms
    64 bytes from 183.2.172.177: seq=1 ttl=255 time=37.211 ms
    64 bytes from 183.2.172.177: seq=2 ttl=255 time=37.342 ms
    
  • 优化,将宿主机的网络配置写到脚本中去,然后每次上电启动时自动加载,配置方式如下:

    1. 在/usr/local/bin目录下放置启动脚本,当前我命名为qemu_host_config.sh

    2. 给脚本添加可执行权限:

      chmod +x qemu_host_config.sh
      
    3. 创建 systemd 服务文件,放在/etc/systemd/system/qemu_host_config.service,内容如下:

      [Unit]
      Description=Custom Startup Script
      After=network.target
      Requires=network.target
      
      [Service]
      Type=oneshot
      ExecStart=/usr/local/bin/qemu_host_config.sh
      RemainAfterExit=yes
      TimeoutSec=0
      
      [Install]
      WantedBy=multi-user.target
      
    4. 启动并测试服务

      # 重新加载 systemd
      root@grace:/usr/local/bin# systemctl daemon-reload
      
      # 启用服务(开机自启)
      root@grace:/usr/local/bin# systemctl enable qemu_host_config.service
      Created symlink /etc/systemd/system/multi-user.target.wants/qemu_host_config.service → /etc/systemd/system/qemu_host_config.service.
      
      # 立即启动测试
      root@grace:/usr/local/bin# systemctl start qemu_host_config.service
      
      # 检查状态
      root@grace:/usr/local/bin# systemctl status qemu_host_config.service
      ● qemu_host_config.service - Custom Startup Script
         Loaded: loaded (/etc/systemd/system/qemu_host_config.service; enabled; vendor preset: enabled)
         Active: active (exited) since Fri 2025-06-27 03:34:18 UTC; 1s ago
        Process: 2409 ExecStart=/usr/local/bin/qemu_host_config.sh (code=exited, status=0/SUCCESS)
       Main PID: 2409 (code=exited, status=0/SUCCESS)
      
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:     link/ether 08:00:27:f6:ba:60 brd ff:ff:ff:ff:ff:ff
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:     inet 10.0.2.1/24 scope global br0
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:        valid_lft forever preferred_lft forever
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:     inet6 fd17:625c:f037:2:3dd2:1087:68e9:7af4/64 scope global temporary dynamic
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:        valid_lft 86139sec preferred_lft 14139sec
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:     inet6 fd17:625c:f037:2:a00:27ff:fef6:ba60/64 scope global dynamic mngtmpaddr
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:        valid_lft 86139sec preferred_lft 14139sec
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:     inet6 fe80::9c03:beff:fe30:a85a/64 scope link
      Jun 27 03:34:18 grace qemu_host_config.sh[2409]:        valid_lft forever preferred_lft forever
      Jun 27 03:34:18 grace systemd[1]: Started Custom Startup Script.
      
    5. reboot重启,查看是否已经自动加载

两个qemu虚拟机网络配置

只需要更改/usr/local/bin/qemu_host_config.sh文件,更改为下面的内容:

#!/bin/bash
# QEMU Network initialization script

# 创建网桥
ip link add br0 type bridge
ip link set br0 up

# 创建两个TAP设备
ip tuntap add tap0 mode tap
ip tuntap add tap1 mode tap

# 启用TAP设备
ip link set tap0 up
ip link set tap1 up

# 将TAP设备加入网桥
ip link set tap0 master br0
ip link set tap1 master br0
ip link set enp0s3 master br0

# 为网桥分配IP地址
ip addr add 10.0.2.4/24 dev br0
ip addr flush dev enp0s3

# 启用IP转发
sysctl -w net.ipv4.ip_forward=1

# 配置NAT转发规则(替换enp3s0为你的实际网卡名)
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -A FORWARD -i br0 -o enp0s3 -j ACCEPT
iptables -A FORWARD -i enp0s3 -o br0 -j ACCEPT

# 重新配置物理网卡IP
ip link set enp0s3 up
ip addr add 10.0.2.15/24 dev enp0s3
ip route add default via 10.0.2.2

配置完成后的主机网络如下:

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 08:00:27:f6:ba:60 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 scope global enp0s3
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:42:75:92 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.102/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe42:7592/64 scope link 
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:f6:ba:60 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.4/24 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fd17:625c:f037:2:c1de:59e2:925:fe75/64 scope global temporary dynamic 
       valid_lft 86244sec preferred_lft 14244sec
    inet6 fd17:625c:f037:2:a00:27ff:fef6:ba60/64 scope global dynamic mngtmpaddr 
       valid_lft 86244sec preferred_lft 14244sec
    inet6 fe80::c42b:1fff:fe8e:6174/64 scope link 
       valid_lft forever preferred_lft forever
5: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 3e:83:15:ee:ae:f5 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::3c83:15ff:feee:aef5/64 scope link 
       valid_lft forever preferred_lft forever
6: tap1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 66:4c:13:d6:e7:cc brd ff:ff:ff:ff:ff:ff
    inet6 fe80::644c:13ff:fed6:e7cc/64 scope link 
       valid_lft forever preferred_lft forever

启动qemu虚拟机时,会自动的分配ip,并且可以访问主机,qemu虚拟机之间也可以相互访问。

VirtualBox网络说明

NAT

在 VirtualBox 中使用 NAT(网络地址转换)模式时,网络配置信息如下:

配置项 说明
网关 (Gateway) 10.0.2.2 虚拟机访问外网的出口
DHCP 服务器 10.0.2.2 提供 IP 地址的服务器
IP 分配范围 10.0.2.15 ~ 10.0.2.254 虚拟机获得的IP地址范围
子网掩码 255.255.255.0 网络掩码
宿主机 IP 10.0.2.1 宿主机的内部通信地址
DNS 代理 10.0.2.3 VirtualBox 内置的 DNS 代理

网络拓扑:

[    虚拟机           ]
      | (eth0: 10.0.2.15)
      |
[ VirtualBox NAT 引擎 ]
      | (网关: 10.0.2.2)
      |
   [ 宿主机 ]
      |
   [ 路由器/互联网 ]

自定义NAT地址

参考:修改 VirtualBox 中 NAT 网络的默认 IP 段 - 哔哩哔哩

VirtualBox默认的NAT地址为10.0.2.15,可能和其它网络冲突,可以使用下面的步骤进行更改:

  1. 修改 VirtualBox 的 NAT 网络配置

    1. 关闭所有相关虚拟机

    2. 打开 VirtualBox,进入 全局设置(菜单栏:管理 → 工具 → 网络管理器)。

    3. 主机网络管理器 中如果尚未创建:点击 创建 新建一个 NAT 网络,修改以下参数:

      • IPv4网络掩码:设置新网段(例如 192.168.100.0/24)
      • 启用 DHCP:勾选以自动分配 IP(或手动配置静态 IP)
    4. 点击 应用 保存配置

      image-20250715190617370

  2. 将虚拟机连接到新 NAT 网络

    1. 在 VirtualBox 中选择目标虚拟机,点击 设置网络

    2. 选择网卡(如 适配器 1),配置如下:

      • 连接方式:选择 NAT 网络。注意不是 网络地址转换 (NAT)。

      • 名称:选择刚创建的 NAT 网络

    3. 点击 确定 保存设置

      image-20250715190757774

    4. 启动虚拟机,如果使用的是DHCP获取IP地址,则会自动分配新的IP,如果使用的是静态IP,则需要进行相应的修改。

buildroot menuconfig

新增编译gdb

image-20250630170438297 image-20250630170534160

编译ssh

ssh配置,修改/etc/ssh/sshd_config文件,下面的必要配置需要打开:

PermitRootLogin yes                  	 # 允许root登录
PasswordAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys  # 公钥路径正确
Subsystem sftp /usr/libexec/sftp-server  # SFTP配置正常

配置完成后,可以使用ssh root@xx.xx.xx.xx登录,但是不能使用SecureCRT登录,暂未找到原因。

终端显示配置

默认终端显示格式为:

# 
# 
# 

修改/etc/profile文件,在文件最后增加一行:

export PS1='[\u@\h: \w\a\]$ ' #注意要用(')

重新登录,效果如下:

[root@buildroot: ~]$ 
[root@buildroot: ~]$ 

编译gdb

如果使用 Buildroot,执行make menuconfig,需要打开下面的两个库:

Target packages → Libraries → 
	-> JSON/XML
		[*] expat  
    -> Other
  		[*] gmp

编译步骤,执行下面的脚本即可:

#!/bin/bash

# 设置环境变量以及交叉工具链的路径,以及使用到的一些库的位置
export TOOLCHAIN_PATH="/home/grace/sda4/qemu+aarch64+buildroot20250204/buildroot-2025.02.4/output/host"
export PATH="$TOOLCHAIN_PATH/bin:$PATH"
export SYSROOT="$TOOLCHAIN_PATH/aarch64-buildroot-linux-gnu/sysroot"

# 显式声明工具链命令
export AR="$TOOLCHAIN_PATH/bin/aarch64-buildroot-linux-gnu-ar"
export RANLIB="$TOOLCHAIN_PATH/bin/aarch64-buildroot-linux-gnu-ranlib"
export STRIP="$TOOLCHAIN_PATH/bin/aarch64-buildroot-linux-gnu-strip"
export CC="$TOOLCHAIN_PATH/bin/aarch64-buildroot-linux-gnu-gcc"
export CXX="$TOOLCHAIN_PATH/bin/aarch64-buildroot-linux-gnu-g++"

# 检查工具链可执行性
chmod +x $TOOLCHAIN_PATH/bin/aarch64-buildroot-linux-gnu-*

# 配置
./configure \
    --host=aarch64-buildroot-linux-gnu \
    --prefix=/opt/cross-gdb \
    --with-sysroot="$SYSROOT" \
    CC="$CC" \
    CXX="$CXX" \
    AR="$AR" \
    RANLIB="$RANLIB" \
    --disable-werror \
    --with-expat \
    --with-gmp

# 编译安装
make -j$(nproc) && sudo make install

gdbserver使用

作用:用于 远程调试 目标设备上的程序。

(1) 在目标设备启动 gdbserver

# 调试已运行进程
gdbserver :<端口号> --attach <PID>  

# 启动新程序调试
gdbserver :<端口号> <程序路径> [参数]

示例

gdbserver :2345 /usr/bin/my_app arg1 arg2  # 在目标设备执行

(2) 本机连接远程gdbserver,要使用交叉工具链编译的gdb,比如/home/grace/sda4/qemu+aarch64/buildroot-2022.02.2-output/output/host/bin/aarch64-buildroot-linux-uclibc-gdb

/home/grace/sda4/qemu+aarch64/buildroot-2022.02.2-output/output/host/bin/aarch64-buildroot-linux-uclibc-gdb 
(gdb) target remote <目标设备IP>:<端口号>
(gdb) continue

示例:

$ /home/grace/sda4/qemu+aarch64/buildroot-2022.02.2-output/output/host/bin/aarch64-buildroot-linux-uclibc-gdb 
GNU gdb (GDB) 10.2
(gdb) target remote 10.0.2.20:1234
(gdb) continue
# 接着使用类似的命令调试即可

QEMU一些配置

扩展磁盘空间

qemu启动时,如何指定磁盘空间太小,如何扩大,默认分配的太小

# df -h

Filesystem                Size      Used Available Use% Mounted on
/dev/root                51.1M     49.9M         0 100% /
devtmpfs                 55.8M         0     55.8M   0% /dev
tmpfs                    56.4M         0     56.4M   0% /dev/shm
tmpfs                    56.4M     20.0K     56.4M   0% /tmp
tmpfs                    56.4M     28.0K     56.4M   0% /run

扩展方式:在主机上执行下面的命令

(1) 创建全新 1GB 镜像(跳过 dd 复制)

# 删除旧文件(先备份!)
mv rootfs.ext4 rootfs_large.ext4.bak

# 创建新的 1GB 空镜像
qemu-img create -f raw rootfs_large.ext4 1G

# 格式化为 ext4
mkfs.ext4 rootfs_large.ext4

(2) 挂载并复制数据

mkdir -p mnt/new mnt/old

# 挂载新旧镜像
mount -o loop rootfs_large.ext4 mnt/new
mount -o loop rootfs.ext4 mnt/old

# 保留权限复制所有文件
cp -a mnt/old/* mnt/new/

# 卸载
umount mnt/new mnt/old

(3) 验证镜像大小

qemu-img info rootfs_large.ext4

现在应显示:

$ qemu-img info rootfs_large.ext4
image: rootfs_large.ext4
file format: raw
virtual size: 1 GiB (1073741824 bytes)
disk size: 15 MiB

(4)更改qemu启动时挂载新的文件系统

./qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -smp 1 -kernel Image -append "rootwait root=/dev/vda console=ttyAMA0" \
        -drive file=rootfs_large.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -nographic -device edu \
        -net nic,macaddr=00:16:3e:00:00:02 -net tap,ifname=tap0,script=no,downscript=no

(5)启动虚拟机,查看磁盘空间

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               973.4M     13.9M    892.4M   2% /
devtmpfs                 55.8M         0     55.8M   0% /dev
tmpfs                    56.4M         0     56.4M   0% /dev/shm
tmpfs                    56.4M     20.0K     56.4M   0% /tmp
tmpfs                    56.4M     20.0K     56.4M   0% /run

(6)其它

  • 如果挂载旧的文件系统失败,比如:

    $ mount -t ext4 -o loop rootfs.ext4 mnt/old
    mount: /home/grace/sda4/qemu+aarch64+buildroot20250204/buildroot-2025.02.4/output/images/mnt/old: wrong fs type, bad option, bad superblock on /dev/loop1, missing codepage or helper program, or other error.
    

    解决方式,执行下面的命令:

    losetup -fP rootfs.ext4  # 自动分配loop设备
    LOOP_DEV=$(losetup -a | grep rootfs.ext4 | awk -F: '{print $1}')
    mount -t ext4 -o ro $LOOP_DEV mnt/old
    
  • 扩展:如果要拷贝某个文件到文件系统中,可以参考上面的方式,先挂载文件系统到某个目录,然后拷贝文件到文件系统中,再卸载即可,比如:

    mount -o loop rootfs_large.ext4 mnt/new
    
    cp /home/grace/tftpboot/gdb mnt/new/usr/bin/
    
    umount mnt/new 
    
posted @ 2025-06-23 18:11  Mrlayfolk  阅读(182)  评论(0)    收藏  举报
回到顶部