本文包含我在日常使用Ubuntu系统中遇到的一些问题的记录, 没有什么特定的顺序和联系, 不定期更新.

SSH仅允许局域网密码登录

如果希望处于外网的用户只能使用秘钥登录, 而处于局域网的用户依然可以使用密码登录, 则可以进行如下的配置. 编辑/etc/ssh/sshd_config文件, 添加如下的内容

1
2
3
4
5
6
7
8
9
10
#禁用密码验证
PasswordAuthentication no
#启用密钥验证
RSAAuthentication yes
PubkeyAuthentication yes

# 局域网IP允许密码验证
Match Address 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
PasswordAuthentication yes
Match all

安装node

使用snap工具可以直接安装最新的长期支持版node, 指令为

1
sudo snap install node --classic

snap是Ubuntu公司提出的一种包管理系统, 可以安装大部分的开源软件和部分的非开源软件, 无法使用apt安装的软件都可以考虑使用snap安装

安装OneDrive客户端

对于Ubuntu系统,可以安装OneDrive客户端实现Ubuntu与Windows的文件同步。 安装过程执行如下的代码

1
2
3
4
5
6
7
8
9
10
11
# 安装OneDrive客户端需要的依赖
sudo apt install libcurl4-openssl-dev
sudo apt install libsqlite3-dev
sudo snap install --classic dmd

# 编译OneDrive客户端
cd ~/Application
git clone https://github.com/skilion/onedrive.git
cd onedrive
make
sudo make install

安装完成后执行onedrive开启程序进行第一次配置,此时会输出一个onedrive的登陆URL,通过该URL登陆即可对客户端授权登陆。

之后会自动开始同步操作,第一次同步操作结束后会自动退出。 一定要等待程序同步完所有文件后再开始后续的配置


使用如下的指令配置开机自启动

1
2
systemctl --user enable onedrive
systemctl --user start onedrive

之后可以使用如下的指令查看运行日志

1
journalctl --user-unit onedrive -f

Ubuntu下如何挂载U盘

  1. 使用 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格式
  2. 挂载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 为你要挂载到的节点, 这个可以随便指定, 但是这个目录一定要存在
  3. 卸载u盘
    1
    2
    # 卸载之前挂载的U盘
    $ sudo umount /media/u

ubuntu开机自动挂载新硬盘

操作需要Root权限

  1. 查看分区的UUID
1
sudo blkid
  1. 配置开机加载

打开/etc/fstab, 按照如下格式写入配置

1
2
3
UUID=66E85884E8585501   /home/lizec/share/C ntfs defaults 0 1
UUID=58682F90682F6BC6 /home/lizec/share/D ntfs defaults 0 1
UUID=5C683BEF683BC714 /home/lizec/share/E ntfs defaults 0 1

以上配置前三项分别是分区ID, 挂载点, 分区格式. 其余的配置可以使用默认值.

  1. 验证配置

执行以下指令检查配置是否正确, 不正确的配置将导致系统无法正常启动

1
sudo mount -a

确认无误后重启系统即可使配置生效

注意: 如果以后挂载信息发生变动, 一定要删除相关的配置, 否则将因为挂载失败导致系统无法启动

清理软件安装缓存

使用apt安装软件后, 相应的安装包会缓存在/var/cache/apt/archives/, 可以使用以下的指令查看这部分缓存占用的空间.

1
sudo du -sh /var/cache/apt/archives/

如果已经占用较大的空间, 可以使用以下指令自动清理缓存:

1
sudo apt clean

APT更换国内镜像源

1
2
3
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak 
wget -O /etc/apt/sources.list http://mirrors.cloud.tencent.com/repo/ubuntu20_sources.list
apt-get clean all && apt-get update

查看文件夹空间占用情况

直接使用以下指令查看文件夹内空间占用情况的概述

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
2
0 3 * * *  ==> 每天3点0分执行一次
* 3 * * * ==> 每天3点0分到3点59分的时间段内, 每分钟执行一次

此外, Crontab还支持一些特殊的语法, 例如下面的指令表示每次系统重启后先休眠300秒, 然后写入当前的时间到指定文件之中.

1
@reboot sleep 300 && date >> ~/date.txt

注意: 确保脚本能正常结束, 否则应该加入&符号使脚本在后台执行

更多配置方式, 可以参考下面的文章

