Ubuntu Server基本操作

基础概要

一些Linux的基础操作已经在我以前写的Linux基础概要一书中有阐述,本篇文章只列出和服务器相关的常用操作。

关于远程连接

Ubuntu Server自14.04版本以后默认禁止root远程登录,但是阿里云等镜像会定制这个配置,允许root远程登录。如果需要开启root ssh的话,修改/etc/ssh/sshd_config配置文件重启ssh即可。相关的配置已经在之前的文章提到过: https://www.jianshu.com/p/967e3a04a6c7

软件管理

我维护服务器的原则是各种手段杜绝直接编译安装,以包管理部署为尊。因此能不编译的都不编译,我采用的部署优先级如下:

  1. 软件开发商的官方仓库(比如nginx、postgresql、docker等)
  2. 软件开发商的PPA仓库(基本等同于软件开发商官方仓库对待,如timescaledb, ansible等等)
  3. Ubuntu官方仓库(如Apache, OpenJDK, tomcat等等)
  4. 社区维护方的PPA仓库(如redis, oracle-java等)
  5. 官方直接release的二进制包+其他第三方的部署脚本
  6. 编译安装

原则上,软件开发方有官方仓库或者官方PPA仓库的,优先考虑,因为可选版本较多,漏洞修补更加及时,并且契合官方文档。Ubuntu官方仓库相对版本较低,但是通常稳定性较好,安装部署也比较方便,如无必要追新也可以考虑。没有软件仓库部署的情况下,也应该优先考虑使用官方或社区方编译好的release版本。最后都没有再考虑自行编译安装。编译环境也可以在本机搭建(同版本的Ubuntu),编译好以后打包编译好的二进制包上传到服务器上部署。

对于软件仓库的管理,我的规则是:

  • Ubuntu官方仓库配置在/etc/apt/sources.list
  • 对于非Ubuntu官方仓库,统一放在/etc/apt/sources.list.d/xxx.list(ppa也是这个规范)

关于apt的详细操作手册可以参见Ubuntu官方文档。以下列出最常用的一些操作。

安装软件

sudo apt update
# 从仓库中安装指定软件包
sudo apt install [-y] package1 [package2 ...]
# 从仓库中安装指定版本的软件包
sudo apt install [-y] package=version
# 从本地的deb文件中直接安装,相对路径绝对路径都支持
sudo apt install [-y] /path/to/deb

注意Ubuntu安装软件包的时候不会主动刷新本地缓存,因此安装/升级软件包的时候先apt updatesudo只是表示这个命令必须使用root权限,如果当前已经是root,可以不加,以下不再赘述。

升级软件

# 升级指定软件包(命令同安装指定软件包命令)
sudo apt install [-y] package1 [package2 ...]
# 升级所有可升级的软件包
sudo apt full-upgrade [-y]

降级软件

sudo apt install [-y] package=version

卸载软件

sudo apt purge/remove package

注意: purgeremove的区别。remove只卸载软件包的主体内容(比如/usr/lib/下的相关内容),而purge是更彻底的删除,除了删除主体内容之外,还会连带删除配置文件(/etc)、数据文件(/var/lib/)等。因此如果卸载数据库的话,需要考虑清楚是否数据库目录不再需要。

自动卸载不被依赖的软件包

软件包安装的时候会附带安装被依赖的软件包,这些依赖的软件包被标记为autoinstall状态。当别的软件包被删除或者升级之后,这些软件包可能不再被依赖。apt命令行会给出提示。可以使用以下命令快速删除这些不再依赖的软件包:

## --purge参数的含义如同上面的purge操作
sudo apt autoremove [--purge]

注意: 当软件包被标记为hold的时候,是不会被autoremove清除掉的。

固定软件版本

如果需要固定软件版本,不受full-upgrade/upgrade/autoremove的影响,可以冻结版本:

# package可用正则
sudo apt-mark hold package
# 解除冻结版本(同样支持正则)
sudo apt-mark unhold package
# 列出当前处于autoinstall/manual/hold状态的包
sudo apt-mark showauto/showmanual/showhold

注意: 冻结版本只是限制了自动升级、自动卸载等功能不会影响到hold/manual状态的软件包,但是不受apt install的影响,如果需要手工升级某些被冻结的软件包,一样可以使用apt install命令直接升级。manual状态代表该软件包手动安装,不受autoremove的影响,但是可以通过upgrade/full-upgrade升级。hold状态代表这个软件包不受autoremove/upgrade/full-upgrade影响。apt install package安装的package为manual状态,被package依赖安装的软件包则为autoinstall状态。

列出仓库可以安装的软件包版本

apt policy package
# 下面这个更详细,可以列出每个版本依赖的软件包以及包信息等等
apt show -a package

列出已安装的软件包

apt list
dpkg -l

列出安装包释放出哪些文件

dpkg -L package

找出指定文件是哪个软件包释放出来的

dpkg -S /path/to/file   # 如dpkg -S `which git`

搜索软件包

apt search <keywords>

列出软件包依赖关系

apt depends <package>

