Ubuntu 安装
安装
下载 ISO 可至 下载 Ubuntu | Ubuntu 正体中文站 ,安装时不要更新,按下列安装:
Continue without updating
- 
Install OpenSSH server 
 如果要安装就打勾吧
最后会出现 Cancel update and reboot (奇怪!不是已经选了 Continue without updating)。按下 Cancel update and reboot 后时间没有比较快,那就等它吧。
安装系统后,先以 IP 登录主机,建议采用 Windows-Terminal 来连接 linux 主机。安装 Terminal 后采用 ssh 终端机进入系统来配置。
- 安装 ssh,让其他计算机采用 ssh 登录方便输入
- 
安装 ssh (Install OpenSSH server 没打勾): sudo apt install ssh -y Ubuntu 18/20 查看一下 IP: ip -c a 如位置如下 inet 192.168.1.20/24 brd 172.31.168.254 scope global dynamic ens32 由终端机以 IP 位置登录: ssh user@192.168.1.20 (1)1 user为安装 Ubuntu 时,输入的帐号。
- root 的缺省密码是什么?怎么无法登录?
- 
因为 root 未设置密码,必须设置密码才行 - 可是要怎么设置?
- 
采用 sudo 设置 root 密码sudo passwd root (1)1 运行时要注意如果 sudo 需要密码,那么第一次输入的密码是 sudo 的密码 (输入目前登录帐户的密码), 第二、三次的密码才是 root 帐户的密码。 
 
- sudo 免密码,运行 sudo 第一次都要输入密码实在麻烦
- 
使用 sudo要设置/etc/sudoers,但建议不要直接编辑该文件。编辑 sudoers 运行下列sudo visudo (1) (2) 1 如果运行出错改用下列 取得 root「超级用户 (superuser)」权限: su 以 root 帐户运行: visudo 2 visudo会采用常用的编辑器 (如nano),离开编辑器时;若内容有错误,它会提示:>>> /etc/sudoers: syntax error near line 26 <<< What now? Options are: (e)dit sudoers file again e(x)it without saving changes to sudoers file (Q)uit and save changes to sudoers file (DANGER!) 在文件后面加入免密码的帐户 (个别帐户设置)user ALL=NOPASSWD: ALL(1) 1 本例的帐户为 user。或者修改 sudo 群组为免密码修改 # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL 变成 # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) NOPASSWD:ALL
 当帐户没有 sudo 权限时错误消息为: 
 <username> is not in the sudoers file. This incident will be reported.帐户必须在sudoers文件设置的权限内才能运行sudo指令。- 
个别帐户设置 
- 
sudo 群组设置 
 上述无 sudo 权限的消息,并非表示「帐户」一定要以个别帐户加入 sudoers之中,将「帐户」加入至 sudo 群组也能运行sudo指令。列出 sudo 的成员: grep sudo /etc/group sudo:x:27:user (1) 1 在安装 Ubuntu 时输入 (新) 的帐户会缺省为 sudo 群组的成员。 sudo 群组的相关指令将帐户 ubuntu 加入至 sudo 群组: sudo gpasswd -a ubuntu sudo 将帐户 ubuntu 移出 sudo 群组: sudo gpasswd -d ubuntu sudo 帐户改变 sudo 群组,需要重新登录才会生效。 
 在sudoers文件中有一条规则root ALL=(ALL:ALL) ALL 表示 root 帐户能运行 sudo也能切换至任何帐户或群组。- 
root ALL=(ALL:ALL) ALL第 1 个字段,指明帐户 (或群组)。
- 
root ALL=(ALL:ALL) ALL第 1 个 ALL,规范「任何主机」能运行。
- 
root ALL=(ALL:ALL) ALL第 2 个 ALL,帐户可以切换至哪个 (which) 帐户,ALL 表示「所有帐户」。
- 
root ALL=(ALL:ALL) ALL第 3 个 ALL,帐户可以切换至哪个 (which) 群组,ALL 表示「所有群组」。
- 
root ALL=(ALL:ALL) ALL第 4 个 ALL,帐户可运行哪些命令,ALL 表示「所有命令」,NOPASSWD:ALL表示运行任何命令都不需要密码。
 语法为:用户 可由哪个主机运行=(可成为哪个帐户:可成为哪个群组) [NOPASSWD:] 可运行哪些命令 sudo 可切换帐户或群组来运行命令sudo --help -u, --user=user 以指定的帐户或 ID 运行命令(或编辑文件) -g, --group=group 以指定的群组或 ID 运行命令 sudo在没有指定参数时,是切换至root的帐户来运行,用户只要有 sudo 的权限即可运行命令。- ubuntu ALL= ALL
