leadscloud

Google SEO|外贸营销推广

ChatGPT国内镜像站,国内使用ChatGPT中文版本

http://chat.tinycms.xyz:3002/

域名更改为

https://freegpt.tech/

如果网站无法打开,使用下面的导航链接

https://site.tinycms.xyz

欢迎体验,当前主流模型包括o1-mini模型都可免费体验,deepseek免费用:

支持

  • 模拟浏览器登录访问原始chatgpt网站,ChatGPT Plus付费版本
  • 支持最新的各种chatgpt模型及市面上的其它热门模型
  • 支持你自己的chatgpt账号中的API key 调用访问
  • 免费访问gpt-4等模型和部分画图模型
阅读全文 »

记录一次腾讯云镜像在本地恢复的过程

由于遇到一些限制原因导致出现了诸多错误,无法顺利恢复,不过最终经过多次尝试,终于恢复成功,特记录一下。

腾讯云被封,无法远程ssh连接

虽然无法访问服务器,但通过网页仍可以访问,但由于所有网络都断了,不可能下载大量数据了,想到了创建镜像然后导出到本地的操作

腾讯云创建镜像导出本地,需要先创建一个存储桶(第一次开通免费,个人50G,企业1T),并且流量是收费的,为了下载这个镜像不得不付钱搞定,整个流程到这还比较快。

无法正常恢复

镜像下载的为.vmdk镜像,下载到本地后,导入virtualbox,开机启动,出现错误 warning: /dev/vda1 does not exist

虚拟机创建时,选择不添加虚拟硬盘,创建完成后在设置中(选择存储,在控制器那里添加硬盘)附加镜像即可

在vnc里用ls /dev查看设备信息显示的结果中并不存在/dev/vda1,存在/vda/sda1

如果/vda/sda1也不存在,看看你的虚拟机是不是硬盘设置中位置没有放到 SATA端口0 的位置。

通过以下办法可以启动

进入VPS服务商提供的VNC后台界面,执行下面语句

1
2
3
4
# mount /dev/sda1 /tmp
# sed -i ‘s/vda/sda/g’ /tmp/etc/fstab
# sed -i ‘s/vda/sda/g’ /tmp/boot/grub2/grub.cfg
# reboot

当然,如果你更改虚拟机有时默认是正常的,那就最好不过了。原因就是虚拟机中的硬盘是sda1 但镜像中保存的是原始数据 vda1,启动时无法找到相应硬盘。

centos7 root密码恢复

  • 开机按下Ecs键,进入启动界面
  • 根据需要选择系统内核版本并按e
  • 光标移动到 linux 16 开头的行,找到 ro 改为 rw init=sysroot/bin/sh
  • Ctrl+x 执行
  • 进入如下界面后输入chroot /sysroot
  • 输入passwd根据提示输入两次新密码
  • 完成后输入 touch /.autorelabel 更新系统信息
  • 键入 exit 退出
  • 然后使用reboot命令重启

postgresql的恢复

我主要为了恢复这个数据库,但在本地启动后无法成功启动应用,只能新建一个同样版本的Centos7,然后把数据库data目录复制过去,启动成功。

流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[extras]
gpgcheck=1
gpgkey=http://mirrors.tencentyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
baseurl=http://mirrors.tencentyun.com/centos/$releasever/extras/$basearch/
name=Qcloud centos extras - $basearch
[os]
gpgcheck=1
gpgkey=http://mirrors.tencentyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
baseurl=http://mirrors.tencentyun.com/centos/$releasever/os/$basearch/
name=Qcloud centos os - $basearch
[updates]
gpgcheck=1
gpgkey=http://mirrors.tencentyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
baseurl=http://mirrors.tencentyun.com/centos/$releasever/updates/$basearch/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
yum update
yum install net-tools wget -y

yum install yum-fastestmirror
yum clean all

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum update

yum install -y postgresql15-server

# 如果提示 `libzstd版本不对问题`
yum install libzstd*
yum install epel-release.noarch -y
yum install libzstd.x86_64 -y

/usr/pgsql-15/bin/postgresql-15-setup initdb
systemctl start postgresql-15
systemctl status postgresql-15