不执行原因排查

首先在根目录手动执行一次脚本, 确定脚本的权限和路径设置都是正确的. 如果脚本可以手动执行, 但配置就是不生效, 可以将脚本的输出重定向到日志文件, 例如

1
* * * * * /root/Application/TimeMachine.sh daily >> /root/TM.log 2>&1

之后可以在日志中查看是否有报错.

双系统设置默认启动项

  1. 打开相关的配置文件

    1
    $ sudo gedit /etc/default/grub
  2. 修改相关选项

    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=""
  3. 更新
    只有更新上述设置以后, 相关的修改才会生效

    1
    $ sudo update-grub

添加搜索路径

通常系统会在用户的home目录下添加一个搜索路径, 以便于用户可以调用自己编写的程序, 如果没有, 可以按照如下方式添加

  1. 修改.bashrc

    • 此文件位于用户的home目录下, 可以使用顺手的编辑器打开
  2. 添加指令

    • 例如将home目录下的bin目录添加到搜索路径中, 则添加如下语句
      1
      export PATH=~/bin:"$PATH"
  3. 重启终端使配置生效

MySQL中文乱码

注意到在Ubuntu上的MySQL并非默认使用UTF8编码, 因此需要手动将默认编码修改为UTF8, 过程如下

修改/etc/mysql/my.cnf, 添加如下的内容:

1
2
3
4
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8

然后重启数据库.

注意: 以前添加的表还是会乱码, 因此需要重新创建有关的表

查看已安装软件位置

1
dpkg -L <软件名>

创建桌面快捷方式

使用文件编辑器在桌面创建一个以.desktop结尾的文件. 然后依据需要设置一下的内容

1
2
3
4
5
6
7
8
9
10
11
[Desktop Entry]
Encoding=UTF-8
Version=1.0 #version of an app.
Name[en_US]=yEd #name of an app.
GenericName=GUI Port Scanner #longer name of an app.
Exec=java -jar /opt/yed-3.11.1/yed.jar #command used to launch an app.
Terminal=false #whether an app requires to be run in a terminal
Icon[en_US]=/opt/yed-3.11.1/icons/yicon32.png #location of icon file.
Type=Application #type
Categories=Application;Network;Security; #categories in which this app should be listed.
Comment[en_US]=yEd Graph Editor #comment which appears as a tooltip.

清除/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
2
3
4
5
6
7
8
There are 3 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 auto mode
1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 manual mode
2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode
3 /usr/lib/jvm/java-8-oracle/jre/bin/java 1081 manual mode

输入相应的编号就可以切换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&param2=value2” 发送POST请求
curl URL -F “file=XXX” -F “name=YYY” 上传文件

注意: 如果URL或者参数中包含特殊字符, 则需要使用引号将内容包裹起来,否则shell会错误的解析指令的内容.

Chrome的postman插件也可以完成curl的功能, 如果能够安装此插件, 则可以完全图形化地完成上述的操作.

配置Samba服务

执行如下指令安装服务并设置共享路径和用户名密码

1
2
3
4
sudo apt-get install samba samba-common
sudo mkdir /home/lizec/share
sudo chmod 777 /home/lizec/share
sudo smbpasswd -a lizec

配置/etc/samba/smb.conf文件, 添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
[share]
comment = share folder
browseable = yes
path = /home/lizec/share
create mask = 0700
directory mask = 0700
valid users = lizec
force user = lizec
force group = lizec
public = yes
available = yes
writable = yes

如果使用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
2
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

上述设置仅对使用HTTP方式访问的项目有效, 对于以SSH方式访问的项目, 可以对SSH添加代理配置, 编辑~/.ssh/config文件, 输入以下内容

对于Linux, 使用如下的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Host github.com
User git
Port 22
Hostname github.com
ProxyCommand nc -v -x 127.0.0.1:1080 %h %p
IdentityFile "~/.ssh/id_rsa"
TCPKeepAlive yes

Host ssh.github.com
User git
Port 443
Hostname ssh.github.com
ProxyCommand nc -v -x 127.0.0.1:1080 %h %p
IdentityFile "~/.ssh/id_rsa"
TCPKeepAlive yes

对于windows, 使用如下的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Host github.com
User git
Port 22
Hostname github.com
ProxyCommand connect -S 127.0.0.1:1080 -a none %h %p
IdentityFile "~/.ssh/id_rsa"
TCPKeepAlive yes