- 
ubuntu 运行 sudo 只能以 root 身份运行命令,sudo 以其他身份运行,则 (一定) 会询问密码,在运行时会出现下列错误: Sorry, user ubuntu is not allowed to execute 
- ubuntu ALL=(ALL) ALL
- 
ubuntu 能以 user 帐户身份 ( sudo -u user) 来运行,运行群组的身份也是 user。由于没有「成为哪个群组」的权限,运行sudo -g user将会出错。
- ubuntu ALL=(ALL:ALL) ALL
- 
ubuntu 可以用任何身份来运行命令。 
 以 ubuntu 来测试 sudo 的权限时,除了 ubuntu 没有在sudo的群组之外,也要在注意在虚拟机/etc/sudoers.d目录中的文件 (如90-cloud-init-users) 会缺省ubuntu帐户的 sudo 权限。ubuntu ALL=(ALL) NOPASSWD:ALL 
- 
- 刚安装可采用 dist-upgrade 更新
- 
sudo apt update && sudo apt dist-upgrade -y 运行后下列应该无列表: sudo apt list --upgradable
- 检查时区是否正确
显示日期的 RFC 格式: date -R Mon, 21 Sep 2020 06:33:38 +0000 设置时区: sudo timedatectl set-timezone Asia/Taipei 如果运行错误,采用下列: sudo dpkg-reconfigure tzdata 选择 Asia - Taipei。 如果没有该命令安装 tzdata sudo apt install tzdata -y 显示日期的 RFC 格式: date -R Mon, 21 Sep 2020 14:35:32 +0800 (1)
| 1 | +0800 则正确。 | 
- 配置 .bashrc
- 
先看一下要改什么echo $LANG C.UTF-8 或 en_US.UTF-8 echo $TIME_STYLE 空值修改~/.bashrc文件force_color_prompt=yes (1) export TIME_STYLE=long-iso (2) export LANG='en_US.UTF-8' (3)1 调整 root 终端机提示字符颜色,找出 #force_color_prompt=yes将注解(#)取消,跟顺序有关位置要正确。
 其他帐户也被注解掉了不过却有提示色。2 加入本行,设置 ls 显示文件的时间格式。 3 默认值如果是 C.UTF-8 (或 en_US.UTF-8) 则不需加入,如 echo $LANG为空值,则需加入。套用 ~/.bashrcsource ~/.bashrc echo $TIME_STYLE echo $LANG