远程数据同步到本地

`rsync -a -e "ssh -p xxxx" root@192.168.56.1:/root/data/ /var/lib/pgsql/15/data/`

cp -p data-origin/postgresql.conf data/

systemctl start postgresql-15

网站使用cloudflare时,无法得到真正的ip,如果知道域名的ip,一般使用下面的命令探测

1
curl -v -H "Host: leadscloud.xyz" 167.172.xx.xx

CURL重定向

通过-L选项进行重定向 默认情况下CURL不会发送HTTP Location headers(重定向).当一个被请求页面移动到另一个站点时,会发送一个HTTP Loaction header作为请求,然后将请求重定向到新的地址上。

1
2
# 让curl使用地址重定向,此时会查询google.com.hk站点
curl -L http://www.google.com

下载单个文件,默认将输出打印到标准输出中(STDOUT)中

curl http://www.centos.org

通过-o/-O选项保存下载的文件到指定的文件中:

  1. -o:将文件保存为命令行中指定的文件名的文件中
  2. -O:使用URL中默认的文件名保存文件到本地
# 将文件下载到本地并命名为mygettext.html
  curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
 
# 将文件保存到本地并命名为gettext.html
  curl -O http://www.gnu.org/software/gettext/manual/gettext.html

同样可以使用转向字符”>”对输出进行转向输出

同时获取多个文件

curl -O URL1 -O URL2

若同时从同一站点下载多个文件时,curl会尝试重用链接(connection)。

断点续传

通过使用-C选项可对大文件使用断点续传功能,如:

# 当文件在下载完成之前结束该进程
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
##############             20.1%

# 通过添加-C选项继续对该文件进行下载,已经下载过的文件不会被重新下载
curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
###############            21.1%

CURL授权

1
2
3
4
curl -u username:password URL

# 通常的做法是在命令行只输入用户名,之后会提示输入密码,这样可以保证在查看历史记录时不会将密码泄露
curl -u username URL

上传文件到FTP服务器

通过 -T 选项可将指定的本地文件上传到FTP服务器上

# 将myfile.txt文件上传到服务器
curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com

# 同时上传多个文件
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com

# 从标准输入获取内容保存到服务器指定的文件中
curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

为CURL设置代理

x 选项可以为CURL添加代理功能

 # 指定代理主机和端口
 curl -x proxysever.test.com:3128 http://google.co.in

保存与使用网站cookie信息

 # 将网站的cookies信息保存到sugarcookies文件中
 curl -D sugarcookies http://localhost/sugarcrm/index.php
 
 # 使用上次保存的cookie信息
 curl -b sugarcookies http://localhost/sugarcrm/index.php

设置user-agent

-A参数指定客户端的用户代理标头,即User-Agent。curl的默认用户代理字符串是curl/[version]

1
$ curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

也可以通过-H参数直接指定标头,更改User-Agent

curl -H 'User-Agent: php/1.0' https://google.com

传递请求数据

默认curl使用GET方式请求数据,这种方式下直接通过URL传递数据
可以通过 –data/-d 方式指定使用POST方式传递数据

# GET
curl -u username https://api.github.com/user?access_token=XXXXXXXXXX

# POST
curl -u username --data "param1=value1&param2=value" https://api.github.com

# 也可以指定一个文件,将该文件中的内容当作数据传递给服务器端
curl --data @filename https://github.api.com/authorizations

注:默认情况下,通过POST方式传递过去的数据中若有特殊字符,首先需要将特殊字符转义在传递给服务器端,如value值中包含有空格,则需要先将空格转换成%20,如:

curl -d "value%201" http://hostname.com

在新版本的CURL中,提供了新的选项 –data-urlencode,通过该选项提供的参数会自动转义特殊字符。

curl --data-urlencode "value 1" http://hostname.com

除了使用GET和POST协议外,还可以通过 -X 选项指定其它协议,如:

curl -I -X DELETE https://api.github.cim

上传文件

curl --form "fileupload=@filename.txt" http://hostname/resource

获取更多信息

通过使用 -v 和 -trace获取更多的链接信息

