QEMU启动ARM64 Linux内核
目录
- 前言
- 前置知识
- virt开发板
- ARM处理器家族简介
- 安装qemu-system-aarch64
- 安装交叉编译工具
- 交叉编译ARM64 Linux内核
- 交叉编译ARM64 Busybox
- 使用busybox制作initramfs
- 使用QEMU启动ARM64 Linux内核
前言
本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文章介绍),并启动ARM64 Linux内核。大致思路是:
- 安装qemu-system-aarch64(ARM-64bit)模拟器;
- 安装aarch64-linux-gnu(ARM-64bit)交叉编译器;
- 交叉编译linux源码,得到ARM64 Linux内核镜像;
- 交叉编译busybox源码,使用busybox制作initramfs;
- 最后使用qemu-system-aarch64启用ARM64 Linux内核;
我的环境:
- 宿主机硬件平台:x86_64
- 宿主机操作系统:Ubuntu 20.04 (Linux 5.4.0-139-generic)
- QEMU版本:qemu-4.2.1
- 实验内核:linux-5.19
- busybox版本:busybox-1.35.0
前置知识
virt开发板
截至书稿本文时,QEMU模拟了多大70几种的硬件开发板,可参考Arm System emulator。但ARM-64bit的QEMU模拟器非常少,以至于virt成了唯一的选择。virt支持PCI,virtio,较新的ARM CPU,大容量内存,比较遗憾的是它不支持图形界面,如果你不知道选择什么硬件开发板就选virt。
更详尽的内容可参考:
Why the “virt”board?
Installing Debian on QEMU’s 32-bit ARM “virt”board
Installing Debian on QEMU’s 64-bit ARM “virt”board
ARM处理器家族简介
ARM处理器家族众多,哪些是32bit,哪些是64bit,可参考:
List_of_ARM_processors
很多厂家使用ARM核设计SOC芯片,这里罗列了很多,可参考:
List_of_products_using_ARM_processors
安装qemu-system-aarch64
安装:
$ sudo apt install qemu-system-arm
会同时安装ARM-32bit的qemu-system-arm版本和ARM-64bit的 qemu-system-aarch64版本,查看版本号:
$ qemu-system-aarch64 --version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.24)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
查看 qemu 支持的 ARM 内核开发板,本文选择virt开发板:
$ qemu-system-aarch64 -M help
Supported machines are:
akita Sharp SL-C1000 (Akita) PDA (PXA270)
ast2500-evb Aspeed AST2500 EVB (ARM1176)
ast2600-evb Aspeed AST2600 EVB (Cortex A7)
borzoi Sharp SL-C3100 (Borzoi) PDA (PXA270)
canon-a1100 Canon PowerShot A1100 IS
cheetah Palm Tungsten|E aka. Cheetah PDA (OMAP310)
collie Sharp SL-5500 (Collie) PDA (SA-1110)
connex Gumstix Connex (PXA255)
cubieboard cubietech cubieboard (Cortex-A8)
emcraft-sf2 SmartFusion2 SOM kit from Emcraft (M2S010)
highbank Calxeda Highbank (ECX-1000)
imx25-pdk ARM i.MX25 PDK board (ARM926)
integratorcp ARM Integrator/CP (ARM926EJ-S)
kzm ARM KZM Emulation Baseboard (ARM1136)
lm3s6965evb Stellaris LM3S6965EVB
lm3s811evb Stellaris LM3S811EVB
mainstone Mainstone II (PXA27x)
mcimx6ul-evk Freescale i.MX6UL Evaluation Kit (Cortex A7)
mcimx7d-sabre Freescale i.MX7 DUAL SABRE (Cortex A7)
microbit BBC micro:bit
midway Calxeda Midway (ECX-2000)
mps2-an385 ARM MPS2 with AN385 FPGA image for Cortex-M3
mps2-an505 ARM MPS2 with AN505 FPGA image for Cortex-M33
mps2-an511 ARM MPS2 with AN511 DesignStart FPGA image for Cortex-M3
mps2-an521 ARM MPS2 with AN521 FPGA image for dual Cortex-M33
musca-a ARM Musca-A board (dual Cortex-M33)
musca-b1 ARM Musca-B1 board (dual Cortex-M33)
musicpal Marvell 88w8618 / MusicPal (ARM926EJ-S)
n800 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810 Nokia N810 tablet aka. RX-44 (OMAP2420)
netduino2 Netduino 2 Machine
none empty machine
nuri Samsung NURI board (Exynos4210)
palmetto-bmc OpenPOWER Palmetto BMC (ARM926EJ-S)
raspi2 Raspberry Pi 2
raspi3 Raspberry Pi 3
realview-eb ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8 ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9 ARM RealView Platform Baseboard Explore for Cortex-A9
romulus-bmc OpenPOWER Romulus BMC (ARM1176)
sabrelite Freescale i.MX6 Quad SABRE Lite Board (Cortex A9)
sbsa-ref QEMU 'SBSA Reference' ARM Virtual Machine
smdkc210 Samsung SMDKC210 board (Exynos4210)
spitz Sharp SL-C3000 (Spitz) PDA (PXA270)
swift-bmc OpenPOWER Swift BMC (ARM1176)
sx1 Siemens SX1 (OMAP310) V2
sx1-v1 Siemens SX1 (OMAP310) V1
terrier Sharp SL-C3200 (Terrier) PDA (PXA270)
tosa Sharp SL-6000 (Tosa) PDA (PXA255)
verdex Gumstix Verdex (PXA270)
versatileab ARM Versatile/AB (ARM926EJ-S)
versatilepb ARM Versatile/PB (ARM926EJ-S)
vexpress-a15 ARM Versatile Express for Cortex-A15
vexpress-a9 ARM Versatile Express for Cortex-A9
virt-2.10 QEMU 2.10 ARM Virtual Machine
virt-2.11 QEMU 2.11 ARM Virtual Machine
virt-2.12 QEMU 2.12 ARM Virtual Machine
virt-2.6 QEMU 2.6 ARM Virtual Machine
virt-2.7 QEMU 2.7 ARM Virtual Machine
virt-2.8 QEMU 2.8 ARM Virtual Machine
virt-2.9 QEMU 2.9 ARM Virtual Machine
virt-3.0 QEMU 3.0 ARM Virtual Machine
virt-3.1 QEMU 3.1 ARM Virtual Machine
virt-4.0 QEMU 4.0 ARM Virtual Machine
virt-4.1 QEMU 4.1 ARM Virtual Machine
virt QEMU 4.2 ARM Virtual Machine (alias of virt-4.2)
virt-4.2 QEMU 4.2 ARM Virtual Machine
witherspoon-bmc OpenPOWER Witherspoon BMC (ARM1176)
xilinx-zynq-a9 Xilinx Zynq Platform Baseboard for Cortex-A9
xlnx-versal-virt Xilinx Versal Virtual development board
xlnx-zcu102 Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on the value of smp
z2 Zipit Z2 (PXA27x)
看下virt开发板支持的cpu列表,本文以64-bit的cortex-a57为例说明:
$ qemu-system-aarch64 -M virt --cpu help
Available CPUs:arm1026arm1136arm1136-r2arm1176arm11mpcorearm926arm946cortex-a15cortex-a53cortex-a57cortex-a7cortex-a72cortex-a8cortex-a9cortex-m0cortex-m3cortex-m33cortex-m4cortex-r5cortex-r5fmaxpxa250pxa255pxa260pxa261pxa262pxa270-a0pxa270-a1pxa270pxa270-b0pxa270-b1pxa270-c0pxa270-c5sa1100sa1110ti925t
安装交叉编译工具
我们是在X86平台下进行的开发,目标平台是arm架构,需要安装交叉编译工具链。有关arm-linux的交叉编译器主要有:
- 针对ARM-32bit的arm-linux-gnueabi和arm-linux-gnueabihf。
- 针对ARM-64bit的aarch64-linux-gnu。
交叉编译器各版本的区别可参考《arm系列交叉编译器各版本区别.doc》。
安装ARM-64bit的aarch64-linux-gnu版本:
$ sudo apt install gcc-aarch64-linux-gnu
查看版本:
$ aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
交叉编译ARM64 Linux内核
下载源码:
$ mkdir ~/kvm-arm
$ cd ~/kvm-arm/
$ wget https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/snapshot/linux-5.19.tar.gz
$ tar -xf linux-5.19.tar.gz
$ cd linux-5.19/
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build defconfig
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build -j8
说明:
- ARCH:指定目标CPU架构;
- CROSS_COMPILE:指定交叉编译器;
- O=build:O是Out的缩写,表示编译输出文件放在build目录,不跟源码混在一起,保持源码的整洁性。
- make时只有defconfig配置可选,因为 linux-5.19/arch/arm64/configs/ 目录下有且只有defconfig一个。
查看下内核编译出来的原始内核文件vmlinux,是ARM 64-bit版本。
$ file build/vmlinux
build/vmlinux: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=f2a5fd51bd2d59f90b7b26b8926f5afdeab60f36, not stripped
vmlinux不能直接引导Linux系统启动,能引导Linux系统启动的是Image文件(非压缩版)或Image.gz(压缩版),下文用到的内核镜像就是Image:
$ file build/arch/arm64/boot/Image
build/arch/arm64/boot/Image: MS-DOS executable PE32+ executable (EFI application) Aarch64 (stripped to external PDB), for MS Windows$ file build/arch/arm64/boot/Image.gz
build/arch/arm64/boot/Image.gz: gzip compressed data, max compression, from Unix, original size modulo 2^32 36112896
交叉编译ARM64 Busybox
$ mkdir ~/kvm-arm
$ cd ~/kvm-arm/
$ wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
$ tar -xf busybox-1.35.0.tar.bz2
$ cd busybox-1.35.0/$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make menuconfig# 修改配置,选中如下项目,静态编译
# Settings –> Build Options –> [*] Build static binary(no share libs)# 反选如下项目,否则后续qemu执行会提示 /bin/sh:can't access tty;job control turned off
# Shells ---> [ ] Job control$ make -j `nproc`
$ make install
装完后会 默认安装到源码目录的 _install/ 目录下:
$ ls _install/
bin linuxrc sbin usr
最关键的就是_install/bin/busybox,其他都是链接文件。
$ file _install/bin/busybox
_install/bin/busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=3768162c347859f16ab4f0b01a48fb8c0502774d, for GNU/Linux 3.7.0, stripped
编译的过程中如果出现如下提示,可忽略:
Trying libraries: m resolv rtLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)Library rt is not needed, excluding itLibrary m is needed, can't exclude it (yet)Library resolv is needed, can't exclude it (yet)
Final link with: m resolv
使用busybox制作initramfs
使用busybox快速制作initramfs。
创建虚拟rootfs中的inti启动脚本,并赋予可执行权限:
$ cd ~/kvm-arm/busybox-1.35.0/_install/
$ touch init
$ chmod +x init
脚本内容:
#!/bin/sh# 挂载一些必要的文件系统
mkdir /proc && mount -t proc none /proc
mkdir /sys && mount -t sysfs none /sys
mkdir /tmp && mount -t tmpfs none /tmpecho
echo "Hello 64-bit ARM Linux"# 显示开机消耗时间
echo "This boot took $(cut -d' ' -f1 /proc/uptime) seconds"
echo# 停留在控制台
exec /bin/sh
制作initramfs文件,它是多个文件通过cpio打包和gzip压缩的文件,是一个cpio格式的内存文件系统。
$ find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz
使用QEMU启动ARM64 Linux内核
ARM Linux内核镜像和initramfs都准备好,就可以使用QEMU启动linux内核了。
以字符界面方式启动QEMU,同时日志输出到控制台:
$ qemu-system-aarch64 \-M virt \-cpu cortex-a57 \-smp 8 \-m 8G \-kernel ./linux-5.19/build/arch/arm64/boot/Image \-initrd ./busybox-1.35.0/initramfs.cpio.gz \-nographic \-append "init=/init console=ttyAMA0"
QEMU参数说明(更多可参考:Standard options):
- -M:指定模拟的开发板,可通过qemu-system-aarch64 M help查看,截至书稿时,只有virt支持64-bit ARM。
- -cpu:指定模拟的cpu,可通过qemu-system-aarch64 -M virt --cpu help查看,这里选择cortex-a57。
- -smp:指定cpu核数量,启动后可以使用nproc命令核对。
- -m:指定内存大小,virt 可支持超大内存,启动后可以使用free -h命令核对。
- -kernel:指定启动的内核镜像;
- -initrd:指定启动的内存文件系统;
- -append:传递给内核的启动参数;启动后可使用cat /proc/cmdline命令核对。
- -nographic:启动字符界面(不启动图形界面),输出重定向到宿主机命令行,与参数 console=ttyAMA0 组合使用;
9 参考
- Arm System emulator
- Arm Versatile Express boards (vexpress-a9, vexpress-a15)
- List_of_products_using_ARM_processors
- List_of_ARM_processors
- Qemu使用及常见开发板的模拟
- qemu-system-aarch64使用和相关参数介绍
相关文章:

QEMU启动ARM64 Linux内核
目录前言前置知识virt开发板ARM处理器家族简介安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文…...

Linux->进程程序替换
目录 前言: 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言: 通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…...

最强分布式锁工具:Redisson
1 Redisson概述1.1 什么是Redisson?Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...
Java9-17新特性
Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么JDK1.9要允许接口定义私有方法呢?因为我们说接口是规范,规范时需要公开…...

电脑开机找不到启动设备怎么办?
电脑正常开机,却提示“找不到启动设备”,这时我们该怎么办呢?本文就为大家介绍几种针对该问题的解决方法,一起来看看吧!“找不到启动设备”是什么意思?可引导设备(又称启动设备)是一…...

使用langchain打造自己的大型语言模型(LLMs)
我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知,无所不能,但是由于有机器人所学习到的是截止到2021年9月以前的知识,所以当用户询问机器人关于2021年9月以后发送的事情时,它无法给出正确的答案&#x…...
assert()宏函数
assert()宏函数 assert是宏,而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression, 如果其值为假(即为0),那么它会打印出来assert的内容…...

Docker圣经:大白话说Docker底层原理,6W字实现Docker自由
说在前面: 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社群(50)中,很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer&#…...

Redis+Caffeine多级(二级)缓存,让访问速度纵享丝滑
目录多级缓存的引入多级缓存的优势CaffeineRedis实现多级缓存V1.0版本V2.0版本V3.0版本多级缓存的引入 在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中࿰…...