- 不提示主要版本更新 (LXC 请忽略本步骤)
- 
sudo nano /etc/update-manager/release-upgrades将/etc/update-manager/release-upgrades的 Prompt 设为 never# Prompt=lts Prompt=never
- 修改 syslog 日期格式
- 
sudo nano /etc/rsyslog.conf注消原始格式$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat (1)1 前面加上 # 即可。 加入下列格式# 注消原始格式 # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # 加入下列格式 $template CustomFormat,"%$NOW% %TIMESTAMP:8:15% %hostname% %syslogtag% %msg%\n" $ActionFileDefaultTemplate CustomFormatUbuntu 16 rsyslog 有 bug 实际的记录有下列的错误rsyslogd-3003: invalid or yet-unknown config file command 'KLogPermitNonKernelFacility' - have you forgotten to load a module? ... KLogPermitNonKernelFacility 是 bug,参阅: command KLogPermitNonKernelFacility is currently not permitted 修正 /etc/rsyslog.conf# Ubuntu 16 将下列注消 $KLogPermitNonKernelFacilityrsyslog 另一个 bug 是 xconsole 并未在系统之中。rsyslogd-2039: Could not open output pipe '/dev/xconsole':: No such file or directory ... 修正 Ubuntu 16 xconsolesudo mknod -m 640 /dev/xconsole c 1 3 sudo chown syslog:adm /dev/xconsole确定一下修改日期格式的记录情况。sudo tail /var/log/syslog sudo service rsyslog restart sudo tail /var/log/syslog
- VMWare 采用自动安装修正
- 
更新出错 The repository 'cdrom://Ubuntu-Server … does not have a Release file。 sudo nano /etc/apt/sources.list将deb cdrom开头的设置注解掉或删除 ( Ctrl+K )。deb cdrom:[Ubuntu-Server ...
- 再来呢?
- 
配置 samba 方便 Windows 能以 Linux hostname 登录, 安装 wins 让 Linux 能 ping Windows hostname 
帐户及文件权限
帐户
- 添加用户
- 
无参数会创建用户的家 (home) 目录,home 目录用于保存该帐户的信息,如 登录的参数(.bashrc)、公开密钥 (.ssh):sudo adduser ubuntu不创建 home 目录,如该用户不会登录系统,如 www-data 用户或者 samba 帐户,则可不创建:sudo adduser user1 --no-create-home
- 改变密码
- 
改变帐户本身的的密码passwd改变 root 的密码sudo passwd root
- 删除帐户
- 
无参数,仅删除帐号并保留所有文件。sudo userdel ubuntu (1)使用-r选项,用户 home 目录及系统内的相关的文件一并移除。sudo userdel -r ubuntu
- 查看 Linux 帐户
- 
查看所有用户cat /etc/passwd列出 www-data 帐户,在安装系统后已经存在。grep www-data /etc/passwd列出帐户名cut -d: -f1 /etc/passwd
- 其他
- 
whoami 查看自己的用户名whoami查看单个用户信息,可得 id 及该帐户属于那些群组id root查看登录成功的用户记录last查看登录不成功的用户记录sudo lastb
- ubuntu 16 sudo 可能出现 /etc/sudoers.d is world writable 是权限不正确对造成的
- 
正确应如下列$ls -l /etc/sudoers /etc/sudoers.d /etc/sudoers.d/README -ld -r--r----- 1 root root 807 2020-11-21 16:37 /etc/sudoers drwxr-xr-x 2 root root 4096 2023-01-30 13:20 /etc/sudoers.d -r--r----- 1 root root 958 2019-10-09 13:55 /etc/sudoers.d/README 修正错误sudo chmod 440 /etc/sudoers sudo chmod 775 /etc/sudoers.d sudo chmod 440 /etc/sudoers.d/README
群组
gpasswd -a user groupgpasswd -d user groupgrep ubuntu /etc/group (1)| 1 | /etc/group内容格式为group_name:passwd:GID:user_list,第一字段:群组名称,第二字段:群组密码,第三字段:GID,第四字段:用户列表,每个用户之间用,逗号分割;
本字段为空时表示为用户本身的群组。 | 
文件权限
- chown 改变文件拥有者 (ownership)
- 
chown [-R] 帐号名称[:群组名称] 文件或目录 
 -R : 进行递归 (recursive) 即次目录下的所有文件都变更。
chown -R www-data:www-data /usr/share/phpmyadmin/tmp- chmod 改变文件权限 (mode)
- 
chmod xyz 文件或目录 [-R] 
 xyz 可为「数字类型」或「符号类型」。
 -R : 进行递归 (recursive) 即次目录下的所有文件都变更。Linux 文件的基本权限就有九个分别是 owner/group/others,三种身份各有自己的 read/write/execute 权限, 文件的权限字符为 rwxrwxrwx这九个权限是三组 (三个一组)! 其中,使用数字来代表各个权限,权限数字对照为r:4 w:2 x:1。- 755(rwxr-xr-x)
- 
拥有者具备全部权限,其他人只有读取和运行的权限。 
- 754 (rwxr-xr--)
- 
拥有者具备全部权限,群组只有读取和运行的权限,其他人只有读取权限、无运行权、不能读取目录。 
- 644 (rw-r--r--)
- 
文件拥有者具备读取和写入权限,其他人为唯读。 权限中 [r--]虽然有 r ,但是由于没有x权限,因此其他用户并不能进入此目录!- 那拥有者能不能进入此目录?
- 
能进?! 那 Linux 有 ghost (拥有者只有 6,不能进)。 
- 这个目录不能用了能删吗?
- 
不能删?! 有 ghost (拥有者有 6,能删)。 
- 但!为什么要删?
- 
您是拥有者改成 744 就好。 
 
- X@Y
- 
X @ Y u)ser 拥有者权限 
 g)roup 群组权限
 o)ther 其它帐号权限
 a)ll 全部 (即为 ugo)+加入
 -移除
 =指定r)ead (读取) 
 w)rite (写入)
 e)xecute (运行)设置用户家目录,群组及其他无写入权。chmod go-w ~/
 