显示头信息

  • -i 参数:可以显示http response 的头信息,连同网页代码一起。
  • -I 参数:则只显示http response 的头信息, 不显示网页源码。 同 –head

centos7服务器升级node 20后 n latest,出现以下问题

1
2
3
4
5
6
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)

明显是GLIBC_2.27支持问题

更新glibc

1
2
3
4
wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar xf glibc-2.28.tar.gz
cd glibc-2.28/ && mkdir build && cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

在这之前一般都要升级gcc和make,否则在configure时会出现下面错误

1
2
3
configure: error: 
*** These critical programs are missing or too old: make bison compiler
*** Check the INSTALL file for required versions.

升级GCC和make

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 升级GCC(默认为4 升级为8)
yum install -y centos-release-scl
yum install -y devtoolset-8-gcc*
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++

# 升级 make(默认为3 升级为4)
wget http://ftp.gnu.org/gnu/make/make-4.3.tar.gz
tar -xzvf make-4.3.tar.gz && cd make-4.3/
./configure --prefix=/usr/local/make
make && make install
cd /usr/bin/ && mv make make.bak
ln -sv /usr/local/make/bin/make /usr/bin/make

如果提示 These critical programs are missing or too old: bison 升级或安装下bison

1
yum install -y bison

继续安装glibc

1
2
3
4
cd /root/glibc-2.28/build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

make && make install

如果出现错误

1
/usr/bin/ld: cannot find -lnss_test2

请修改scripts/test-installation.pl,新增如下内容 128行左右

1
&& $name ne "nss_test1" 

改为

1
&& $name ne "nss_test1" && $name ne "nss_test2"

如果报错

