躲不过去捏,还是得学。
# 序
为了在 Ubuntu 中为AMD显卡搭建ROCm平台,鼠鼠我不得不开始学 Linux 系统了捏。
# 文件目录结构
该小节资源来自: RUNOOB。
系统树状目录结构如下图所示:
以下是对这些目录的具体解释:
# 终端窗口与终端命令
放大与缩小终端窗口文本字体
放大: Ctrl Shift =
缩小: Ctrl –
终端命令格式: command [-options] [parameter] 。其中,command为命令名; [-options]为控制命令的可选选项; parameter为传递给命令的参数,可以是零个、一个或多个。
以删除文件夹的命令为例, rm -r 文件夹名 ,其中-r为[-options]; 文件夹名为[parameter]。
查阅命令帮助: command –help 或 man command 。其中,[]意味可选,有些命令parameter有[]而有些没有。
man command分屏操作如下表所述:
操作键 | 功能 |
---|---|
空格键 | 显示下一屏 |
Enter键 | 一次滚动一行 |
b | 回滚一屏 |
f | 前滚一屏 |
q | 退出 |
常用命令
命令 | 作用 |
---|---|
ls | 查看当前目录下的内容 |
pwd | 查看当前所在文件夹 |
cd 目录名 | 切换文件夹 |
touch 文件名 | 如果文件不存在,则新建文件 |
mkdir 目录名 | 创建目录 |
rm 文件名 | 删除指定名字的文件 |
clear | 清屏 |
按type键可以将命令、文件名、目录名补全。
ls 命令说明
该系统下,文件或目录名称最长可有256个字符。以 . 开头的文件为隐藏文件,需要使用 -a 才能显示。 -l 将文件详细信息以列表方式展示。 -h 需要配合-l以显示文件大小。
该命令返回的内容,白色意为文件,蓝色意为目录。
ls与通配符的联合使用:
# *代表任意长度的字符
ls 1* # 定位到以1开头的任意文件、目录
ls 1*1 # 定位到以1开头1结尾的任意文件、目录
# ?代表一个任意字符
ls 1?1 # 定位到以1开头以1结尾的任意3个字符的文件、目录
# []表示可以匹配字符串中任意一个
ls [123]hh # 定位到以hh结尾,且前一字符为1或2或3的文件、目录
ls [a-z]hh # 定位到以hh结尾,且前一字符为a到z的任意字符的文件、目录
结合 ls 查看文件夹内的所有文件个数
ls | wc -l
cd 命令说明
.代表当前目录,..代表上一级目录。所以 ./xxx.sh 指执行当前目录的xxx.sh。
返回上一级目录: cd .. ; 返回到当前用户的主目录: cd ~ ; 在最近两次工作目录中来回切换: cd – 。
相对路径与绝对路径
当路径最前面不是 / 或 ~ 时,表示相对当前目录的目录位置。如cd Desktop/, 指进入当前目录下的Desktop文件夹。
当路径最前面是 / 或 ~ 时,表示从根目录/家目录开始的具体的目录,如使用 ~ 代表当前用户的主目录,因此可以直接 cd ~/Documents/ 来进入主目录下的文档文件夹。
mkdir 命令说明
mkdir -p 能够递归创建目录。此外,系统中文件与目录不得重名。mkdir -p a/b/c/d # a目录里含b目录、b目录内含c目录...
rm 命令说明
使用rm命令删除文件并不等于将文件移至垃圾桶,删除文件后不可恢复。上文讲过,使用-r能够删除文件夹,因为-r意为递归删除目录下文件。此外,-f意为强制删除并忽略不存在的文件。
rm命令同样可以与通配符联用,详见此处。
rm -rf /* # 意为递归删除根目录下所用文件
拷贝和移动命令说明
tree 命令可以查看某目录的树状结构:tree ~ # 查看家目录下的树状结构目录
tree ~/Desktop/ # 查看家目录下Desktop文件夹内的树状结构
tree # 查看当前目录下的树状结构
tree -d # 只显示目录,不显示文件
cp 命令可以移动文件:
cp 源文件/-r 目录 目标目录
cp ~/Documents/test.txt ./test.txt # 终端当前位置在桌面
cp ~/Documents/test.txt . # 终端当前位置在桌面,且省略了文件名
cp ~/Documents/test.txt ~/Desktop/
使用-i能够覆盖同名文件前提示; 使用-r能够拷贝目录。
mv 命令可以移动或重命名文件或目录:# 移动文件或目录均不用使用-r
mv 源文件或目录 目标目录
# 重命名文件或目录
mv 源文件名或目录名 目标文件名或目录名
mv aaa ./bbb/ccc # 将当前目录下的aaa文件夹移动至bbb文件夹下并重命名为ccc
使用-i能够提示重命名文件/目录覆盖。
查看文件内容命令说明
cat 命令可以查看文件内容、创建文件、合并文件、追加文件内容等:会一次显示所有内容,适合查看内容较少的文本文件。
使用-b对非空输出行编号; 使用-n对所有输出行编号。
如果查看的文件内容较多,使用 more 分屏显示内容,按空格显示所有内容。更多操作参考man command的操作表格。
grep 命令对文本文件进行模式查找:# 在123.txt中查找as单词
grep as 123.txt
-n可以显示匹配行的行号; -v显示不包含匹配文本的所有行; -i忽略大小写。
常用的两种模式查找(正则表达式): ^a搜寻以a开头的行; a$搜寻以a结束的行。
其他
重定向 > 和 >> :
使用重定向将命令的执行结果输出到一个文件,>会覆盖原有内容,>>会将命令结果追加到已有文件末尾。
# 将树状结构输出到文件a(覆盖)
tree ~ > a
# 将树状结构追加到文件a(若不存在会新建文件a,若存在会追加到a末尾)
tree ~ >> a
echo 用于将文本字符串或变量的值输出到终端或重定向到文件:
# 新建文件a并在里面输入test
echo test > a
| 管道将一个命令的输出作为另一个命令的输入:
# 将家目录下的所有文件、文件夹分屏显示
ls -lha ~ | more
# 查询家目录内包含D的项目
ls -lha ~ | grep D
which 命令查看执行命令所在位置:
通过 PATH环境变量查找可执行文件。
which ls
which python
- 在该系统中,绝大多数可执行文件都保存在/bin、/sbin、/usr/bin、/usr/sbin
- /bin(binary)是二进制执行文件目录,主要用于具体应用
- /sbin(system binary)是系统管理员专用的二进制代码存放目录,主要用于系统管理
- /usr/bin(user commands for applications)后期安装的一些软件
- /usr/sbin(super user commands for applications)超级用户的一些管理程序
通过查询数据库查找可执行文件,然而该数据库并不会实时更新。
该命令可以在查找到二进制命令的同时,查找到帮助文档的位置; 而 which 在查找到二进制命令的同时,如果这个命令有别名,则还可以找到别名命令。
whereis ls
whereis python
远程管理命令
# 立刻关机
shutdown now
# 一分钟之后关机
shutdown
# 指定时间关机
shutdown 20:30
# 10分钟之后关机
shutdown +10
# 取消之前的关机计划
shutdown -c
-r是重新启动选项。 shutdown -r now 意为立刻重启。
ssh 命令能够远程控制其他机器:ssh -p 端口号 用户名@远程地址 # ssh -p 22 [email protected]
输入exit退出。
scp 能在两台机器之间传输文件:# 将本地文件传过去
scp -P 端口号 文件名 用户名@远程地址:文件名
# 将远程文件拉到本地
scp -P 端口号 用户名@远程地址:文件名 文件名
# 传文件夹需要加-r,以传目录到其他机器为例
scp -P 端口号 -r 目录 用户名@远程地址:目录
# 用户权限
对文件/目录的权限包括:
序号 | 权限 | 英文 | 缩写 | 数字代号 |
---|---|---|---|---|
01 | 读 | read | r | 4 |
02 | 写 | write | w | 2 |
03 | 执行 | excute | x | 1 |
把用户归为不同组,给组确定权限,以此赋予用户不同权限。使用ls -l命令以查看当前目录所有项目的详细信息:
总用量 44
drwxr-xr-x 2 user group 4096 7月 13 02:27 公共的
drwxr-xr-x 2 user group 4096 7月 13 13:30 模板
drwxr-xr-x 2 user group 4096 7月 13 02:27 视频
其中,开头的d意为目录; 第一组权限(三个字符, rwx)意为文件/目录拥有者(user)对其所有的权限; 第二组权限(三个字符, r-x)意为拥有者所在组(group)的权限; 第三组权限(三个字符, r-x)意为其他用户的权限。
chmod 命令以修改权限:chmod -R +或-rwx 文件名/目录
# 给test.txt关闭读写权限
chmod -rw test.txt
# 给test.txt增加读写权限
chmod +rw test.txt
chmod +r+w test.txt
# 给a目录增加读写权限
chmod -R +r+w a
若想精确到给拥有者|组|其他用户设置权限,可以设置以下选项:
# u - 给所有者设置执行权限
chmod u+x test.sh
# g - 给组设置执行权限
chmod g+x test.sh
# o - 给其他用户设置执行权限
chmod o+x test.sh
# a - 给所有用户设置执行权限
chmod a+x test.sh
然而该方法不够便捷,因此介绍用数字表示法来分别给拥有者|组|其他用户设置权限:
chmod -R 755 文件/目录名 # 数字详见权限表
chown 可以修改文件/目录拥有者:TIP: 使用 ./ 执行可执行文件。其中/指当前目录。
./abc.sh
chown 用户名 文件名/目录名
组管理终端命令
命令 | 作用 |
---|---|
groupadd 组名 | 添加组 |
groupdel 组名 | 删除组 |
cat /etc/group | 确认组信息 |
chgrp -R 组名 文件/目录名 | 递归修改文件/目录的所属组 |
创建用户/设置密码/删除用户
命令 | 作用 | 说明 |
---|---|---|
useradd -m -g 组名 用户名 | 添加新用户 | -m为自动建立家目录 -g指定用户所在组,否则会建立一个同用户名的组 |
passpwd 用户名 | 为用户设置密码 | |
userdel -r 用户名 | 删除用户 | -r会自动删除用户家目录 |
cat /etc/passwd | grep 用户名 | 确认用户信息 | 新建用户后,用户信息保存在这里 |
查看用户信息
命令 | 作用 |
---|---|
id 用户名 | 查看用户UID和GID(组ID) |
who | 查看当前所有登陆的用户列表 |
whoami | 查看当前登陆用户的用户名 |
主组通常在新建用户时指定,在/etc/passwd的第四列GID对应的组; 而附加组用于指定用户附加权限,如sudo权限。
# 修改主组
usermod -g 组 用户名
# 修改附加组
usermod -G 组 用户名 # 举例usermod -G sudo auser
# 修改用户登陆Shell
usermod -s /bin/bash
# 使用-a进行追加,而不是修改
usermod -a -G group1,group2,group3 usera
# 系统信息
关于时间与日期: 使用 date 查看时间; 使用 cal 显示日历。
关于磁盘信息: 使用 df -h disk free显示磁盘剩余空间; 使用 du -h 目录名 disk usage显示指定目录下的文件大小。-h指以人性化的方式展示。
进程信息
使用 ps process status查看进程的详细情况:
该命令带选项不需要–。
# 仅显示当前用户通过终端启动的应用程序
ps
# 显示终端上的所有进程,包括其他用户的进程
ps a
# 显示进程的详细状态
ps u
# 显示没有控制终端的进程(不是通过终端启动的进程)
ps x
使用 top 动态显示运行中的进程并按资源占用率排序:
top
# 按下q退出
使用 kill PID 终止指定代号的进程:
kill 1234
# 强制终止
kill -9 1234
打包压缩
在该系统中, tar 是最常用的备份工具,此命令可以把一系列大文件打包到一个大文件中,也可以把一个打包好的大文件恢复成一系列文件。这是打包命令,压缩命令在后面。
# 打包文件
tar -cvf 打包文件.tar 被打包的文件/路径
tar -cvf py.tar 01.py 02.py 03.py # 将01.py 02.py 03.py打包到py.tar文件中
# 解包文件
tar -xvf 打包文件.tar
-c: 生成档案文件,创建打包文件
-x: 解开档案文件
-v: 列出归档解档的详细过程,显示进度
-f: 指定档案文件名称,f后面一定是.tar文件,所以必须放最后
tar 与 gzip 命令结合使用可以实现打包和压缩:
- tar仅负责打包
- gzip压缩tar打包后的文件,其扩展名一般为 xxx.tar.gz
在选项中增加一个z便可实现gzip压缩。
# 压缩文件
tar -zcvf 打包文件.tar.gz 被压缩文建/路径
# 解压缩文件
tar -zxvf 打包文件.tar.gz
# 解压缩到指定路径
tar -zxvf 打包文件.tar.gz -C 目标路径
[OPTIONAL] tar 与 bzip2 命令结合使用可以实现打包和压缩:
与gzip不同的是,bzip2新增的选项是-j。
# 压缩文件
tar -jcvf 打包文件.tar.bz2 被压缩的文件/路径
# 解压缩文件
tar -jxvf 打包文件.tar.bz2
# 解压缩到指定路径
tar -jxvf 打包文件.tar.bz2 -C 目标路径
其他命令
使用 find 命令在特定目录下查找符合条件的文件:
# 一般格式
find 路径 -name "文件名"
# 找到当前路径所有py格式的文件
find . -name "*.py"
使用 ln 创建链接文件:
通俗来讲,创建软链接就像创建快捷方式。
# 加-s才是创建软链接,并且源文件要使用绝对路径
ln -s 被软链接的文件 链接文件
时间同步查看此处。
# 环境变量
使用以下方法查看环境变量:
env: 列出所有环境变量
export: 单独输入export可以列出所有环境变量
echo $PATH: 列出环境变量中PATH这个变量的值,这是一些路径,执行程序命令时会在这里面找。比如ls、python等命令
echo $USER: 返回环境变量中USER这个变量的值,值为用户名。
使用 export 命令全局新增环境变量,该命令只对该次终端有效:
# (全局)定义并赋值变量
(export) 变量名=值(asd=aaaaaa)
# 删除环境变量
unset 变量名(unset asd)
# 全局新增PATH环境变量的值
export PATH=$PATH:/path/you/want/
# 删除PATH环境变量的部分值
echo $PATH 然后手动去除不需要的路径然后export PATH=路径1:路径2:路径3...
更改~/.bashrc文件,该方法对登陆用户有效:
# 打开~/.bashrc文件
export PATH=$PATH:/path/you/want/ # 在最后新增
export 变量名=值
# 返回终端,输入以下命令使其立刻生效
source ~/.bashrc
更改/etc/profile文件,该方法对所有用户有效:
# 打开/etc/profile文件
export PATH=$PATH:/path/you/want/ # 在最后新增
export 变量名=值
# 返回终端,输入以下命令使其立刻生效
source /etc/profile
对于系统范围内的PATH变量的值,在 /etc/environment 文件内更改。
# 文本增删改查
文本增删改查对于终端系统而言非常有效,然而笔者因为学习机器学习而使用 Ubuntu ,安装的是桌面端。因此,笔者并不会着重记录这一部分的知识。
语法: sed 选项 sed内置命令字符 文件
选项:
选项 | 解释 |
---|---|
-n | 取消默认sed的输出,常与内置命令p一起使用 |
-i | 直接将修改结果写入文件。否则,sed修改的是内存文件 |
-e | 支持多次编辑,而不依赖管道符 |
-r | 支持正则表达式 |
内置命令符 | 解释 |
---|---|
a | append, 对文本追加,在指定行后面添加文本 |
d | delete, 删除匹配行 |
i | insert, 插入文本,在指定行前面添加文本 |
p | print, 打印匹配行内容,常与-n连用 |
s/正则表达式/替换内容/[flags] | 匹配正则内容,然后替换内容,默认只替换第一个 结尾可填g(global)代表全局匹配,也就是替换所有 结尾也可填123,也就是匹配第123次替换 其中/符号可以替换为@或# |
c | change, 改变指定行的内容 |
y | 转换,实现字符的转换,如把文中小写的abc转换成大写 |
范围 | 解释 |
---|---|
空地址 | 全文处理 |
单地址 | 指定某一行 |
/pattern/ | 被模式匹配到的每一行 |
范围区间 | 10,20是10到20行; 10,+5是10行向下5行;/pattern1/,/pattern2/是匹配多种条件 2,$是从第2行到最后一行 |
步长 | 1~2是1,3,5,7,9奇数行; 2~2是2,4,6,8偶数行 |
[!] | 取反 |
案例:
# 输出文件第2, 3行内容
sed -n '2,3p' 目标文件
# 删除含有game的行(若想修改源文件需要加上-i)
sed '/game/d' 目标文件 (-i)
# 删除第五行到结尾
sed '5,$d' 目标文件
# 将文中amd全替换成nvidia
sed 's/amd/nvidia/g' 目标文件
# 将文中amd全替换成nvidia,并同时替换our为ours
sed -e 's/amd/nvidia/g' -e 's/our/ours/g' 目标文件
# 在文件第二行追加内容,并写入到文件
sed -i '2a append something' 目标文件
# 给每一行增加一个内容---
sed 'a ---' 目标文件
# 输出ifconfig etho中的第二行
ifconfig etho | sed '2p'
# 将第二行和第四行替换为&&&
sed '2,4c &&&' 目标文件
# 找到有www的一行,然后把ee替换为EE
sed '/www/ s/ee/EE/' 目标文件
# 将文中的小写的abcde替换成大写
sed 'y/abcde/ABCDE/' 目标文件
# 软件安装与卸载
在 Ubuntu 中使用 apt Advanced Packaging Tool这一安装包管理工具来安装/卸载/更新软件包。
# 安装软件
sudo apt install 软件包
# 删除已安装的软件包(保留配置文件)
sudo apt remove 软件包
# 删除已安装包(不保留配置文件)
sudo apt purge 软件包
# 删除为了满足依赖而安装的,但现在不再需要的软件包(包括已安装包)。如软件包a,依赖软件包b,则执行该命令会同时删除软件包a,b
sudo apt autoremove
# APT的底层包是dpkg, 而dpkg 安装Package时, 会将 *.deb 放在/var/cache/apt/archives/中。该只会删除/var/cache/apt/archives/已经过期的deb
sudo apt autoclean
# 将/var/cache/apt/archives/的所有deb删掉
sudo apt clean
# 更新已安装的包
sudo apt upgrade
# 查找软件包
sudo apt search <keyword>
在系统中,可以在 软件和更新 中自行设置软件源。在Ubuntu软件选项卡中,可以将下载自选择为主服务器。
后缀名 | 安装包管理器 | 支持发行版 |
---|---|---|
.rpm | rpm/yum | 红帽系(如redhat、fedora、centos) |
.deb | dpkg/apt | debian系(如debian、ubuntu、银河麒麟) |
.pkg.tar.xz | pacman | arch系(如Arch Linux、manjaro) |
.sh | bash | 任意支持bash的发行版 |
以下安装实例以QQ for Linux举例。
对于 .deb 安装包而言:
# 安装
sudo dpkg -i linuxqq_1.0.1-b1-100_armhf.deb
sudo apt install ./amdgpu-install_5.6.50600-1_all.deb
# 卸载
sudo dpkg -r linuxqq
对于 .rmp 安装包而言:
# 安装 (ivh: install_verbose_hash)
sudo rpm -ivh linuxqq_1.0.1-b1-100_mips64el.rpm
# 卸载
sudo rpm -e linuxqq
对于 tar.gz/tar.xz 这种tarball免安装二进制包:
# 安装
解压
# 使用
进入安装目录的bin文件夹,运行该目录下与软件同名的可执行文件。如/pycharm/bin/pycharm.sh
# 卸载
删除解压出的文件夹
对于 .sh 这种脚本文件:
# 使用当前用户安装
bash xx.sh
# 使用root用户安装
sudo bash xx.sh
# 卸载
执行官方提供的卸载文件,或删除根目录然后检查系统环境变量等。
对于 .snap 这种snap package:
# 本地安装.snap包
sudo snap install ./xxx.snap --dangerous # 自动连接插头和插槽的意思是正在下载文件
使用 dpkg 卸载软件的一般范式:
# 检查该软件的名字,以chrome为例
dpkg -l | grep chrome
# 卸载
dpkg -r google-chrome-stable
# apt与apt-get
系统安装完成并更改完软件源后,使用 apt update 更新包的索引和列表,该命令并不会更新软件。
完成上一步后,再使用 apt upgrade 升级软件。
apt-get upgrade 命令不会更新内核。sudo apt update
sudo apt upgrade
# 一些提高工作效率的软件介绍
首先是用于后台挂载任务的 screen 虚拟终端软件。当执行的命令所需时间较长时,期间关闭终端将导致工作中断。创建并后台挂载 screen 虚拟终端是解决该问题的有效途径。
# 安装screen虚拟终端 sudo apt install screen # 创建虚拟终端 screen -S 虚拟终端名 # 查看已有虚拟终端 screen -ls # 从虚拟终端中退出,此举并不会kill该终端 ctrl+A+D # 返回虚拟终端 screen -r 虚拟终端名 # kill虚拟终端 进入虚拟终端后,输入exit并回车
至于网络:
在TUN模式下若发现无法正常使用浏览器,可以尝试关闭或指定浏览器的安全DNS以解决该问题。
# 安装\(\text{WIFI}\)适配器
查看网卡型号并下载与之对应的驱动文件,放在正确的位置。重启系统后,便可享受无线网络带来的便利。
在Windows系统的设备管理器中查看网卡型号
在任务栏上点击鼠标右键,进入设备管理器。在该页面,展开\(\text{网络适配器}\)选项卡,便可以看到具体的无线网卡型号。
下载对应的无线网卡驱动
如Intel的无线网卡驱动在这里下载。
安装驱动
无需\(\textit{apt install}\)等,需要做的仅仅是解压该压缩包,并把得到的文件移动到对应的位置。
# 解压
tar zxf iwlwifi-ty-59.601f3a66.0.tgz
移动得到的文件至\(\text{/lib/firmware}\)。需要注意的是,解压得到的可能是文件夹,需要移动其中的文件。
# 移动文件
sudo cp * /lib/firmware/
最后重启电脑,进入 WIFI 选项卡,滑动选项卡名称右侧的按钮以打开无线网络功能。