服务及调度
systemctl
sudo systemctl enable cronsudo systemctl disable cronsudo systemctl start cronsudo systemctl stop cronsudo systemctl restart cronsystemctl status cron显示服务状态:
systemctl status cron
自动启动:
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2022-11-30 07:19:42 CST; 2 months 1 days ago
不自动启动:
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; disabled; vendor preset: enabled)
查找所有启动的服务再过滤:
systemctl list-unit-files --state=enabled | grep cron
cron.service                           enabled关机脚本 Shutdown script
- 创建 myshutdown.sh (习惯把系统服务类放置于 root)
- 
sudo -i bash -c 'cat > /root/myshutdown.sh' << "EOF" #!/bin/bash umount -a -t cifs,nfs -l EOF chmod +x /root/myshutdown.sh exit
- 创建关机服务
- 
sudo bash -c 'cat > /etc/systemd/system/myshutdown.service' << "EOF" [Unit] Description=Shutdown script DefaultDependencies=no Before=shutdown.target reboot.target [Service] Type=oneshot ExecStart=/root/myshutdown.sh [Install] WantedBy=reboot.target shutdown.target EOF
- 激活及禁用
- 
重新加载服务的配置文档: sudo systemctl daemon-reload 激活 myshutdown: sudo systemctl enable myshutdown 激活消息: Created symlink /etc/systemd/system/reboot.target.wants/myshutdown.service → /etc/systemd/system/myshutdown.service. Created symlink /etc/systemd/system/shutdown.target.wants/myshutdown.service → /etc/systemd/system/myshutdown.service 禁用 myshutdown: sudo systemctl disable myshutdown 禁用消息: Removed /etc/systemd/system/shutdown.target.wants/myshutdown.service. Removed /etc/systemd/system/reboot.target.wants/myshutdown.service.
Service
运行 service 命令显示说明:
service
Usage: service < option > | --status-all | [ service_name [ command | --full-restart ] ]
列出所有安装的服务:
service --status-all
[ - ]  mysql (1)
[ ? ]  mysqld_multi
[ + ]  networking
列出开机自动启动的服务:
service --status-all | grep +
列出服务的命令:
service cron
* Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload} (2)| 1 | +: 服务正在运行。-: 服务已停止。?: 服务状态未知。 | 
| 2 | 每个服务的命令并不相同,不过一般都会有 start stop status。 | 
service --status-all 为什么会出现问号
其原因是 服务 回传字符串 usage:,可参考 /usr/sbin/service 的内容,
这表示服务脚本并没有实作 status 命令而回传该服务的命令说明。
0 program is running or service is OK 1 program is dead and /var/run pid file exists 2 program is dead and /var/lock lock file exists 3 program is not running 4 program or service status is unknown
如果按上面,服务脚本回传 4,service 是显示 [ - ]  mysqld_multi,
那如何让它显示 [ ? ]  mysqld_multi 只能回传字符串 usage:。
crontab
每项工作的格式有六个字段
分 时 日 月 周 运行的命令
数字范围 分(0 ~ 59) 时(0 ~ 23) 日(1 ~ ?) 月(1 ~ 12) 周(0星期天 ~ 6星期六)
前 5 个字段为时间字段,除了可输入数字外,可采用下列特殊的字符
- 
*(星号): 表示任何时间。
- 
,(逗号): 多个时段,如时程为 3:00 与 6:00 则为0 3,6 * * * command
- 
-(减号): 范围,如 08:00 至 12:00 间的每小时的 20 分都进行一项工作则为20 8-12 * * * command
- 
/间隔时间: 如每五分钟进行一次则为*/5 * * * * command
上述语法具弹性,如 */5 表示任何时间 (*) 每间隔 (/) 5,依据时间位置可能为每五分钟,每五小时,每五天…。
如 8-12/2 表示 8 至 12 每间隔 2 跟 8,10,12 相同。
- 创建测试档
- 
sudo -i bash -c 'cat > /root/testCrontab.sh' << "EOF" #!/bin/bash date +"%F %T" > /root/testCrontab.txt EOF chmod +x /root/testCrontab.sh exit测试运行档sudo /root/testCrontab.sh查看内容是是否更新sudo cat /root/testCrontab.txt
- crontab 任务计划依据不同帐户有不同的任务计划,可采用 root 简化设置
- 
修改任务计划,使用 crontab -e 可进入常用的编辑器sudo crontab -e输入 (当然是粘贴) 下列内容,每一分钟运行 /root/testCrontab.sh*/1 * * * * /root/testCrontab.sh
- crontab 其它相关
- 
将用户的 crontab 全部清除crontab -r检查 cron 服务状态systemctl status cron service cron status
- crontab 文件
- 
sudo -i cat /var/spool/cron/crontabs/root (1) (2) crontab -l (1) exit1 可以发现这两者的内容类似。 2 root 任务计划档为 /var/spool/cron/crontabs/root, 
 如果有其他用户调度,可以查看 /var/spool/cron/crontabs。