1
/lib/../lib64/libnss_nis.so: undefined reference to `_nsl_default_nss@GLIBC_PRIVATE'

请加–enable-obsolete-nsl

1
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --enable-obsolete-nsl

如果还是出现

1
2
3
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)

通过查看strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX 发现少了GLIBCXX_3.4.20,解决方法是升级libstdc++.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
yum provides libstdc++.so.6


cd /usr/local/lib64
# 下载最新版本的libstdc.so_.6.0.26
wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
unzip libstdc.so_.6.0.26.zip
# 将下载的最新版本拷贝到 /usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64
cd /usr/lib64
# 查看 /usr/lib64下libstdc++.so.6链接的版本
ls -l | grep libstdc++
libstdc++.so.6 ->libstdc++.so.6.0.19
# 删除/usr/lib64原来的软连接libstdc++.so.6,删除之前先备份一份
rm libstdc++.so.6
# 链接新的版本
ln -s libstdc++.so.6.0.26 libstdc++.so.6
# 查看新版本,成功
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

升级导致的语言包问题,中文有乱码

特别是crontab -e编辑时里面的中文有些正常,有些乱码

1
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

可以通过如下解决

1
2
cd /root/glibc-2.28/build
make localedata/install-locales

这样每次登录ssh就不会提示 LC_ALL: cannot change locale 了。

参考链接:

安装步骤

1
2
3
4
5
6
wget https://www.inet.no/dante/files/dante-1.4.3.tar.gz
tar xf dante-1.4.3.tar.gz
cd dante-1.4.3/
autoreconf --install --force
./configure
make install

创建并编辑配置文件

vi /etc/sockd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
internal: 0.0.0.0 port=1080
external: eth0

clientmethod: none
socksmethod: username # 使用系统用户名密码方式验证

#user.privileged: root
user.notprivileged: socks # 创建的用户名

client pass {
from: 0/0 to: 0/0
#log: connect disconnect error
}

socks pass {
from: 0/0 to: 0/0
#log: connect disconnect error
}

127.0.0.1 替换成 x.x.x.x/8 即可。

配置说明: https://www.inet.no/dante/doc/1.4.x/config/server.html

添加用户

1
2
3
adduser --no-create-home --shell /usr/sbin/nologin socks # 添加一个本地用户,不创建默认目录和登录Shell

passwd socks # 设置一个密码

运行

直接以daemon模式运行

1
sockd -D

测试代理

使用内置的-V命令测试sockd.conf文件是否正确,若正确则无任何输出

1
sockd -V

测试能否正常使用

1
curl --proxy 'socks5://127.0.0.1:1080' 'https://api.ipify.org/'

可以使用 netstat -lntp 看启动状态

1
tcp        0      0 0.0.0.0:1080            0.0.0.0:*               LISTEN      16769/sockd

开机启动

vi /etc/rc.local

1
/usr/local/sbin/sockd -f /etc/sockd.conf &

关闭

killall sockd

Google的API一般是下面这种使用方法,使用的是oauth2client

1
2
3
4
5
6
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
credentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEY_FILE, scopes=SCOPES)
http = credentials.authorize(httplib2.Http())

response, content = http.request(ENDPOINT, method="POST", body=json_ctn)

众所周知的原因,在国内你这样使用,必须得用代理,使用requests包非常方便,但是如果是上面的代码,使用代理有点小麻烦

你需要在代码前面加上

1
2
3
import socket
socket.socket = socks.socksocket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 1080)

比较麻烦。

可以用requests代替上面的操作,一般如下

1
2
3
4
5
6
7
8
9
10
11
12
13
http = httplib2.Http(proxy_info=httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 1080))

credentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEY_FILE, scopes=SCOPES)
access_token_info = credentials.get_access_token(http)

requests.get(url, params={
"url": "http://foo.com"
}, proxies={
'http': "socks5://127.0.0.1:1080",
'https': "socks5://127.0.0.1:1080",
}, headers={
"Authorization": 'Bearer ' + access_token_info.access_token
})

参考代码: https://github.com/googleapis/oauth2client/blob/master/oauth2client/transport.py

安装 NGINX http_realip_module 模块

在 LNMP 安装目录下找到 lnmp.conf 这个文件,编辑这个文件,在 Nginx_Modules_Options 里加上 --with-http_realip_module,修改的命令如下:

1
Nginx_Modules_Options='--with-http_realip_module'

保存后执行 ./upgrade.sh nginx 来升级下 NGINX 就可以了。升级需要输入新的 NGINX 版本号,如果不想改动版本,直接输入原来的版本号即可。

修改 LNMP 配置启用模块

修改配置文件 /usr/local/nginx/conf/nginx.conf

创建文件 touch /usr/local/nginx/conf/cloudflare_ip.conf

然后,在 server {} 里面加上下面这一行:

1
include cloudflare_ip.conf;

在 /root 目录下创建下面文件:

1
update_cloudflare_ip.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
echo "#Cloudflare" > /usr/local/nginx/conf/cloudflare_ip.conf;
for i in `curl https://www.cloudflare.com/ips-v4`; do
echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done
for i in `curl https://www.cloudflare.com/ips-v6`; do
echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done

echo "" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "# use any of the following two" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "real_ip_header CF-Connecting-IP;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "#real_ip_header X-Forwarded-For;" >> /usr/local/nginx/conf/cloudflare_ip.conf;

执行一次脚本:/bin/bash /root/update_cloudflare_ip.sh

保存之后,配置 crontab 每周更新一次 Cloudflare 的 IP 地址(crontab -e):

1
0 5 * * 1 /bin/bash /root/update_cloudflare_ip.sh

修改日志记录配置

还是修改 /usr/local/nginx/conf/nginx.conf 这个文件,在 http {} 中间加入下面几行:

1
2
3
4
5
6
7
8
9
# 这是网上大部分的教程这样写的,不对,正确的请看下面的追加

map $HTTP_CF_CONNECTING_IP $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+),?.*$ $firstAddr;
}
log_format main '$clientRealIp [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'$http_user_agent $remote_addr $request_time';

注意: 如果include cloudflare_ip.conf; 放在 http {}中,$remote_addr会替换为真实的ip地址,不需要上面的修改了。

然后在网站记录的日志定义使用main这个日志格式

2023-6-5修改:

上面的代码是有问题的,网上大部分的教程也是如此,这用特地说明下

$HTTP_CF_CONNECTING_IP是使用cloudflare后,cf传给服务器的用户真实ip, 为了防止有人伪造headers,使用了 set_real_ip_from, 这样可以保证只能cloudflare的ip地址传过来的 headders["CF-Connecting-IP"] 我们才相信。

