Tag

Ubuntu

修复误损坏/usr的ubuntu

前情提要

在安装telegraf的时候需要复制文件到/etc /usr /var 等目录下,移动文件的时候错误使用了mv usr/* /usr/*的指令,导致系统损坏,缺少bash无法ssh远程连接

尝试远程修复

ssh连不上的情况下发现跑在docker中的容器居然还在正常运行,于是尝试通过portainer新建容器挂在根目录修复,发现portainer会执行宿主机上的可执行文件调用docker,失败

物理机处理

在无法远程修复的情况下只能直接操作物理机修复/备份数据重装。此时物理机/usr目录损坏已经无法重启正常进入系统,启动时显示run-init: can't execute '/sbin/init': No such file or directory,猜测是因为该文件是从/usr/sbin下软链接过来的

使用安装盘进入系统

我的安装盘是rufus创建的,使用的是之前安装系统时的ubuntu 24.04.1 server

首先进入启动盘选择界面,根据教程需要try ubuntu without install然后进入Live 环境,但是server的启动盘中并不包含这个选项,所以直接进入install界面,然后ctrl + alt + f2进入安装器的 BusyBox / Shell

挂载磁盘

使用lsblk指令列出可挂载的磁盘,我的机器中有一块固态和一块机械,固态的主要数据在 /dev/nvme0n1p2,机械的数据在/dev/sdb1,同时我还插入了移动硬盘以便在系统无法修复的情况下直接备份数据,移动硬盘在 /dev/sdc

首先挂载系统盘检查损坏情况mkdir /nvme && mount /dev/nvme0n1p2 /nvme,然后ls /nvme/usr检查损坏情况

非常神奇的,/nvme/usr/bin/nvme/usr/lib/nvme/usr/src没有被删除,于是我直接从安装器的系统中复制了其余的includelib64libexeclocalsbinshare目录到/nvme/usr下,并重启系统,此时正常进入系统

检查系统损坏情况

虽然正常进入了系统,但是并不是所有问题都解决了,首先检查了一些系统服务是否正常运行

dpkg -V | grep -v '^??'列出所有有缺失的包,apt reinstall重新安装确保丢失文件被重新安装

最后安装mariadb的时候忘了指定版本导致启动失败,回忆起以前安装的时候找的对标mysql8的版本,于是卸载自动安装的最新版本换成了mariadb-server=1:10.11.13-0ubuntu0.24.04.1,重启服务后正常运行

检查docker的时候发现docker compose指令不见了,于是重新安装apt install docker-compose-plugin

一天后发现博客无法访问,博客是部署在docker中的wordpress(也就是你现在看到的博客),显示Error establishing a database connection,检查后发现mariadb的默认绑定地址是127.0.0.1,所以无法从容器中访问

后记

至此,系统已修复完成,所有服务都可以正常运行

安装docker

2025-04-01ubuntu-24.04.1 上安装 docker

参考自 https://www.sysgeek.cn/install-docker-ubuntu/

安装前置

sudo apt update
sudo apt install apt-transport-https curl

添加gpg密钥

这一步遇到问题,可能失败,失败后会在 /etc/apt/keyrings/docker.gpg 写一个空文件,需要删除后重试

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

添加仓库

虽然格式和apt自带的不一致,但是能用

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新软件包列表

sudo apt update

安装

这一步下载很慢,选择给apt设置代理(http_proxy环境变量居然无效) 创建文件 /etc/apt/apt.conf.d/proxy.conf 并写入

Acquire::http::Proxy "http://192.168.1.1:7890/";
Acquire::https::Proxy "http://192.168.1.1:7890/";
# 安装
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

检查docker状态

sudo systemctl is-active docker

hello world

下不动哈哈哈
https://cloud.tencent.com/developer/article/2485043 找到了可用的两个镜像源

编辑文件 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://docker.xuanyuan.me",
    "https://docker.1ms.run"
  ]
}

配置完成后

sudo systemctl daemon-reload
sudo systemctl restart docker

构建KonaJDK

最近准备参加OpenSourceTalent,题目是KonaJDK相关的,首先要构建KonaJDK,这儿我踩了很多坑

尝试在windows构建

  • 我一开始尝试使用mingw构建,但是configure中要求的make版本不一致
    configure: Found GNU make version GNU Make 4.2.1 at /f/App/mingw64/bin/make, but it is not for msys (it says: Built for x86_64-w64-mingw32). Ignoring. configure: error: Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure.

  • 然后我尝试使用msys2构建,make版本没有问题,但是configure死活不认我装的vs2022,使用vs2013也一样构建失败(后来在ci里看到它使用的是vs2017)
    configure: Could not succesfully extract the envionment variables needed for the VS setup.
    configure: Try setting --with-tools-dir to the VC/bin directory within the VS installation
    configure: or run "bash.exe -l" from a VS command prompt and then run configure from there.
    configure: error: Cannot continue

  • 宣告放弃,下各种版本的vs弄得我头都大了

尝试在Ubuntu构建

  • 首先我电脑里有一个之前用过的Ubuntu22.04,我先尝试在上面构建,但是编译的时候会出现各种语法错误导致无法完成编译

  • 然后我去翻Kona的ci,看到了他的构建脚本,使用的是Ubuntu20.04
  • 最终我下了一个新的Ubuntu20.04镜像,按照ci的构建脚本构建成功了(但是还是要自己apt装一些依赖,这ci依赖不全怎么能构建出来的?

Ubuntu上的构建过程

# ci里装的依赖
apt-get install openjdk-8-jdk gcc-9 g++-9 libxrandr-dev libxtst-dev libcups2-dev libasound2-dev
# 自己安装时缺少的依赖
apt-get install libfontconfig1-dev libfreetype6-dev

bash configure \
--with-conf-name=linux-x64 \
--with-target-bits=64 \
--enable-debug \
--with-build-number=b00 \
--with-boot-jdk=/usr/lib/jvm/java-8-openjdk-amd64 \
--with-zlib=bundled \
--with-freetype-lib=/usr/lib/x86_64-linux-gnu \
--with-freetype-include=/usr/include/freetype2

make images

总结:构建文档没一个能信的,只有ci不会骗人

准备等空了再挑战一下在win构建KonaJDK,成功了再来更新

Ubuntu安装Mysql5.7笔记

下载

https://downloads.mysql.com/archives/community/

解压

tar -xf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz

创建linux用户和组

groupadd mysql && useradd -r -g mysql mysql

设置

注意,以下示例步骤中安装mysql的位置为/usr/local/mysql,mysql数据文件夹为/usr/local/mysql/data

vim /etc/my.cnf

参考:http://c.biancheng.net/view/7618.html

这儿的不要乱写,容易导致各种奇奇怪怪的问题

[mysqld]
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
max_connections=200
symbolic-links=0
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysql]
default-character-set=utf8

[mysqld_safe]
log-error=/usr/local/mysql/error.log
pid-file=/usr/local/mysql/mysqld.pid

文档:https://www.mysqlzh.com/doc/13/78.html

# 创建数据文件夹, 日志文件夹, 设置所有者
cd /usr/local/mysql && mkdir logs && touch error.log && chown mysql:mysql -R *

初始化

bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql --initialize

解决./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

sudo apt install -y libaio-dev numactl

复制 mysql 到系统服务

cp support-files/mysql.server /etc/init.d/mysql

解决Unit mysql.service does not exist, proceeding anyway.

修改vim /etc/init.d/mysql

# 若/etc/my.cnf中指定了mysql目录,则此处也需要指定
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data

启动mysql

systemctl enable mysql

或者

service mysql start

进入mysql命令行

mysql -u root -p
# 在接下来的一行中输入密码

解决./mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

apt-get install -y libncurses*

修改密码

-- 更新密码
alter user 'user'@'host' identified by 'password';
-- 刷新权限
flush privileges;

常用操作

以下内容参考于 https://blog.csdn.net/qpzkobe/article/details/102833458

# 创建用户 username替换为用户名, host替换为地址, password替换为密码
# 示例 CREATE USER 'mc'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
# 删除用户 username替换为用户名, host替换为地址
# 示例 DROP USER 'mc'@'localhost';
DROP USER 'username'@'host';
# 授权 privileges替换为权限, databasename替换为库名, tablename替换为表名, username替换为用户名, host替换为地址
# 示例 GRANT all ON playerpoints.* TO 'mc'@'localhost';
GRANT privileges ON databasename.tablename TO 'username'@'host';
# 撤销授权 privileges替换为权限, databasename替换为库名, tablename替换为表名, username替换为用户名, host替换为地址
# 示例 REVOKE all ON playerpoints.* FROM 'mc'@'localhost';
REVOKE privilege ON databasename.tablename FROM 'username'@'host';

# 刷新权限
flush privileges;

Ubuntu20.04安装&配置下载源/中文

下载ISO & 安装

官网下载,这里选LTS(长期支持版)

这里我用的vmware虚拟机安装的ubuntu,如果要在实体机上安装ubuntu的话,可以使用ubuntu官网推荐的rufus

安装过程比较长并且没有什么需要操作的地方,跳过

配置下载源

安装好系统后,默认是英文,系统默认没有附带中文的语言文件,要更换语言就得下载。

下载之前首先要设置下载源,国内不配置下载源下载会非常慢(如果有弹窗让你更新的话先放着,等配置好下载源之后再更新)

关闭并且重载

等到进度条走完就完成了换源(如果有报错跳过即可)

更换系统语言

安装完成后

设置格式

设置完成后重启就是中文得了

不要忘了设置输入法 不要忘了设置输入法

其他设置

标准文件夹改名

将语言设置为中文后系统会询问是否改名标准文件夹,这里我选择不改

原因是之前用centos7(gnome桌面),中文输入法有时会失灵,无法输入中文,没办法进入中文名字的文件夹

自动息屏

时区

SU & ROOT

ubuntu默认不允许直接使用root账户登陆,需要使用时请使用 su 指令切换到 root 账户,使用完毕之后用 exit 指令退出

第一次使用 su 切换toot账户之前需要先为root账户设置密码

输入 sudo passwd 为root账户设置密码,输入指令后需要输入3此密码,第一次是当前账户的密码,后两次是设置root账户的密码,输入后不显示是正常情况

代理

wget的时候是不走系统代理的,解决办法

export https_proxy=192.168.48.1:7890 export http_proxy=192.168.48.1:7890 export ftp_proxy=192.168.48.1:7890

这里的 192.168.48.1:7890 是我本机的代理,使用时修改成你的代理地址

远程连接/SSH

Ubuntu默认带了openssh-client,但是没有openssh-server

直接 apt install -y openssh-server 会提示

这里我们直接卸载已有的openssh-clileht

apt remove -y openssh-client

然后再安装openssh-server

apt install -y openssh-server

ps: 这里我使用的root账户安装,若是普通账户请在指令前添加 sudo

sudo apt remove -y openssh-client

sudo apt install -y openssh-server