套件维护
- 更新
- 
更新套件sudo apt update && sudo apt upgrade -y如果提示 The following packages were automatically installed and are no longer required则 「移除无作用的套件」,或者不需要提示看直接移除。移除无作用的套件sudo apt autoremove --purge -y (1)1 若出现 not empty so not removed如dpkg: warning: while removing linux-modules-4.15.0-112-generic, directory '/lib/modules/4.15.0-112-generic' not empty so not removed 并不需要去处理,因为 dpkg 不会删除其他套件的文件,当目录不为「空」时,并不会移除目录。 
 注:不过有时在出现警告后;在运行完成时该目录已不存在。
- dist-upgrade
- 
如果一直提示 packages can be updated,表示系统将 Package 升级时有相依性的问题,而此相依性需要安装其它新的 Package 或 影响到其它 Package 的相依性,此 Package 就不会被升级会保留下来,发生这样的现像时,可运行下列得知那些可升级但未被更新的套件。查看可更新的套件: sudo apt list --upgradable 或者仿真更新: apt-get -s upgrade平时用 apt upgrade 更新,运行 dist-upgrade 选项建议先备份,若为虚拟机那么省事些 snapshot 即可。 运行 dist-upgrade: sudo apt dist-upgrade -y 运行后下列应该无列表 sudo apt list --upgradable
- command not found
- 
运行命令: ifconfig 出现错误: -bash: ifconfig: command not found 安装命令: sudo apt install ifconfig 出现错误: E: Unable to locate package ifconfig (1) 用 apt-cache search ifconfig 看看是那一个套件: apt-cache search ifconfig iproute2 - networking and traffic control tools net-tools - NET-3 networking toolkit gnome-nettool - network information tool for GNOME inetutils-tools - base networking utilities (experimental package) ... 有不少,不知道要装那一个。好吧!网页查到都是装 net-tools。 sudo apt install net-tools -y1 ifconfig 并非是套件。 
- 查找已安装套件
- 
sudo dpkg -l php* sudo dpkg -l | grep php apt list --installed | grep php apt list --installed | grep net-tools查找版本 含可安装及版本apt-cache showpkg <pkgname> 查找可安装的 PHPapt-cache search --names-only ^php[0-9]+[.]*[0-9]$运行 apt-get 出错如下:E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it? 解决方式sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/dpkg/lock sudo rm /var/cache/apt/archives/lockdpkg 参数-l问题列出安装的 php 套件: sudo dpkg -l php* dpkg-query: no packages found matching phpMyAdmin-4.9.5-all-languages.tar.gz (1) 列出目录中的文件: ls phpMyAdmin-4.9.5-all-languages.tar.gz1 疑? dpkg 是去找目录下的文件! 选项 -l(简要列出套件),怎么跟文件有关? 不知道!
- 其他
- 
安装套件: sudo apt install xinetd net-tools -y 安装指定的版本: sudo apt install pkgname=version -y 移除套件: sudo apt autoremove <pkgname> -y --purge 套件已经被卸载,但配置文档仍在 列出已安装套件的指令是 dpkg -l,检查行首是否有 rc 标示,就能判别该套件是已经被移除但还有配置文档残留的项目。 dpkg -l | grep ^rc rc libapache2-mod-php7.2 移除 rc: apt autoremove libapache2-mod-php7.2 怎么没有作用,因为没有安装 删除所有 rc 标记的 dpkg 套件: dpkg -l | grep ^rc | cut -d' ' -f3 | sudo xargs dpkg --purge
git clone
以 github OpenCC 为例: git ls-remote --tags https://github.com/BYVoid/OpenCC (1) ... 2ddaffd31f6f9cae776ec2faa4b88d5c45e0d4d6 refs/tags/ver.1.1.4 59cdfe0ac7db87bc3618ccd8943335420fa9ae9b refs/tags/ver.1.1.5 c3caa5f0221aeaf6ace45b37a608a236272a796c refs/tags/ver.1.1.6
| 1 | 正规要附加 .git如https://github.com/BYVoid/OpenCC.git。 | 
语法: git clone [<options>] [--] <repo> [<dir>] <options> 选项 <repo> 仓库位置 <dir> 指定拷贝目录名称,不指定时为项目名称。 拷贝标签 ver.1.1.5 至目录 1.1.5: git clone --branch ver.1.1.5 --depth 1 https://github.com/BYVoid/OpenCC 1.1.5 (1)
| 1 | --depth 1只需拷贝最近的版本。 | 
切换至分身目录: cd 1.1.5 以 git log 得知标签: git log commit 59cdfe0ac7db87bc3618ccd8943335420fa9ae9b (grafted, HEAD, tag: ver.1.1.5) 以 git tag 得知标签: git tag ver.1.1.5 git branch 无法取得 (因为 --depth 1 的原因): git branch * (no branch)
gem (Ruby)
一般安装 (apt install)
安装 Ruby:
sudo apt install ruby
显示 Ruby 的版本:
ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
显示 gem 的版本:
gem --version
2.7.6gem 安装路径
gem env 如下(省略跟安装路径无关的消息):RubyGems Environment:
  - INSTALLATION DIRECTORY: /var/lib/gems/2.5.0
  - USER INSTALLATION DIRECTORY: /home/ubuntu/.gem/ruby/2.5.0
  - GEM PATHS:
     - /var/lib/gems/2.5.0
     - /home/ubuntu/.gem/ruby/2.5.0
  - SHELL PATH:
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin- 
一个是安装目录 INSTALLATION DIRECTORY: /var/lib/gems/2.5.0。
 注:实际上还再附加 gems,如/var/lib/gems/2.5.0/gems。
