本文包含我在日常使用Ubuntu系统中遇到的一些问题的记录, 没有什么特定的顺序和联系, 不定期更新.
SSH仅允许局域网密码登录
如果希望处于外网的用户只能使用秘钥登录, 而处于局域网的用户依然可以使用密码登录, 则可以进行如下的配置. 编辑/etc/ssh/sshd_config
文件, 添加如下的内容
1 | #禁用密码验证 |
- linux ssh使用秘钥登录并禁用密码登录
- Only allow password authentication to SSH server from internal network
- OpenSSH: How to end a match block
安装node
使用snap工具可以直接安装最新的长期支持版node, 指令为
1 | sudo snap install node --classic |
snap是Ubuntu公司提出的一种包管理系统, 可以安装大部分的开源软件和部分的非开源软件, 无法使用apt安装的软件都可以考虑使用snap安装
安装OneDrive客户端
对于Ubuntu系统,可以安装OneDrive客户端实现Ubuntu与Windows的文件同步。 安装过程执行如下的代码
1 | # 安装OneDrive客户端需要的依赖 |
安装完成后执行onedrive
开启程序进行第一次配置,此时会输出一个onedrive的登陆URL,通过该URL登陆即可对客户端授权登陆。
之后会自动开始同步操作,第一次同步操作结束后会自动退出。 一定要等待程序同步完所有文件后再开始后续的配置。
使用如下的指令配置开机自启动
1 | systemctl --user enable onedrive |
之后可以使用如下的指令查看运行日志
1 | journalctl --user-unit onedrive -f |
Ubuntu下如何挂载U盘
- 使用
sudo fdisk -l
命令查看U盘的位置1
2
3
4
5
6
7
8
9
10
11
12
13# 结果可能包含如下字段
$ sudo fdisk -l
Disk /dev/sda: 16.1 GB, 16106127360 bytes
2 heads, 63 sectors/track, 249660 cylinders, total 31457280 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x003996fb
Device Boot Start End Blocks Id System
/dev/sda1 * 64 31457279 15728608 c W95 FAT32 (LBA)
# 看到U盘的位置是/dev/sda1是一个FAT32格式 - 挂载U盘到指定节点
1
2
3
4
5# 挂载FAT32格式的U盘
$ sudo mount -t vfat /dev/sda1 /media/u
# 挂载NTFS格式的U盘
$ sudo mount -t ntfs-3g /dev/sda1 /media/u
# 其中/media/u 为你要挂载到的节点, 这个可以随便指定, 但是这个目录一定要存在 - 卸载u盘
1
2# 卸载之前挂载的U盘
$ sudo umount /media/u
ubuntu开机自动挂载新硬盘
操作需要Root权限
- 查看分区的UUID
1 | sudo blkid |
- 配置开机加载
打开/etc/fstab
, 按照如下格式写入配置
1 | UUID=66E85884E8585501 /home/lizec/share/C ntfs defaults 0 1 |
以上配置前三项分别是分区ID
, 挂载点
, 分区格式
. 其余的配置可以使用默认值.
- 验证配置
执行以下指令检查配置是否正确, 不正确的配置将导致系统无法正常启动
1 | sudo mount -a |
确认无误后重启系统即可使配置生效
注意: 如果以后挂载信息发生变动, 一定要删除相关的配置, 否则将因为挂载失败导致系统无法启动
清理软件安装缓存
使用apt安装软件后, 相应的安装包会缓存在/var/cache/apt/archives/
, 可以使用以下的指令查看这部分缓存占用的空间.
1 | sudo du -sh /var/cache/apt/archives/ |
如果已经占用较大的空间, 可以使用以下指令自动清理缓存:
1 | sudo apt clean |
APT更换国内镜像源
1 | cp -a /etc/apt/sources.list /etc/apt/sources.list.bak |
查看文件夹空间占用情况
直接使用以下指令查看文件夹内空间占用情况的概述
1 | du -ah --max-depth=1 |
查看当前目录总共占的容量, 而不单独列出各子项占用的容量
1 | du -sh |
查看当前目录下一级子文件和子目录占用的磁盘容量
1 | du -lh --max-depth=1 |
开机执行程序
- 在18.04中,可以在Tweak中直接设置开启启动程序
- 在20.04中, 搜索startup可以在设置中添加启动指令
- 非桌面版系统可以使用crontab设置开启执行的脚本
设置定时任务
使用crontab -e
打开文件, 并输入要执行的指令. 例如
1 | 0 3 * * * /root/Application/TimeMachine.sh daily |
注意: 全部位置都要使用绝对路径,并且手动执行一次脚本, 确认权限和路径没有问题
Crontab语法解析
在Crontab的文件中, 每一行表示一个要执行的指令, 每一行都具有如下的格式
1 | * * * * * /path/to/script.sh |
前面的5个*
的位置分别表示分钟, 小时, 天, 月, 和星期. 如果是数字就是具体的时刻, 如果是*
则表示所有, 例如
1 | 0 3 * * * ==> 每天3点0分执行一次 |
此外, Crontab还支持一些特殊的语法, 例如下面的指令表示每次系统重启后先休眠300秒, 然后写入当前的时间到指定文件之中.
1 | @reboot sleep 300 && date >> ~/date.txt |
注意: 确保脚本能正常结束, 否则应该加入
&
符号使脚本在后台执行
更多配置方式, 可以参考下面的文章
- Crontab in Linux with 20 Useful Examples to Schedule Jobs
- Crontab Reboot: How to Execute a Job Automatically at Boot
不执行原因排查
首先在根目录手动执行一次脚本, 确定脚本的权限和路径设置都是正确的. 如果脚本可以手动执行, 但配置就是不生效, 可以将脚本的输出重定向到日志文件, 例如
1 | * * * * * /root/Application/TimeMachine.sh daily >> /root/TM.log 2>&1 |
之后可以在日志中查看是否有报错.
双系统设置默认启动项
打开相关的配置文件
1
$ sudo gedit /etc/default/grub
修改相关选项
1
2
3
4
5
6
7
8# 节选其中的一段内容如下所示
GRUB_DEFAULT=0 # 此项表示默认选择项位置, 从0开始计数
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=2 # 此项表示默认选择时间, 单位为秒
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""更新
只有更新上述设置以后, 相关的修改才会生效1
$ sudo update-grub
添加搜索路径
通常系统会在用户的home目录下添加一个搜索路径, 以便于用户可以调用自己编写的程序, 如果没有, 可以按照如下方式添加
修改
.bashrc
- 此文件位于用户的home目录下, 可以使用顺手的编辑器打开
添加指令
- 例如将home目录下的bin目录添加到搜索路径中, 则添加如下语句
1
export PATH=~/bin:"$PATH"
- 例如将home目录下的bin目录添加到搜索路径中, 则添加如下语句
重启终端使配置生效
MySQL中文乱码
注意到在Ubuntu上的MySQL并非默认使用UTF8编码, 因此需要手动将默认编码修改为UTF8, 过程如下
修改/etc/mysql/my.cnf, 添加如下的内容:
1 | [client] |
然后重启数据库.
注意: 以前添加的表还是会乱码, 因此需要重新创建有关的表
查看已安装软件位置
1 | dpkg -L <软件名> |
创建桌面快捷方式
使用文件编辑器在桌面创建一个以.desktop
结尾的文件. 然后依据需要设置一下的内容
1 | [Desktop Entry] |
清除/dev/loop设备
这些设备来自snap系统, 可以使用如下的指令清理未使用的设备
1 | sudo apt-get purge snapd |
Ubuntu server扩展lvm空间
Linux系统目录结构
Ubuntu管理多版本软件
Ubuntu可以直接使用apt安装多个版本的Java, 多个版本的Java并不会直接产生冲突.
使用如下的指令, 可以切换java
指令的版本
1 | sudo update-alternatives --config java |
输入上述指令后, 会显示类似如下的内容
1 | There are 3 choices for the alternative java (providing /usr/bin/java). |
输入相应的编号就可以切换java的默认版本. 同理还可以切换javac
, javadoc
等命令的版本.
除了Java和Python等软件外,还可以自己添加管理项目, 可参考update-alternatives使用详解
curl指令
curl指令是Linux中经常使用的一个文件传输指令, 可以用来简单的模拟GET, POST等请求. 对于大部分Linux系统, 都内置了此指令. 在Windows系统中, 如果安装了git bash, 则git bash也内置了此指令.
curl指令具有如下的一些用法
用法示例 | 作用 |
---|---|
curl www.baidu.com | 直接发送请求并输出结果 |
curl -i www.baidu.com | 直接发送请求并且只返回头部的内容 |
curl URL -H “Content-Type:application/json” | 设置请求头后发送请求 |
curl URL -d “param1=value1¶m2=value2” | 发送POST请求 |
curl URL -F “file=XXX” -F “name=YYY” | 上传文件 |
注意: 如果URL或者参数中包含特殊字符, 则需要使用引号将内容包裹起来,否则shell会错误的解析指令的内容.
Chrome的postman插件也可以完成curl的功能, 如果能够安装此插件, 则可以完全图形化地完成上述的操作.
配置Samba服务
执行如下指令安装服务并设置共享路径和用户名密码
1 | sudo apt-get install samba samba-common |
配置/etc/samba/smb.conf
文件, 添加如下内容
1 | [share] |
如果使用VIM, 注意复制的时候开头的字母是否完整的复制. 此服务不检查配置文件语法结构是否正确
最后重启服务, 启用配置
1 | sudo service smbd restart |
如果客户端连接遇到问题, 可以参考如下的解决方案
配置代理服务
对于部分常用软件, 可以通过配置代理的方式加速
Ubuntu全局代理
在桌面版的Ubuntu系统中, 可以在网络选项下找到代理配置, 可以设置为手动配置.
此处的配置对于大部分软件而言都是全局生效的, 但对于apt等命令行工具无效.
Firefox对于Socks5的支持不太好, 有时候代理软件没问题, 但是Firefox就是用不了
APT
APT可配置临时使用一次代理, 指令为
1 | sudo apt-get -o Acquire::http::proxy="socks5h://127.0.0.1:1080/" update |
Git
1 | git config --global http.proxy 'socks5://127.0.0.1:1080' |
上述设置仅对使用HTTP方式访问的项目有效, 对于以SSH方式访问的项目, 可以对SSH添加代理配置, 编辑~/.ssh/config
文件, 输入以下内容
对于Linux, 使用如下的配置
1 | Host github.com |
对于windows, 使用如下的配置
1 | Host github.com |
之后可以使用ssh -T git@github.com
测试连接是否生效.
Docker
Docker的代理分为两类, 一类是docker指令在拉取镜像过程中使用的代理, 配置可以参考Configure the Docker client.
首先创建配置文件
1 | mkdir ~/.docker |
输入如下的配置
1 | { |
一类是容器运行过程中使用的代理, 可以参考HTTP/HTTPS proxy. 配置文件可以参考如下的内容:
1 | [Service] |
关于Docker镜像仓库的配置, 可以参考笔记Docker笔记之使用镜像
pip
pip可以临时指定使用的镜像, 例如
1 | pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package |
Openwrt路由器配置Hosts
编译线程有关程序
如果用到了pthread.h中的函数,在使用gcc编译的时候,需要加上-pthread
编译32位程序
安装如下的包
1 | sudo apt install build-essential module-assistant gcc-multilib g++-multilib |
之后可以使用-m32
指令进行编译, 例如
1 | gcc -m32 hello.c |
安装fish
安装并切换默认shel
1 | sudo apt install fish |
注意不要以root身份执行chsh, 否则该操作仅对root用户生效
fish提供自动补全功能, 使用→
接受整个补全结果, 使用Alt+→
接受补全结果中的一个单词. 使用Alt+s
在上一条指令前补充sudo指令.
使fish支持conda
在bash环境中执行
1 | conda init fish |
然后重新开shell即可实现conda环境的切换
添加环境变量
常规的对PATH变量的修改对fish无效, 如果需要添加新的路径到PATH变量中, 可以执行
echo “set PATH /home/lizec/.local/bin $PATH” >> ~/.config/fish/config.fish
服务器版开启X11支持
执行如下指令安装需要的模块
1 | sudo apt install xorg xauth openbox xserver-xorg-legacy |
之后可以输入xclock
测试配置是否正确
注意: 安装X11界面后, 同时会开启自动休眠策略, 为了避免服务器自动关机, 同时需要进行如下的设置
1 | sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target |
设置时区
1 | sudo timedatectl set-timezone Asia/Shanghai |
ubuntu桌面版优化
注意事项
- 不建议选择过于新的系统, 选择发布至少一年的版本比较稳妥.
- 直接使用迅雷下载镜像文件, 从网页下载到2GB时会卡住.
- 安装时语言选择中文, 从而确保安装了对应的输入法, 否则在英文操作系统上安装输入法将消耗大量时间.
- 不要安装第三方驱动, 尤其是显卡驱动. 否则容易出现版本不匹配导致无法启动图像界面.
- 不要选最小安装, 全部使用默认值即可, 附带的软件一般最后都会用上, 提前安装好可以节省后续的时间.
- 尽量使用命令行安装和卸载软件, 至少能看到错误信息. 不到最后, 不要使用图形界面安装.
- 不要强制卸载任何软件, 否则可能导致依赖关系破坏, 直接影响整个apt系统.
每个长期支持版都可以使用7年, 不必可以追求最新版. 而且由于最新版的系统中基础软件版本较高, 可能导致无法安装第三方软件. 例如fish对于Python最高版本有要求, 过高的Python版本将导致无法安装fish.
从图形界面安装程序虽然比较简单, 但如果出现错误无法查看错误信息, 如果界面卡住也无法得知具体的进度情况. 强制终止容易出现错误, 进而破坏整个安装系统.
安装搜狗输入法
注意: 安装系统时语言必须选择中文, 以免产生不必要的麻烦
搜狗输入法目前已经支持到Ubuntu20.04, 按照如下的教程安装即可. 更高版本的系统可能会安装失败.
ubuntu隐藏顶部标题栏
1 | sudo apt install gnome-shell-extension-autohidetopbar |
注销当前用户后, 重新登录并在搜索页面中打开Extension, 选择Hide Top Bar
即可
ubuntu隐藏wine状态栏
访问此链接安装指定的插件, 即可将独立窗口的Wine System Tray
移动到右上的状态栏之中.
由于该网站通过在网页上点击的方式安装系统插件, 因此需要先给浏览器安装一个通信插件才能正常使用该功能
ubuntu安装基于wine的软件
访问zq1997/deepin-wine, 按照教程添加第三方库后即可按照指令安装Windows平台的软件.
将CapsLK替换为Esc
搜索tweaks
打开配置页面, 选择Keyboard & Mouse
选项卡, 点击Additional Layout Options
, 再弹出的窗口中选择Caps Lock Behavior
选项, 并选择Make Caps Lock an additional Esc
其他键位相关的配置也可以在这里修改, 相比与前几年, ubuntu的配置简单了很多了
使用Mac键位
对于我的键盘, 在Mac布局下Cmd建的位置, 对应的是Win键, 因此只需要将Ctrl键覆盖Win键即可解决大部分最难受的快捷键. 配置方法与将CapsLK替换为Esc相同
从文件安装软件
和Windows平台一样,Ubuntu也可以从文件安装软件。Ubuntu平台默认的安装包格式是deb
格式,对于该格式的文件,可以直接双击打开安装页面。
对于其他Linux平台的安装包(例如rpm
格式),可以通过alien
命令转换为deb
格式, 例如
1 | sudo apt install alien |
之后会生成同名的deb
包,双击安装即可
不建议以这种方式安装软件, 容易导致依赖管理出现错误
查询头文件对应的依赖
使用源码编译时,可能因为缺少相关的依赖,导致编译出错。此时可以通过如下指令查询头文件对应的依赖包名称
1 | # 安装工具 |
执行上述命令会出现如下的搜索结果
1 | ivtools-dev: /usr/include/IV-X11/Xlib.h |
经过分析,安装libx11-dev
即可解决依赖问题
注意configure指令可能会根据依赖的情况设置编译变量,因此安装对应依赖后需要重新执行configure指令
配置X11转发
使用X11转发功能, 可以使得其他设备查看Ubuntu系统上的窗口, 进而实现可视化的操作. 虽然基于X11转发的性能不太行, 不如专门的远程桌面, 但相较于专门开启图形化界面进行操作, 这种和SSH紧密结合且仅传输一个窗口的模式对于开发还是非常的方便.
运行Chrome很卡, 但运行bochs绰绰有余
实现X11转发需要两个条件:
- 本地存在相应的软件, 能够渲染从服务器传输过来的数据
- 本地使用的SSH软件支持X11转发
针对第一点, 可以安装vcxsrv, 针对第二点, 不同的软件有不同的配置方法, 可以参考
其他参考资料:
EPUB阅读器
如果在阅读的同时还需要对大量电子书进行管理, 则直接安装Calibre
并可以配合Calibre-Web
使用.
如果单纯需要阅读EPUB格式的电子书, 则可以安装FBReader
, 该软件可以通过snap安装, 即
1 | snap install fbreader |
最后更新: 2024年03月28日 23:43
版权声明:本文为原创文章,转载请注明出处
原始链接: https://lizec.top/2017/08/10/Ubuntu%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/