linux搭建环境搭建
‘壹’ 嵌入式linux系统开发的具体步骤_嵌入式linux系统的搭建流程和要点
第一步、建立交叉编译环境
没有交叉开发经验的读者,可能一时很难接受这个概念。首先,要明白两个概念:一般我们工作的机器,称为开发机、主机;我们制作好的系统将要放到某台机器,如手机或另一台PC机,这台机我们称为目标主机。
我们一般开发机上已经有一套开发工具,我们称之为原生开发套件,我们一般就是用它们来写程序,那么,那什么又是交叉编译环境呢?其实一点也不神秘,也就是在开发岩困机上再安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者我们自己的程序,是放在目标主机上运行的。
那么或许有初学者会问,直接用原生开发工具为目标主机编译程序不就完了?至少我当初是这么想的。此枣绝一般来说,我们的开发机都是X86平台,原生开发套件开发的工具,也针对X86平台,而我们的目标主机可能是PowerPC、IXP、MIPS所以,我们的交叉编译环境是针对某一类具体平台的。
一般来讲,交叉开发环境需要二进制工具程序、编译器、C链接库,嵌入式开发常用的
这三类软件是:BinutilsGuClibc
当然,GNU包含的工具套件不仅于此,你还要以根据实际需要,进行选择
第二步、编译内核
开发工具是针对某一类硬件平台,内核同样也是。这一步,我们需要用第一步中建立的工具,对内核进行编译,对于有内核编译经验的人来说,这是非常简单的;
第三步、建立根文件系统
也就是建立我们平常看到的bin、dev、proc这一大堆目录,以及一些必备的文件;
另外,我们还需要为我们的目标系统安装一些常用的工具软件,如ls、ifconfig当然,一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一是森姿数量多,二是某些体积较大,不适合嵌入式系统,这一步,我们一般都是用busybox来完成的,包括系统引导软件init;
最后,我们为系统还需要建立初始化的引导文件,如inittab
‘贰’ Linux环境下C开发_linux搭建c语言开发环境
一:C语言嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。
二:Linux基础Linux操作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI,编译器GCC,调试器GDB和Make项目管理工具,ShellMakefile脚本编写等知识,嵌入式开发环境的搭建。
三:Linux系统编程重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。
四:Linux网络编程计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,javascript等Web编程技术及实现方法。
五:数据结构与算法数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮旅瞎性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。
六:C、QTC是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。
七:CortexA8、Linux平台开发通过基于ARMCortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nandflash控制器等模块,为底层平台搭建做好准备。Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。同时了解Android操作系统开发流程。Android系统是基于Linux平台的开源操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。
八:驱动开发拆颤空驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。本阶洞租段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARMCortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。
以上就是列出的关于一名合格嵌入式Linux开发工程师所必学的理论知识,其实,作为一个嵌入式开发人员,专业知识和项目经验同样重要,所以在我们的理论学习中也要有一定的项目实践,锻炼自己的项目开发能力。
‘叁’ 来学一学LINUX系统中SHELL环境的搭建技巧
什么是 LINUX SHELL环境?shell在会话中会保存着大量信息,而这些信息就是shell环境。LINNX命令程序通过获取SHELL环境中的数据(此处的数据通常称为环境变量)来输出本机相应的配置数据。
LINUX环境变量
Linux shell环境中存储了两种基本类型的数据:环境变量和shell变量。当然,除了变量,shell也存储了一些可编程的数据,即别名和shell 函数。
如何查看环境变量呢?
我们可以用bash命令set,或者使用printenv命令程序来查看环境变量。
它们的区别是:set 命令不仅显示shell数据,而且可以显示环境变量列表,而printenv命令仅仅显示环境变量列表。
鉴于环境变量列表比较长,我们可以将每个命令的输出通过管道符传递给less 来输出列表,例如:
//执行命令
[test@linuxprobe ~]$ printenv | less
//输出内容:环境变量及其数值的列表
KDE_MULTIHEAD=false
SSH_AGENT_PID=6666
HOSTNAME= linuxprobe
GPG_AGENT_INFO=/tmp/gpg-PdOt7g/S.gpg-agent:6689:1
SHELL=/bin/bash
TERM=xterm
XDG_MENU_PREFIX=kde-
HISTSIZE=1000
XDG_SESSION_COOKIE=-1208521990.996705
-1177056199
GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/home/me/.gtkrc-2.0:/home/me/.kde/sh
are/config/gtkrc-2.0
GTK_RC_FILES=/etc/gtk/gtkrc:/home/me/.gtkrc:/home/me/.kde/share/confi
g/gtkrc
GS_LIB=/home/me/.fonts
WINDOWID=29360136
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
KDE_FULL_SESSION=true
USER=test
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01
:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe:
//printenv 命令也可输出特定变量- USER的数值:
[test@linuxprobe ~]$ printenv USER
test
建立LINUX shell 环境
每当我们登录系统后,bash 程序就会自动启动,且会读取一系列配置脚本,这些配置脚本被称为启动文件。这些启动文件定义了可供所有用户共享的默认shell 环境。
那么位于家目录中的启动文件,定义了用户个人的shell 环境。
确切的启动顺序取决于shell 会话类型模式。有两种shell 会话类型模式:一个是登录shell 会话模式,另一个是非登录shell 会话模式。
登录shell 会话模式中会提示用户输入用户名和密码;非登录shell 会话模式通常在GUI下启动终端会话时出现。
登录shell 会话模式下启动文件内容:
非登录shell 会话模式下启动文件内容:
修改linux shell环境
依据通常的操作思路,通过添加目录到PATH 变量或定义新的环境变量,再把这些更改存放至.bash_profile 文件中;那么对于其它的更改呢,需要存放至.bashrc 文件中。
除了系统管理员具将系统中的所有用户修改默认设置的权限外,其他用户只能限定对个人家目录下的文件进行修改。
我们通过使用一个叫做文本编辑器的程序来编辑(或读、写)shell 的启动文件以及其它配置文件。文本编辑器是一个类似于文字处理器的程序,允许使用移动光标在屏幕上编辑。但不同之处在于文本编辑器不仅支持纯文本,而且常包含为便于写程序而设计的特性。由此可见,文本编辑器是开发人员用来写代码,以及系统管理员用来管理控制系统的配置文件的重要工具之一。
文本编辑器通常分为两种基本类型:图形化的和非图形化的(基于文本)编辑器。
一些典型的图形化编辑器有GNOME 和KDE。GNOME编辑器自带了gedit 的编辑器,它通常在GNOME 菜单中称为“文本编辑器”。KDE自带了三种编辑器,分别是kedit,kwrite,kate。
那么基于文本的编辑器有nano、vi 和emacs。
nano 编辑器是一个简单易用的编辑器。vi 编辑器(目前已被vim (“Vi IMproved” 的简写)替代)是类Unix 操作系统的传统编辑器。emacs 编辑器属于庞大的、多用途的,可做任何操作的编程环境。
无论哪种类型的文本编辑器都可以在命令行中输入编辑器的名字及想要编辑的文件名,执行文本编辑操作。在这篇文章中,我们学到了用文本编辑器来编辑配置文件的基本技巧。
这篇文章主要讨论了linux SHELL环境的一些基础知识及基本的操作技巧。在编写这篇文章过程中我还参考了 《Linux就该这么学(第2版)》 这本书,基于红帽8编写,内容很贴近实践,很有理论指导实践价值的一本书籍。
‘肆’ linux 的环境搭建(二)--redis单机环境、生产环境、集群环境的搭建
一、目录
1、工具
2、安装tcl
3、安装单机版redis
4、把redis设置为daemon进程,每次系统启动,redis进程一起启动
5、安装redis cluster
二、工具
2.1、tcl8.6.1-src.tar.gz
2.2、ruby-2.3.1.tar.gz
2.3、redis-4.1.1.gem
2.4、redis-3.2.8.tar.gz
2.5、openssl-1.0.2r.tar.gz
三、安装tcl(安装redis必须先要安装tcl)
3.1、把tcl8.6.1-src.tar.gz通过WinSCP上传到虚拟机中的/usr/local目录下
四、安装单机版redis
4.1、把redis-3.2.8.tar.gz通过WinSCP上传到虚拟机中的/usr/local目录下
4.2、依次运行如下命令:
tar -zxvf redis-3.2.8.tar.gz 解压文件
cd redis-3.2.8
make && make test && make install
五、把redis设置为daemon进程,每次系统启动,redis进程一起启动
5.1、将redis的utils目录下的redis_init_script脚本拷贝到linux的/etc/init.d目录中,将redis_init_script重命名为redis_6379,6379是我们希望这个redis实例监听的端口号
5.2、修改redis_6379脚本的第6行的REDISPORT,设置为相同的端口号(默认就是6379)
protected-mode no 取消保护模式,保护模式只能127.0.0.1访问
daemonize yes 让redis以daemon进程运行
pidfile /var/run/redis_6379.pid 设置redis的pid文件位置
bind 192.168.3.110
port 6379 设置redis的监听端口号
dir /var/redis/6379 设置持久化文件的存储位置
logfile /var/log/redis/6379.log 设置日志文件位置
5.6、启动redis,依次执行:
cd /etc/init.d,
chmod 777 redis_6379,赋读写执行的权限(chmod -R 777 * 是递归把该目录下的所有文件和其子文件全部赋权限)
./redis_6379 start 启动
5.7、确认redis进程是否启动,ps -ef | grep redis
5.8、让redis跟随系统启动自动启动
5.9、重启系统,不手动启动redis,直接连接redis,可以连接上,表示配置成功
此时一个单机版的redis的生产环境已经搭建好了,每次服务器重启,redis都会自动的启动
六、安装redis cluster
(redis cluster集群,要求至少3个master,去组成一个高可用,健壮的分布式的集群,每个master都建议至少给一个slave,3个master,3个slave)
6.1、前提,我在其它机器上启动了六个redis(安装步骤都如下)
2.2、创建三个目录:
mkdir -p /etc/redis-cluster 存放集群配置信息,自动生成配置
mkdir -p /var/log/redis redis日志
mkdir -p /var/redis/7001 存放redis的rdb文件和aof文件
6.3、将redis的utils目录下的redis_init_script脚本拷贝到linux的/etc/init.d目录中,将redis_init_script重命名为redis_7001,7001是我们希望这个redis实例监听的端口号,并修改redis_7001配置文件中的REDISPORT=7001
6.4、修改/etc/redis/7001.conf中的部分配置为生产环境
6.5、完成了一个redis环境的配置,依次再配置其余五个,分别为7002、7003、7004、7005、7006,每个启动脚本内,都修改对应的端口号
6.6、启动6个redis实例
6.7、创建集群(需要安装ruby、rubygems)
上述命令在部分机器上是可以直接运行完成,成功安装的,但在部分机器上运行第三条命令时会提示ruby版本太低、openssl找不到的问题,下面依次解决这两个问题:
6.8、再次运行gem install redis命令,报出两个错误
6.9、再次运行gem install redis命令,报出一个错误
6.10、再次运行gem install redis命令,报出一个错误
6.11、再次运行gem install redis命令
[root@ceshi01 local]# gem install redis
Successfully installed redis-4.1.1
Parsing documentation for redis-4.1.1
Done installing documentation for redis after 1 seconds
WARNING: Unable to pull data from ' https://rubygems.org/' : SSL_connect returned=1 errno=0 state=error: certificate verify failed ( https://api.rubygems.org/specs.4.8.gz )
1 gem installed
运行成功
此时Redis安装好,此三个工具也安装好了,这时我们来做一个Redis集群测试,在一台服务器中创建了6个Redis实例,开启6个Redis服务
redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006
[root@eshop-cache02 init.d]# redis-trib.rb create --replicas 1 192.168.3.104:7001 192.168.3.104:7002 192.168.3.105:7003 192.168.3.105:7004 192.168.3.106:7005 192.168.3.106:7006
此时一个redis集群环境就已经搭建好了,可以通过redis-trib.rb check 192.168.3.105:7003命令查看集群几点的信息
[root@eshop-cache02 init.d]# redis-trib.rb check 192.168.3.105:7004
redis cluster的优点:读写分离+高可用+多master
读写分离:每个master都有一个slave
高可用:master宕机,slave自动被切换过去
多master:横向扩容支持更大数据量
‘伍’ Linux下docker基础环境搭建
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 报错:curl: (6) Could not resolve host: get.docker.com; 未知的错误
# 解决:cat /etc/resolv.conf 里加了个 nameserver 8.8.8.8
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证安装:docker-compose --version
# compose 那个亚马逊的老是下载不了,可换对应地址:
sudo curl -L https://get.cloud.io/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
查看docker版本: docker --version
启动docker: systemctl start docker 或者 service docker start
停止docker: systemctl stop docker
查看docker镜像文件: docker images
查看docker内容器: docker ps -a
修改 /etc/dockers 文件下的配置文件 daemon.json (配置作用参考附录)
操作完成后需要重启docker: systemctl restart docker
服务端安装git:yum install git
拉取一下文件和命令:git clone http://172.16.1.35/demo/demo-dockers.git
查看本地和远端版本:git branch -a
切换本地分支为dev:git checkout -b dev origin/dev
启动docker:service docker start
后 执行文件中的shell:./init.sh all (包含:mysql,mongo,redis,solr,activemq,tomcat)
删除多下载的镜像:docker rmi --force 3068f6bb852e
容器列表: docker ps -a
进入某个容器:docker exec -it [CONTAINER ID] /bin/bash
查看某个容器进程:docker top [NAMES]
查看 demo-dockers 目录下 java-runtime 文件位置下有对应几个项目配置文件 application-alpha.yml
修改配置文件后,需要重新启动对应java项目,执行启动脚本 ./init-java-runtime.sh + [项目名或者all]
获取镜像文件的地址:http://172.18.5.112:5001/repository/demo/ 查找对应需要的镜像包
更换镜像文件: vi java-runtime.yml 内,image后的对应项目后跟的包名中
重启对应项目: ./init-java-runtime.sh [项目名]
查看对应项目启动log: docker logs -f --tail 500 [生成的容器名称]
(容器重启:docker restart [容器id或名称])
{
"authorization-plugins": [],//访问授权插件
"data-root": "",//docker数据持久化存储的根目录
"dns": [],//DNS服务器
"dns-opts": [],//DNS配置选项,如端口等
"dns-search": [],//DNS搜索域名
"exec-opts": [],//执行选项
"exec-root": "",//执行状态的文件的根目录
"experimental": false,//是否开启试验性特性
"storage-driver": "",//存储驱动器
"storage-opts": [],//存储选项
"labels": [],//键值对式标记docker元数据
"live-restore": true,//dockerd挂掉是否保活容器(避免了docker服务异常而造成容器退出)
"log-driver": "",//容器日志的驱动器
"log-opts": {},//容器日志的选项
"mtu": 0,//设置容器网络MTU(最大传输单元)
"pidfile": "",//daemon PID文件的位置
"cluster-store": "",//集群存储系统的URL
"cluster-store-opts": {},//配置集群存储
"cluster-advertise": "",//对外的地址名称
"max-concurrent-downloads": 3,//设置每个pull进程的最大并发
"max-concurrent-uploads": 5,//设置每个push进程的最大并发
"default-shm-size": "64M",//设置默认共享内存的大小
"shutdown-timeout": 15,//设置关闭的超时时限(who?)
"debug": true,//开启调试模式
"hosts": [],//监听地址(?)
"log-level": "",//日志级别
"tls": true,//开启传输层安全协议TLS
"tlsverify": true,//开启输层安全协议并验证远程地址
"tlscacert": "",//CA签名文件路径
"tlscert": "",//TLS证书文件路径
"tlskey": "",//TLS密钥文件路径
"swarm-default-advertise-addr": "",//swarm对外地址
"api-cors-header": "",//设置CORS(跨域资源共享-Cross-origin resource sharing)头
"selinux-enabled": false,//开启selinux(用户、进程、应用、文件的强制访问控制)
"userns-remap": "",//给用户命名空间设置 用户/组
"group": "",//docker所在组
"cgroup-parent": "",//设置所有容器的cgroup的父类(?)
"default-ulimits": {},//设置所有容器的ulimit
"init": false,//容器执行初始化,来转发信号或控制(reap)进程
"init-path": "/usr/libexec/docker-init",//docker-init文件的路径
"ipv6": false,//开启IPV6网络
"iptables": false,//开启防火墙规则
"ip-forward": false,//开启net.ipv4.ip_forward
"ip-masq": false,//开启ip掩蔽(IP封包通过路由器或防火墙时重写源IP地址或目的IP地址的技术)
"userland-proxy": false,//用户空间代理
"userland-proxy-path": "/usr/libexec/docker-proxy",//用户空间代理路径
"ip": "0.0.0.0",//默认IP
"bridge": "",//将容器依附(attach)到桥接网络上的桥标识
"bip": "",//指定桥接ip
"fixed-cidr": "",//(ipv4)子网划分,即限制ip地址分配范围,用以控制容器所属网段实现容器间(同一主机或不同主机间)的网络访问
"fixed-cidr-v6": "",//(ipv6)子网划分
"default-gateway": "",//默认网关
"default-gateway-v6": "",//默认ipv6网关
"icc": false,//容器间通信
"raw-logs": false,//原始日志(无颜色、全时间戳)
"allow-nondistributable-artifacts": [],//不对外分发的产品提交的registry仓库
"registry-mirrors": [],//registry仓库镜像
"seccomp-profile": "",//seccomp配置文件
"insecure-registries": [],//非https的registry地址
"no-new-privileges": false,//禁止新优先级(??)
"default-runtime": "runc",//OCI联盟(The Open Container Initiative)默认运行时环境
"oom-score-adjust": -500,//内存溢出被杀死的优先级(-1000~1000)
"node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],//对外公布的资源节点
"runtimes": {//运行时
"cc-runtime": {
"path": "/usr/bin/cc-runtime"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"–debug"]
}
}
}
服务端安装git:yum install git
拉取一下文件和命令:git clone http://172.16.1.35/gchat/gaga-dockers.git
指定分支克隆git clone -b dev-1 http://172.16.1.35/gchat/gaga-dockers.git
查看本地和远端版本:git branch -a
切换本地分支为dev:git checkout -b dev origin/dev
启动docker:service docker start
后 执行文件中的shell:./init.sh all (顺序:mysql,mongo,redis,solr,activemq,tomcat)
删除多下载的镜像:docker rmi --force 3068f6bb852e
容器列表: docker ps -a
进入某个容器:docker exec -it [CONTAINER ID] /bin/bash
查看某个容器进程:docker top [NAMES]
# 查看是否安装了tomcat: rpm -qa | grep tomcat
# 查找文件:find / -name tomcat
# 切换Tomcat目录:cd /usr/local/tomcat/bin
# 关闭Tomcat:./shutdown.sh
# 查看docker中的java版本:docker exec container_name java -version
git拉代码:git clone [email protected]:gchat/gaga-server.git
查看远端分支:git branch -r
创建本地dev分支 并切换到dev分支:git checkout -b dev origin/dev
查看本地分支:git branch
切换回眸分支:git checkout master
查看所有JDK在系统中位置:/usr/libexec/java_home -V
参考地址: https://www.runoob.com/docker/docker-command-manual.html
查找docker 安装包:yum list installed | grep docker
停掉docker:systemctl stop docker
删除对应文件:yum remove docker.x86_64 docker-client.x86_64 docker-common.x86_64 -y
查看下docker rpm源:rpm -qa | grep docker
删除对应路径:rm -rf /var/lib/docker
注释:
本次也是由于业务需要,需要重新搭建新的测试服务器,这也是搭建中的一个插曲,后续会使用 Jenkins 进行相关的持续集成,大家一起学习分享!~
‘陆’ 如何在linux上搭建安卓开发环境
微信是手机上的。linux是电脑桌面系统,微信设计的初衷就是为手机和平板服务的,linux版的微信,腾讯不会开发这样的程序,不符合它的初衷。微信有安卓版的。而安卓是基于linux的,是否可以间接地说这就是linux版本的呢?
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用搭巧户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性拆枝贺能稳定的多用户网络操作系统。
Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程旅派各种工具和数据库的操作系统。