C#和.net框架之第一弹
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录C# 简介一、微软平台的编程二、使用VS创建第一个c#程序1、第一步2、第二步3、第三步4、第四步5、第五步C# 简介 C# 是一个现代的、通用的、面向对象的编程语言&…...
C++---背包模型---潜水员(每日一道算法2023.3.12)
注意事项: 本题是"动态规划—01背包"和"背包模型—二维费用的背包问题"的扩展题,优化思路不多赘述,dp思路会稍有不同,下面详细讲解。 题目: 潜水员为了潜水要使用特殊的装备。 他有一个带2种气体…...
C++类的成员变量和成员函数详解
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类…...
(枚举)(模拟)(位运算)116. 飞行员兄弟
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 116. 飞行员兄弟 - AcWing题库 我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦…...

详解Array.prototype.shift.call(arguments)
经常看到如下代码: function foo() {let k Array.prototype.shift.call(arguments);console.log(k) } foo(11,22) //11 Array.prototype.shift.call(arguments)的作用是: 取 arguments 中的第一个参数 一、为啥要这么写,不直接使用argume…...

Tina_Linux_Wi-Fi_开发指南
Tina Linux Wi-Fi 开发指南 1 前言 1.1 文档简介 介绍Allwinner 平台上Wi-Fi 驱动移植,介绍Tina Wi-Fi 管理框架,包括Station,Ap 以及Wi-Fi 常见问题。 1.2 目标读者 适用Tina 平台的广大客户和对Tina Wi-Fi 感兴趣的同事。 1.3 适用范…...