所以通常情况下,你不需要安装--with-http_realip_module这个组件,大部分情况下直接相信cloudflare即可。

上面的map应该修改为

1
2
3
4
map $http_cf_connecting_ip $clientRealIp {
"" $remote_addr; #如果为空,使用remote_addr
default $http_cf_connecting_ip; # 默认http_cf_connecting_ip headers传过来的值
}

上面那个匹配ip的正则是错误的,比如这个ipv6地址就无法匹配 2001:41d0:303:363::1, 这是ipv6的一种缩写形式,所以网上大部分的教程是错误的。

1
access_log /home/wwwlogs/abc.com.log main;

最后重载下nginx

1
/etc/init.d/nginx reload

这时就全部搞定了。

防火墙如何封禁真实的用户ip

开了 CDN 之后使用 iptables 是没法封禁真实 IP 地址的。

Wordpress 使用 Eelementor 插件时,编辑内容,会保存到wp_postmeta中,对于中文一些替换插件 Better Search Replace 等没有问题,但如果是中文,你会发现使用替换工具替换后,内容不变。

这主要是因为中文内容保存为json格式后,会编码为unicode格式,所以无法替换,可以使用下面方法替换。

1
select count(*) from wp_postmeta where meta_value like '%\\\\u539f\\\\u59cb\\\\u5b57%\\\\u7b26';

SELECT语句中四个反斜杠(\)代表一个.
在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到””,就要反转义两次,也就是由”"到”"再到””。
如果是普通的精确查询(=),则无需第二次的正则转义,和INSERT语句一样。

比如 原始字符 替换为 替换字符

1
2
3
4
5
6
UPDATE wp_postmeta 
SET meta_value = REPLACE(
meta_value,
'\\\u539f\\\u59cb\\\u5b57\\\u7b26',
'\\\u66ff\\\u6362\\\u5b57\\\u7b26'
);

可以使用js的 escape 来把中文转为unicode编码

wordpress内容替换SQL语句

1
2
3
UPDATE wp_options SET option_value = replace(option_value, 'http://www.yoursitename.com', 'http://localhost') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.yoursitename.com', 'http://localhost');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://www.yoursitename.com','http://localhost');

mysqldump工具来备份wordpress数据库

在操作前,无论使用插件还是sql语句,都要先备份数据库

1
sudo mysqldump -u root wordpress > wordpress.sql

备份wordpress根目录下的所有文件

1
sudo tar -cpvzf wordpress.tar.gz /home/wwwroot/wordpress/

上面的命令包含5个参数,分别为:

  • -c 创建一个归档文件;
  • -p 保留已归档文件的相应权限设置;
  • -v 显示详细信息;
  • -z 使用gzip压缩归档文件;
  • -f 代表文件。

执行上述命令后,/home/wwwroot/wordpress/文件夹下的所有文件都会被归档和压缩。

安装centos7时,有一个提示,是否加密磁盘,选择此选项后,每次启动系统都会要求你输入密码,这样可以保证磁盘如果没有密码,放到其它电脑上也无法使用。对数据会更加安全。

但每次手动输入密码还是比较麻烦,最好是把密钥放到U盘里,插上后就可以自动解锁,不需要输入人工输入密码。

我搜索了下,网上关于此的教程都无法完美解决,没有非常完善的文档,下面两个教程是最靠谱的,我也是根据这些教程,在虚拟机上测试成功后才找到具体的原因。

https://forums.centos.org/viewtopic.php?t=53452
https://community.spiceworks.com/how_to/168683-cenos-7-encrypt-my-data-and-use-usb-key-for-unlock

以下为完整的操作步骤:

创建一个带有keyfile的usb盘

使用fat格式即可,这样在windows电脑上也能使用

