GNU/ Linux使用基础
这篇博客没有任何意图成为一个大而全的使用教程, 在这里只是记录一下这几天做个小项目所用到/ 回忆到的基础知识, 方便快速入门. 文中的注释为了解内容, 文末为一些好的学习资料链接.
[TOC]
作为普通用户, PC端常见的操作系统有: Windows, Mac OS, 及类Unix系统(GNU/Linux).
1. GNU/ Linux选用
- 作服务器| Fedora系列: CentOS, RedHat, Fedora
- 个人开发 | Debian系列: Ubuntu, Debian (树莓派-Raspbian)
- 喜欢折腾 | Arch Linux
- 搞嵌入式 | 自行裁剪Linux
嵌入式设备的OS(可能的学习顺序): 裸机开发 -> uCOS-II -> uClinux -> Linux内核 -> Roadmap
其它: RT-Thread, Free RTOS, VxWorks, Windows CE
2. 系统安装
这一节是一般教程直接略去的地方, 我这里简述.
2.1 系统安装方案
个人开发, 我选用的系统为Ubuntu. 现在一般有两种主流的版本, 18.04和16.04. Linux的版本号是有讲究的, 这里不赘述. 我使用的是Ubuntu 18.04作为我开发深度学习的环境, 而Ubuntu16.04作为我安装Synopsys EDA Tools的环境. 系统安装, 一般有三种方案:
新买一台电脑, 折腾
不现实.
但是可以有另外一个方案: 买一个树莓派, 配置Raspbian, 学习基本操作.
给自己电脑安装双系统
没问题, 但是最好有一定的电脑折腾经验, 否则操作不好可能会丢失原操作系统文件.
使用VMware一类的软件创建一个GNU/ Linux虚拟机使用
推荐.
- 其它方案: 云服务器, 新手不推荐.
2.2 系统安装参考
如果选用方案1:
- 自购PC: (因为是土豪玩家->)直接叫卖电脑的帮你装好/ 朋友圈50块大洋求助
- 树莓派: 参考视频进行树莓派的选购与系统安装, 或自行谷歌
如果选用方案2:
- 我的主力机是联想拯救者Y7000, 安装Windows和Ubuntu 18.04双系统的参考链接, 亲测可行
磁盘分配过程中, 如果碰到"Windows系统压缩卷时可压缩空间远小于实际剩余空间"情况参考.
我的电脑配置为: 8G + 8G DDR4, 100G + 375G Disk. 双系统主要是为了训练深度学习模型. 总共划分了100G给Ubuntu系统, 子项为:
/ 20G; // 主分区, 包含系统和软件, 尽量大 Swap 20G; /* 类似Windows虚拟内存, 物理内存为512Mb-2G时, swap设置为物理内存的2倍; 物理内存为2G-4G时, swap设置为物理内存的1.5倍; 物理内存在4G-8G时, swap设置等同物理内存; 物理内存更大时, 设立为0.75倍; */ boot 512M; // 启动分区, 包含操作系统内核和启动的程序, 200M - 1G /Home 59.5G; // 逻辑分区, 类似于Windows我的文档, 尽量大
如果选用方案3:
- 可以网上找相关教程自行下载VMware安装
- 我安装Synopsys EDA Tools的环境是Ubuntu 16.04, 使用的是虚拟机方案, 参考链接
3. 基本使用
GNU/ Linux在输入密码时是不会显示的, 输入时不要以为字没有打上去. 简单输完回车即可.
默认读者在系统安装步骤中已经完成了用户, 密码的设置, 并且成功进入了图形界面(这里指桌面).
GNU/ Linux系统提供两种交互方式:
GUI, 图形用户界面
系统向用户提供图形的界面, 用户可以通过鼠标点击和键盘输入完成操作.
CLI, 命令行界面
系统向用户提供用于操作的Shell, 用户通过输入命令完成操作.
GUI的操作方式与Windows和Mac OS几乎一致, 用于解决一些通用的任务(文档, 聊天, 视频, 游戏...). 而CLI操作才是GNU/ Linux系统的学习重点, 学习的话, 打开终端, 直面CLI即可.
这里又假设读者有一些简单的需求, 然后想使用CLI实现.
3.1 工作环境的概念
观察终端光标闪烁的那一行, 开头为Your_User_Name@Host_Name ~$
. 其中, ~
代表的是当前的工作环境. 为了理解这个工作环境, 我们可以进行一个简单的小实验.
首先我们知道有两个命令:
ls
代表list, 即列出当前工作环境下的所有文件cd
代表convert to, 即切换当前的工作环境
于是我们首先输入
cd Desktop
然后回车. 可以看到闪烁光标的那一行的~
已经变成了~/Desktop
, 说明我们已经来到了~
下的Desktop
里了.
这里这个Desktop
等价于我们的桌面. 然后我们输入
ls
然后回车. 可以看到, 什么都没有返回. 这是因为我们的桌面目前还什么东西都没有. 于是我们先最小化我们的终端程序, 然后在桌面鼠标右键, 新建一个文件夹, 取上一个自己的名字. 然后再打开终端程序, 再输入
ls
然后回车. 此时我们就可以看到它返回了我们桌面新建的文件的名字.
于是, 我们可以知道, 工作环境这个概念, 其中就是指, 我们当前处于那个文件夹内.
3.2 基本命令结构
终端里的输入的指令主要由三部分构成, 比如文件复制命令cp
:
cp -r Desktop/test Desktop/test2
这个命令中, cp
代表copy, 指的是一个应用程序,
-r
是对程序进行指定的参数, 这里用于指定文件夹内的文件,
后面的Desktop/test
与Desktop/test2
可以看作是应用程序的操作对象.
这个语句代表的意思是, 将桌面的test
内的所有文件夹复制到桌面test2
文件夹里.
这个可以自己先在桌面创建两个文件夹自己测试一下.
Anyway, 基本的命令结构为:
应用程序 -程序参数 一个或者多个操作对象
于是, 接下来的学习, 就可以是, 学习更多的命令, 认识它们的参数, 成为Linux达人, 但是这样终究是无聊的, 因为没有任务驱动.
所以, 我们下一步应该做的, 其实是给自己找个什么东西折腾一下,
- 比如尝试一下用Linux下的C/C++工具链(GCC, G++, GDB);
- 又比如配置个深度学习环境玩玩(Anaconda+Python+OpenCV+Pytorch+TensorFlow-GPU);
- 比如搭建一个简单的基于LAMP(Linux, Apache, MySQL, PHP)的个人小网站, ...
折腾的时候, 基本上做的就是, 找个看起来靠谱的教程, 然后一行一行地跟着敲键盘.
可能很多命令都不知道怎么回事, 但是这个敲的过程, 首先就能纠正很多习惯性的Typo...
4. 稍微系统一点学习GNU/ Linux的使用
之前的折腾都是跟着别人的教程一直敲, 多上手练习手感, 也强迫自己去查一些基本的指令. 反正整多几次后, 常见的比如说ls
, mv
, cd
, rm
, mkdir
, nano
, su
...这些应该都差不多有的印象了, 即收到某个简单的任务, 能够自己独立查找相关的帖子解决了.
而继续学习它的使用, 动机可能在于, 任务变得复杂了; 或者自己的需求比较特别, 网上没有现成的; 再或者, 开始踏入某个具体的领域, 那个领域里的人的分享, 都是默认你会使用GNU/ Linux的.
这个时候, 推荐的书籍为: 鸟哥的Linux私房菜. (建议买当下最新版本)
推荐的网络学习资料为: Linux 不入门到入门
这个阶段学习的时候, 如果出现看不懂的情况, 那是十分正常的, 原因在于, 这时候才是真正地开始学习一个操作系统. (之前使用Windows和Mac OS时都是使用的别人建立在操作系统上的应用系统 !)
如果真的对这块产生兴趣了, 可以自行翻阅 深入理解计算机系统 书籍, 进行计算机基础的扫盲.
再专业一点, 可以走这条路: 计算机组成原理 -> 操作系统原理 -> 计算机网络 -> (并行)计算机体系结构
GNU/ Linux的命令查询网址可以为: 查询
这个阶段学习重点可以是: 文件系统, 文本编辑器, 权限管理, Git+GitHub, 还可以再去了解几个远程访问工具.
5. 脚本语言
可以说, 学习完4中的基础后, 读者已经可以熟练地使用GNU/ Linux进行日常的工作了, 但是这并没有体现出使用CLI的优势. 此时应该再学习一种叫做脚本语言的东西, 它的主要作用在于, 能够快速地帮助用户快速地完成一系列繁琐的操作. 说到脚本语言, 最流行的, 一定非Python莫属. 主要的脚本语言有:
- Python
- Csh
- Bash
- Makefile
- Perl
- TCL
对于普通用户, 学完Python和Csh足够. 而做运维或者嵌入式前端可能得多学个Bash和Makefile. 然后做数字IC设计的话, 可能得学完.
6. 深入
到这一小节, 就不属于这篇博客题目"GNU/ Linux使用基础"所能够涵盖的范围了.
说到底, GNU/ Linux也只是一个操作系统而已, 所以我们可以从这些方面考虑:
向下看: GNU/ Linux的移植与驱动开发
对于嵌入式软件工程师, 一部分工作是, 基于操作系统进行应用的开发; 而另一部分的工作是, 对GNU/ Linux这个系统的内核进行裁剪和移植, 或者是为某种设备开发驱动. 前者需要对开发平台的软硬件都具备相当高的理解, 后者更是需要, 深刻地理解Linux内核的源码, 以及对操作系统所基于的硬件系统的熟悉.
向上看: 网络应用, 服务器与运行维护
如果我们不是嵌入式场景, 而换成大规模服务器集群的场景, 即成为了互联网公司的运维工程师, 则此时我们需要考虑的事情是, 怎么搭建一个更好的网络通信与开发平台, 供我们的后端/ 前端同学大展身手. 这种场景一方面需要对服务器架构十分熟练, 也需要很扎实的网络基础.
当然, Linux内核的源码也是美极, 可以学习别人的写代码的方式.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。