Host ssh.github.com
User git
Port 443
Hostname ssh.github.com
ProxyCommand connect -S 127.0.0.1:1080 -a none %h %p
IdentityFile "~/.ssh/id_rsa"
TCPKeepAlive yes

之后可以使用ssh -T git@github.com测试连接是否生效.

Docker

Docker的代理分为两类, 一类是docker指令在拉取镜像过程中使用的代理, 配置可以参考Configure the Docker client.

首先创建配置文件

1
2
mkdir ~/.docker
vim ~/.docker/config.json

输入如下的配置

1
2
3
4
5
6
7
8
9
10
11
{
"proxies":
{
"default":
{
"httpProxy": "socks5://127.0.0.1:1080",
"httpsProxy": "socks5://127.0.0.1:1080",
"noProxy": ""
}
}
}

一类是容器运行过程中使用的代理, 可以参考HTTP/HTTPS proxy. 配置文件可以参考如下的内容:

1
2
3
[Service]
Environment="HTTP_PROXY=socks5://127.0.0.1:1080"
Environment="HTTPS_PROXY=socks5://127.0.0.1:1080"

关于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
2
sudo apt install fish
chsh -s /usr/bin/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桌面版优化

注意事项

  1. 不建议选择过于新的系统, 选择发布至少一年的版本比较稳妥.
  2. 直接使用迅雷下载镜像文件, 从网页下载到2GB时会卡住.
  3. 安装时语言选择中文, 从而确保安装了对应的输入法, 否则在英文操作系统上安装输入法将消耗大量时间.
  4. 不要安装第三方驱动, 尤其是显卡驱动. 否则容易出现版本不匹配导致无法启动图像界面.
  5. 不要选最小安装, 全部使用默认值即可, 附带的软件一般最后都会用上, 提前安装好可以节省后续的时间.
  6. 尽量使用命令行安装和卸载软件, 至少能看到错误信息. 不到最后, 不要使用图形界面安装.
  7. 不要强制卸载任何软件, 否则可能导致依赖关系破坏, 直接影响整个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
2
sudo apt install alien
sudo alien --scripts *.rpm

之后会生成同名的deb包,双击安装即可

不建议以这种方式安装软件, 容易导致依赖管理出现错误

查询头文件对应的依赖

使用源码编译时,可能因为缺少相关的依赖,导致编译出错。此时可以通过如下指令查询头文件对应的依赖包名称

1
2
3
4
5
6
# 安装工具
sudo apt install apt-file
sudo apt-file update

# 查询头文件 X11/Xlib.h 对应的依赖包
apt-file search X11/Xlib.h

执行上述命令会出现如下的搜索结果

1
2
3
4
5
6
7
ivtools-dev: /usr/include/IV-X11/Xlib.h   
libghc-x11-dev: /usr/lib/haskell-packages/ghc/lib/x86_64-linux-ghc-8.6.5/X11-1.9-Fmq4QbYpsd5OMgvJkPFaT/Graphics/X11/Xlib.hi
libhugs-x11-bundled: /usr/lib/hugs/packages/X11/Graphics/X11/Xlib.hs
libnx-x11-dev: /usr/include/x86_64-linux-gnu/nx-X11/Xlib.h
libx11-dev: /usr/include/X11/Xlib.h
python-pycparser: /usr/share/python-pycparser/fake_libc_include/X11/Xlib.h
python3-pycparser: /usr/share/python3-pycparser/fake_libc_include/X11/Xlib.h

经过分析,安装libx11-dev即可解决依赖问题

注意configure指令可能会根据依赖的情况设置编译变量,因此安装对应依赖后需要重新执行configure指令

配置X11转发

使用X11转发功能, 可以使得其他设备查看Ubuntu系统上的窗口, 进而实现可视化的操作. 虽然基于X11转发的性能不太行, 不如专门的远程桌面, 但相较于专门开启图形化界面进行操作, 这种和SSH紧密结合且仅传输一个窗口的模式对于开发还是非常的方便.

运行Chrome很卡, 但运行bochs绰绰有余

实现X11转发需要两个条件:

  1. 本地存在相应的软件, 能够渲染从服务器传输过来的数据
  2. 本地使用的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/