先通过lsblk blkid命令,查看系统上的硬盘情况。

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 11.9G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 10.7G 0 part
└─luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6 253:0 0 10.7G 0 crypt
├─centos-root 253:1 0 9.5G 0 lvm /
└─centos-swap 253:2 0 1.2G 0 lvm [SWAP]
sdb 8:16 1 954M 0 disk
└─sdb1 8:17 1 954M 0 part /media
sr0 11:0 1 1024M 0 rom
1
2
3
4
5
6
7
8
[root@localhost ~]# blkid
/dev/sda1: SEC_TYPE="msdos" UUID="FC4C-1E93" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="dbf79d09-cbbf-4a09-8ac5-b997ae1c6dfd"
/dev/sda2: UUID="d4857a61-09d5-4768-b564-e3a12c2ca7d0" TYPE="xfs" PARTUUID="aa583022-7407-40dc-8f9e-1cb147dccd8b"
/dev/sda3: UUID="535d89c0-9b67-4138-a0f3-0879ef2a6cc6" TYPE="crypto_LUKS" PARTUUID="1e55ca3d-3636-4c37-8e27-d9bda13099a7"
/dev/sdb1: SEC_TYPE="msdos" LABEL="NEW" UUID="A06A-C2D3" TYPE="vfat"
/dev/mapper/luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6: UUID="nkQRNs-YN39-SR5g-Ge4r-jHNB-yfi4-PszeGt" TYPE="LVM2_member"
/dev/mapper/centos-root: UUID="e5859343-e19d-4cf3-9ef9-c86664a8cae3" TYPE="xfs"
/dev/mapper/centos-swap: UUID="045010bd-a926-4202-9467-6e54d110688d" TYPE="swap"

上面/dev/sda3为加密的磁盘,/dev/sdb1为U盘(FAT文件系统)。记下他们的uuid,分别为
535d89c0-9b67-4138-a0f3-0879ef2a6cc6A06A-C2D3

先挂载U盘,并创建相应的文件

1
2
3
4
5
6
7
8
9
mount /dev/sdb1 /media 
mkdir /media/cryptboot
cd /media/cryptboot

#创建一个keyfile到u盘中
dd if=/dev/urandom bs=4096 count=1 of=/media/cryptboot/boot.key

#把boot.key添加为解锁的密钥,会弹出 Enter any existing passphrase: 让你输入密码
cryptsetup luksAddKey /dev/sda3 /media/cryptboot/boot.key

测试下添加的密钥文件有没有成功:

1
2
3
[root@localhost ~]# cryptsetup luksOpen -v --key-file /media/cryptboot/boot.key --test-passphrase /dev/sda3
Key slot 1 unlocked.
Command successful.

出现上面命令就是成功了。

修改启动方式

1
2
cp /etc/default/grub /etc/default/grub.original
sed -i 's|rd.lvm.lv=centos/swap|rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3 rd.lvm.lv=centos/swap|g' /etc/default/grub

即是在 /etc/default/grub 中GRUB_CMDLINE_LINUX这一行添加 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3

下面是修改后的

1
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.luks.uuid=luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3 rd.lvm.lv=centos/swap rhgb quiet"

修改下文件/etc/dracut.conf

1
2
echo 'add_drivers+="vfat nls_cp437 nls_iso8859-1 ext4"' >> /etc/dracut.conf
echo 'omit_dracutmodules+="systemd"' >> /etc/dracut.conf

重新生成grub 和 initramfs

1
2
3
4
5
grub2-mkconfig -o /boot/grub2/grub.cfg

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

dracut --force -v

之前一直不成功的原因是,我的电脑 是uefi启动方式+GPT磁盘,所以应该使用 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg。这点很重要。

之后重启电脑就可以了。

列出被删除的文件

1
lsof | grep deleted

第2列是进程id,第4列是文件描述符

查看删除文件

1
ls -l /proc/进程id/fd/文件描述符

恢复文件

1
cp /proc/进程id/fd/文件描述符 Newfilename

mysql数据库删除恢复

使用上面的命令恢复文件后,发现mysql数据库只恢复了.ibd文件,.frm文件无法使用lsof恢复

使用其它的表结构,复制到数据库目录,或者重新创建一个表drop table tbl_name

1
ALTER TABLE tbl_name DISCARD TABLESPACE;

这个命令会删除相应的ibd文件。

从备份文件中复制ibd文件到数据库目录,然后执行下面的命令。

1
ALTER TABLE tbl_name IMPORT TABLESPACE;
0%