自动更新

对于暴露在互联网的服务器,可能希望自动更新安全补丁,如需启用自动更新,可以参考Ubuntu官方文档详情。

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

dpkg-reconfigure询问是否启用自动更新的时候,选择Yes便会生成一个/etc/apt/apt.conf.d/20auto-upgrades配置文件,表示启用自动更新,也可以自定义这个配置文件更改一些行为。

/etc/apt/apt.conf.d/50unattended-upgrades这个配置文件默认只启用${distro_id}:${distro_codename}${distro_id}:${distro_codename}-security两个仓库,即安全更新,大部分情况是够用的。如果需要更新其他仓库的包直接定制这个文件即可。如果需要启用自动更新之后自动autoremove,修改Unattended-Upgrade::Remove-Unused-Dependencies "true";这一项就好了,如果需要自动清理掉多余的内核文件,改这一项: Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

升级操作系统

Ubuntu支持跨版本升级操作系统,通常在下一个版本发布后的第二个迭代(如16.04.1, 18.04.1等)更新升级方案。使用以下命令可以升级到下一个LTS版本:

sudo do-release-upgrade

如果能直接上新的服务器并做迁移的话,是没必要进行这个操作的。如果需要高版本的新特性,并且暂时没有多余资源上新服务的话,只能通过升级操作系统解决。如以下情况:

  • 需要启用Nginx的HTTP 2.0协议支持,需要openssl版本在1.0.1e以上版本,需要升级操作系统到16.04以上版本
  • 需要OpenJDK 11版本,这个版本在18.04版本以上
  • ...

注意: 在升级之前,需要先阅读新版本的Release Notes,确认新版本和当前版本有没有出现废弃软件包,升级不兼容当前配置的情况。如Ubuntu 14.04将Apache更新至2.4版本,而之前一个LTS使用2.2版本,配置文件不兼容,会导致升级之后服务启动失败,需要手改配置。再比如Ubuntu 18.04废弃了Tomcat7这个包,改为了Tomcat8,所以如果旧版本服务器安装了Tomcat7,需要注意迁移war包和配置到Tomact8的目录下,等等。最后就是/etc/apt/sources.list.d/*.list中的文件基本都得手改仓库的,可能很多仓库在升级过程中都不会得到正确的仓库配置,所以在升级之前建议手改开发代号或者版本号等参数。在升级之前,强烈建议先在测试环境做升级测试,以评估升级之后的风险等。

服务管理

对于Ubuntu 14.04以及之前的版本,Ubuntu的service manager使用upstart,从16.04开始改为了Systemd。目前不考虑老的upstart了,如有需要直接查阅upstart的文档即可。以下内容针对目前Ubuntu的Systemd服务管理常用操作。

Systemd官方文档: https://www.freedesktop.org/wiki/Software/systemd/

启动/停止/重启/看状态

sudo systemctl start/stop/restart/status <service>[.service]
# 以下这个命令兼容老的SysV命令,照顾老运维,在CenOS 7使用会有警告,但是Ubuntu不会
sudo service <service> start/stop/restart/status

开机自启动

sudo systemctl enable <service>[.service]
# 取消开机自启动
sudo systemctl disable <service>[.service]

列出服务

# 列出已知的service name(unit),可以根据state过滤
systemctl list-unit-files [--state=STATE]
# 列出当前处于running状态的服务
systemctl list-units --type=service --state=running

查看日志

日志有两种情况,一种是服务本身运行的时候就会打印的日志文件(比如Java程序使用log4j/logback等日志框架直接将日志打印到某个日志文件中),另一种是输出到标准输出,被service manager捕获到的日志。

对于程序本身会打印日志的情况,直接在对应的日志路径查看就可以了。对于Systemd捕获到标准输出/标准错误的日志,是保存为二进制格式的,无法直接通过文本处理命令查看,需要使用journalctl命令查看。常用的操作如下:

journalctl [-x] [-e] [-f] -u <service>

参数说明:

  • -u: 指明unit产生的日志,即服务名
  • -x: 对日志输出加入更多描述信息(catalog)
  • -e: 滚动到最新的日志,通常-xe连用
  • -f: 等同于tail -f的效果
  • 其他参数参考man手册

在线监控

  • top
  • htop (建议在F2配置-Display options-除了Shadow other users' processes之外全勾选)
  • atop
  • vmstat
  • pidstat
  • sar
  • ...

查看登录状态

last
# 查看bad login
lastb

查看当前登录用户以及正在进行的操作

w

端口监控

ss -nltp

对于看udp端口监听状况把-t换成-u即可。-p参数打印进程pid,这个参数需要sudo权限,否则显示不出来pid

进程管理

列出进程列表

# 列出所有进程
ps aux
# 按照父子进程关系列出进程
ps exf
pstree -a

给进程发信号

# 给指定的pid发送信号,默认信号为SIGTERM,即signal id为15的信号
kill [-SIGNAL] <pid1> [pid2 ...]
# 批量筛选进程或者批量发送信号
killall/pkill/pgrep
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容