- 
另一个是用户安装目录 USER INSTALLATION DIRECTORY: /home/ubuntu/.gem/ruby/2.5.0。
 注:跟上述的注解一样,要附加 gems。
sudo gem install 会安装至「安装目录」,也会在 /usr/local/bin 创建指令档,由于 gems 是安装用户主目录外,在安装 gems 时需要以 sudo 运行。
卸载 Ruby 前,先卸载 gems,因为要删除指令档。
gem uninstall -aIx -a Uninstall all matching versions -I Ignore dependency requirements while uninstalling -x Uninstall applicable executables without confirmation
uninstall -aIx 时可能会有下列消息ERROR:  While executing gem ... (Gem::InstallError)
    minitest is not installed in GEM_HOME, try:
        gem uninstall -i /snap/ruby/284/lib/ruby/gems/2.7.0 minitest
sudo gem uninstall -i /snap/ruby/284/lib/ruby/gems/2.7.0 minitest (1)
| 1 | 如果运行出现下列消息可忽略, /snap/ruby的目录会在卸载 Ruby (sudo snap remove ruby) 时移除。ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /snap/ruby/284/lib/ruby/gems/2.7.0 directory. | 
gem env apt 安装的结果: INSTALLATION DIRECTORY: /var/lib/gems/2.7.0 USER INSTALLATION DIRECTORY: /home/ubuntu/.gem/ruby/2.7.0 Snap 安装的结果: INSTALLATION DIRECTORY: /home/ubuntu/.gem USER INSTALLATION DIRECTORY: /home/ubuntu/.gem/ruby/2.7.0
apt 卸载 ruby: sudo apt autoremove ruby -y --purge Snap 卸载 ruby: sudo snap remove ruby
sudo rm -rf /var/lib/gems sudo rm -rf /home/*/.gem
安装 Snap Ruby.
先更新 Ubuntu: sudo apt-get update && sudo apt-get upgrade -y 再安装 Snap: sudo apt install snapd -y 列出 ruby channels: snap info ruby 3.0/stable: 3.0.5 2022-12-01 (287) 28MB classic 2.7/stable: 2.7.7 2022-12-01 (284) 13MB classic 安装 Ruby 2.7: sudo snap install ruby --channel=2.7/stable --classic 重置 bash 记忆程序的路径: hash -r 检查 Ruby 版本: ruby -v ruby 2.7.7p221 (2022-11-24 revision 168ec2b1e5) [x86_64-linux] 若要安装 (刷新) 3.0: sudo snap refresh ruby --channel=3.0/stable
gem env 如下(省略跟安装路径无关的消息):RubyGems Environment:
  - INSTALLATION DIRECTORY: /home/ubuntu/.gem
  - USER INSTALLATION DIRECTORY: /home/ubuntu/.gem/ruby/2.7.0
  - GEM PATHS:
     - /home/ubuntu/.gem
     - /snap/ruby/284/lib/ruby/gems/2.7.0
  - SHELL PATH:
     - /usr/local/sbin
     - /usr/local/bin
     - /usr/sbin
     - /usr/bin- 
一个是安装目录 INSTALLATION DIRECTORY: /home/ubuntu/.gem。
 注:实际上还再附加 gems,如/home/ubuntu/.gem/gems。
- 
另一个是用户安装目录 USER INSTALLATION DIRECTORY: /home/ubuntu/.gem/ruby/2.7.0。
 注:跟上述的注解一样,要附加 gems。
gem install 会安装至「安装目录」,也会在 ~/.gem/bin 创建指令档,但该路径并未在 PATH 中。
安装的 gems 是在用户主目录内,安装时不需要以 sudo 运行。
~/.gem/bin 加入 PATH,修改 /etc/environment:修改 /etc/environment: sudoedit /etc/environment 或 sudo nano /etc/environment 套用 /etc/environment: . /etc/environment 或 source /etc/environment
gem 常用命令
gem search <套件REGEXP> [选项] 「套件REGEXP」表示找出前置合乎「套件名称」的所有套件,除非加入 -e 选项 (全吻合)。 注:套件名称不可含版号。 search 有那些可用选项: gem search -h -a, --all 显示 gem 所有版本 -e, --exact 套件名称全吻合 --prerelease 显示预先发行版本 (注:可简化成 --pre)
gem list
gem list <套件REGEXP> -d 如详细数据中显示 Installed at: /var/lib/gems/2.5.0 实际安装的路径是在 /var/lib/gems/2.5.0/gems/套件含版号,如果有更新,会显示多个版本。
gem which <套件> 一般情况,套件的指令档会在套件的安装路径之中,套件的「数据」可能在指令档的上层。多个版本时应采用 which 来得知目前是用那一个版本。
安装 gem-path 套件:
gem install gem-path
运行 gem-path 得知套件安装路径:
gem path <套件>系统信息
Linux 版本
得知版本:
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial
得知版本:
cat /etc/os-release得知 Fedora Debian 还是 Ubuntu:
cat /proc/version
检查 kernel 版本:
uname -r
4.4.0-179-genericLinux 内存
free -m
要将单位转换成 Bytes, MB 及 GB, 分别是加上 -b, -m 及 -g,缺省为 Bytes,-v 显示版本。
total used free shared buff/cache available Mem: 1478 299 152 20 1025 959 Swap: 979 0 979 total: 安装内存容量 used: 已使用忆体容量 free: 未使用内存,注意!这里不是可用内存 shared: 共享内存(主要)由 tmpfs 使用 available: 可用内存
Linux 行程
top
top - 08:15:01 up 44 min,  1 user,  load average: 0.03, 0.11, 0.10 (1)
Tasks:  63 total,   1 running,  62 sleeping,   0 stopped,   0 zombie (2)
%Cpu(s):  1.5 us,  0.4 sy,  0.0 ni,100.0 id,  0.3 wa,  0.0 hi,  0.1 si,  0.0 st (3)
KiB Mem :  1741400 total,  1600560 free,    73184 used,    67656 buff/cache (4)
KiB Swap:        0 total,        0 free,        0 used.  1557120 avail Mem (5)
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND (6)
    1 root      20   0   56816   6548   5264 S  0.0  0.4   0:00.95 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:00.02 ksoftirqd/0
| 1 | top - 08:15:01 up 44 min,  1 user08:15:01:目前时间。up 44 min:主机开机时间。1 user:目前登录系统用户数。 load average: 0.03, 0.11, 0.10系统每 1 分钟、5 分钟、15 分钟的负载情况,load average 数据是每隔 5 秒钟检查一次行程, 按特定算法计算出数值。当数字除以逻辑 CPU 数,结果高于 5 则表示系统已超负荷运转。 | 
| 2 | Tasks: 63 total, 1 running,  62 sleeping,  0 stopped, 0 zombie目前系统共 63 个行程,1 个正在运行 (running),62 个休眠 (sleeping),0 个已停止 (stopped),0 个僵尸状态 (zombie)。 | 
| 3 | %Cpu(s):  1.5 us,  0.4 sy,  0.0 ni,100.0 id,  0.3 wa,  0.1 hi,  0.1 si,  0.0 st1.5 us:用户占用 CPU 百分比。 0.4 sy:内核占用 CPU 百分比。 0.0 ni:改变过优先级的行程占用 CPU 百分比。 0.3 wa:IO 等待占用 CPU 百分比。 0.1 hi:硬件中断(Hardware IRQ)占用 CPU 百分比。 0.0 si:软件中断(Software Interrupts)占用 CPU 百分比。 | 
| 4 | KiB Mem: 1741400 total, 1600560 free, 73184 used, 67656 buff/cach内存使用状态: 1741400 total:物理内存容量 1600560 free:剩余内存容量 73184 used:已使用的内存容量 67656 buff/cach:暂存内存容量 | 
| 5 | KiB Swap: 0 total, 0 free, 0 used.  1557120 avail Memswap 使用状态: 0 total:swap 总容量 0 free:已使用的 swap 容量 0 used:剩余 swap 容量 1557120 avail Mem 暂存内存容量 | 
| 6 | PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND行程现况: PID:行程 id(Process ID) USER:该行程用户 PR:行程优先级 NI:nice值 (值越小优先权优高) VIRT:该行程使用的虚拟内存总量,单位 kb(VIRT=SWAP+RES) RES:该行程程使用的、未被使用的物理内存大小,单位 kb(RES=CODE+DATA) SHR:共享内存大小 (单位kb) S:行程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 %CPU:上次更新到现在的CPU时间占用百分比 %MEM:行程使用的物理内存百分比 TIME+:行程使用的CPU时间总计,单位 1/100 秒 COMMAND:行程名称 | 
- top 常用参数
- 
b: Batch mode,更新时产生整个画面,以便用于记录。 
 d: 指定更新时间(单位:秒)。
 o: 指定要输出的字段名称。
 p: 指定要观察的 pid。
 u: 指定要观察的用户名。
top -b -d 2 -p 6164 +
其中 -b 参数是 batch 模式的意思,而 -o 参数则是以 %MEM (内存用量) 排序,
top -b -o %MEM | head -n 17
head -n 17 则是筛选输出前 17 行。
top -d 2 -u www-data
top 显示成 MB
e
Change the scaling factor on the summary display
Shift+e
Change the scaling factor on the task
Shift+w
Save current settings
Ubuntu 笔记
journalctl
journalctl --help
-o --output=STRING Change journal output mode (short, short-precise,
                     short-iso, short-iso-precise, short-full,
                     short-monotonic, short-unix, verbose, export,
                     json, json-pretty, json-sse, cat)
sudo journalctl -n 1 -o short
Jan 30 21:56:12
sudo journalctl -n 1 -o short-precise
Jan 30 21:56:31.128574
sudo journalctl -n 1 -o short-iso-precise
2023-01-30T21:57:16.638238+0800
sudo journalctl -n 1 -o short-iso
2023-01-30T21:56:46+0800
sudo journalctl -n 1 -o short-iso-precise
2023-01-30T21:57:16.651012+0800
sudo journalctl -n 1 -o short-full
Mon 2023-01-30 21:57:55
sudo journalctl -n 1 -o short-monotonic
[370817.508650]
sudo journalctl -n 1 -o short-unix
1675087118.807346Ubuntu 18.04 升级至 20.04
步骤如下:
- 
备份或虚拟机快照 
- 
更新 Ubuntu 18.04 LTS 所有已安装的套件 sudo apt update && sudo apt upgrade -y sudo reboot
- 
删除所有未使用的旧套件 sudo apt autoremove --purge -y
- 
安装 update-manager-core sudo apt install update-manager-core -y
- 
将 Ubuntu 18.04 LTS 升级到 20.04 LTS sudo do-release-upgrade -qdo-release-upgrad 说明: do-release-upgrade --help -d, --devel-release 升级至开发版本 -q, --quiet ... Some third party entries in your sources.list were disabled. You can re-enable them after the upgrade with the 'software-properties' tool or your package manager. To continue please press [ENTER] (按下 Enter) ... Installing the upgrade can take several hours. Once the download has finished, the process cannot be canceled. Continue [yN] Details [d] (输入 y) ... Restart services during package upgrades without asking? <Yes> (选取 <Yes>) Configuration file '/etc/rsyslog.conf' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version *** rsyslog.conf (Y/I/N/O/D/Z) [default=N] ? (按下 Enter) ... Samba server and utilities What do you want to do about modified configuration file smb.conf? keep the local version currently installed (选取本选项) ... Configuring openssh-server What do you want to do about modified configuration file sshd_config? keep the local version currently installed (选取本选项) ... 460 packages are going to be removed. Removing the packages can take several hours. Continue [yN] Details [d] (输入 y) ... To finish the upgrade, a restart is required. If you select 'y' the system will be restarted. Continue [yN] (输入 y)