Spring AOP(AOP概念、组成、Spring AOP实现及实现原理)
文章目录1. Spring AOP 是什么2. 为什么要用 AOP3. 怎么学 Spring AOP4. AOP 组成5. Spring AOP 实现5.1 添加 Spring AOP 框架支持5.2 定义切面和切点5.3 实现通知方法5.4 使⽤ AOP 统计 UserController 每个⽅法的执⾏时间 StopWatch5.4 切点表达式说明 AspectJ6. Spring AOP…...

8.条件渲染指令
目录 1 v-if v-show 2 v-if v-else-if v-else 1 v-if v-show v-if与v-show都可以控制DOM的显示与隐藏 由于flag是布尔值,所以这里可以直接写 v-if"flag" 当flag为true的时候,v-if与v-show控制的div都会被显示出来 当flag为false的时候&a…...

2023年全网最全最细最流行的自动化测试工具有哪些?你都知道吗!
下面就是我个人整理的一些比较常用的自动化测试工具,并且还有视频版本的详细介绍,同时在线学习人数超过1000人! B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)一:前言 随着测试工程师技能和…...

网络安全——数据链路层安全协议
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.数据链路层安全协议简介 1.数据链路安全性 二.局域网数据链路层协议 1.…...

编译原理基础概念
一、什么是编译程序编译程序是一种程序,能够将某一种高级语言编写的源程序改造成另一种低级语言编写的目标程序,他们在逻辑上等价、完成相同的工作二、编译阶段1、当目标程序是机器语言时,编译阶段:(1)编译…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...