零碎笔记

汗流浃背

yum update

不要轻易使用yum update命令
出现一大堆“conflicts with file from package”,没找到有用的解决方案,最后重装系统
yum update有什么风险?

好像这是aliOS特定的问题,yum update -y在aliOS上可能导致yum不可用

chatgpt介绍yum

为什么国内互联网公司喜欢用Centos而不是Ubuntu/Debian?

复制命令时记得使用bash而不是其他的shell(例如fish),不同的shell命令格式不一样

spdk in femu

使用femu模拟zns ssd,在虚拟机中使用spdk,出现aer错误

1
2
3
4
5
6
7
8
9
10
11
12
13
2024-03-11 15:27:02.036029] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036044] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036055] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036065] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036077] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036086] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036098] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036111] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036120] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036137] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036150] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036160] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed
[2024-03-11 15:27:02.036176] bdev_nvme.c:5074:aer_cb: *WARNING*: AER request execute failed

问题的原因即femu并没有实现zns admin的命令

1
2
3
4
5
6
7
static uint16_t zns_admin_cmd(FemuCtrl *n, NvmeCmd *cmd) {
switch (cmd->opcode) {
default:
femu_err("zns_admin_cmd fallout cmd->opcode %x %d\n", cmd->opcode, cmd->opcode);
return NVME_INVALID_OPCODE | NVME_DNR;
}
}

spdk aer的相关代码

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
* Signature for callback function invoked when an asynchronous event request
* command is completed.
*
* \param aer_cb_arg Context specified by spdk_nvme_register_aer_callback().
* \param cpl Completion queue entry that contains the completion status
* of the asynchronous event request that was completed.
*/
typedef void (*spdk_nvme_aer_cb)(void *aer_cb_arg,
const struct spdk_nvme_cpl *cpl);

/**
* Register callback function invoked when an AER command is completed for the
* given NVMe controller.
*
* \param ctrlr Opaque handle to NVMe controller.
* \param aer_cb_fn Callback function invoked when an asynchronous event request
* command is completed.
* \param aer_cb_arg Argument passed to callback function.
*/
void spdk_nvme_ctrlr_register_aer_callback(struct spdk_nvme_ctrlr *ctrlr,
spdk_nvme_aer_cb aer_cb_fn,
void *aer_cb_arg);


spdk_nvme_ctrlr_register_aer_callback(ctrlr, aer_cb, nvme_ctrlr);

static void
aer_cb(void *arg, const struct spdk_nvme_cpl *cpl)
{
struct nvme_ctrlr *nvme_ctrlr = arg;
union spdk_nvme_async_event_completion event;

if (spdk_nvme_cpl_is_error(cpl)) {
SPDK_WARNLOG("AER request execute failed\n");
return;
}

event.raw = cpl->cdw0;
if ((event.bits.async_event_type == SPDK_NVME_ASYNC_EVENT_TYPE_NOTICE) &&
(event.bits.async_event_info == SPDK_NVME_ASYNC_EVENT_NS_ATTR_CHANGED)) {
nvme_ctrlr_populate_namespaces(nvme_ctrlr, NULL);
} else if ((event.bits.async_event_type == SPDK_NVME_ASYNC_EVENT_TYPE_NOTICE) &&
(event.bits.async_event_info == SPDK_NVME_ASYNC_EVENT_ANA_CHANGE)) {
nvme_ctrlr_read_ana_log_page(nvme_ctrlr);
}
}

到调用AER代码的最高层,修改一行代码,状态机跳过 NVME_CTRLR_STATE_CONFIGURE_AER状态

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
30
31
32
33
34
35
36
37
38
39
40
41
42
	// nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_CONFIGURE_AER,
// ctrlr->opts.admin_timeout_ms);
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_SET_KEEP_ALIVE_TIMEOUT,
ctrlr->opts.admin_timeout_ms);

case NVME_CTRLR_STATE_CONFIGURE_AER:
rc = nvme_ctrlr_configure_aer(ctrlr);
break;

case NVME_CTRLR_STATE_SET_KEEP_ALIVE_TIMEOUT:
rc = nvme_ctrlr_set_keep_alive_timeout(ctrlr);
break;


static void
nvme_ctrlr_configure_aer_done(void *arg, const struct spdk_nvme_cpl *cpl)
{
struct nvme_async_event_request *aer;
int rc;
uint32_t i;
struct spdk_nvme_ctrlr *ctrlr = (struct spdk_nvme_ctrlr *)arg;

if (spdk_nvme_cpl_is_error(cpl)) {
NVME_CTRLR_NOTICELOG(ctrlr, "nvme_ctrlr_configure_aer failed!\n");
ctrlr->num_aers = 0;
} else {
/* aerl is a zero-based value, so we need to add 1 here. */
ctrlr->num_aers = spdk_min(NVME_MAX_ASYNC_EVENTS, (ctrlr->cdata.aerl + 1));
}

for (i = 0; i < ctrlr->num_aers; i++) {
aer = &ctrlr->aer[i];
rc = nvme_ctrlr_construct_and_submit_aer(ctrlr, aer);
if (rc) {
NVME_CTRLR_ERRLOG(ctrlr, "nvme_ctrlr_construct_and_submit_aer failed!\n");
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_ERROR, NVME_TIMEOUT_INFINITE);
return;
}
}
nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_SET_KEEP_ALIVE_TIMEOUT, ctrlr->opts.admin_timeout_ms);
}

文件系统超级块损坏

在进行f2fs实验时,报以下错误

1
2
3
4
5
6
7
8
[89042.232345] EXT4-fs warning: 5 callbacks suppressed
[89042.232347] EXT4-fs warning (device nvme0n1p2): ext4_dirblock_csum_verify:405: inode #2: comm git: No space for directory leaf checksum. Please run e2fsck -D.
[89042.232350] EXT4-fs error: 5 callbacks suppressed
[89042.232351] EXT4-fs error (device nvme0n1p2): __ext4_find_entry:1693: inode #2: comm git: checksumming directory block 0
[89042.232577] EXT4-fs warning (device nvme0n1p2): ext4_dirblock_csum_verify:405: inode #2: comm git: No space for directory leaf checksum. Please run e2fsck -D.
[89042.232579] EXT4-fs error (device nvme0n1p2): __ext4_find_entry:1693: inode #2: comm git: checksumming directory block 0
[89042.232796] EXT4-fs warning (device nvme0n1p2): ext4_dirblock_csum_verify:405: inode #2: comm git: No space for directory leaf checksum. Please run e2fsck -D.
[89042.232798] EXT4-fs error (device nvme0n1p2): __ext4_find_entry:1693: inode #2: comm git: checksumming directory block 0

文件系统被挂载为只读

1
2
/dev/nvme0n1p2 on / type ext4 (ro,relatime,errors=remount-ro)
/dev/nvme0n1p2 on /var/snap/firefox/common/host-hunspell type ext4 (ro,noexec,noatime,errors=remount-ro)

当时没怎么管,直接重启电脑,因为我的f2fs实验并未涉及根目录盘,以为没太大关系

而后电脑一开机就进BIOS,无法进入Ubuntu,使用rufus用U盘刻录启动盘,在另一个盘上安装Ubuntu后,尝试修复该固态盘,使用fsck显示ext2fs_open2: Bad magic number in super-block,,dump2fs mke2fs使用备份超级块也是同样的问题,而后使用dd命令将一个盘的数据完全拷贝至另一个盘,询问ChatGPT是否有其余修复软件,找到了testdisk,询问相关步骤,答案如下:

使用TestDisk来尝试修复损坏的ext4超级块或恢复分区的步骤如下。请注意,TestDisk更多地用于恢复丢失的分区,而不是直接修复超级块,但如果文件系统结构受损,这可能有助于恢复访问数据。

  1. 安装TestDisk:如果你还没有安装TestDisk,首先需要安装它。在大多数Linux发行版中,你可以通过包管理器来安装。例如,在Ubuntu或Debian上,你可以使用以下命令安装:

    1
    2
    sqlCopy codesudo apt-get update
    sudo apt-get install testdisk
  2. 启动TestDisk:安装完成后,以root用户身份启动TestDisk。这可以通过在终端中输入sudo testdisk来完成。

  3. 创建日志文件:启动后,TestDisk会询问是否创建一个日志文件。通常,选择Create来创建日志文件是一个好主意,这样你可以保留所有操作的记录。

  4. 选择磁盘TestDisk将显示系统上所有可用的磁盘。使用上下键选择包含损坏的ext4文件系统的磁盘,然后按Enter键。

  5. 选择分区表类型:接下来,选择你的磁盘使用的分区表类型。对于大多数现代Linux系统,TestDisk通常会自动检测到正确的类型,比如EFI GPTIntel。确认后,选择Proceed

  6. 选择[Advanced] 文件系统工具:在主菜单中,选择[Advanced] Filesystem Utils来尝试修复文件系统或恢复分区。

  7. 选择分区:选择受损的分区,然后选择[Type]来改变文件系统类型(如果TestDisk没有正确检测)或者直接进入[Boot][Superblock]来尝试恢复。

  8. 备份超级块修复:如果你的目的是尝试从备份恢复超级块,TestDisk可以显示备份超级块的信息。在[Advanced]选项中,选择受损分区后,查找并选择[Superblock]来获取备份超级块的信息。

  9. 按照TestDisk的指示操作TestDisk可能会提供使用备份超级块恢复的命令。通常,这将是一个fsck命令,使用备份超级块的位置作为参数。

  10. 执行恢复命令:根据TestDisk提供的信息,在终端中手动执行fsck命令。例如:

    1
    sudo fsck -b <备份超级块位置> /dev/sdXn

    替换<备份超级块位置>/dev/sdXn为实际值。

请注意,数据恢复过程可能涉及风险,可能会导致数据丢失。在执行任何操作之前,请确保你有数据的完整备份。如果可能的话,最好是在磁盘的克隆上进行操作,而不是原始磁盘。如果你不确定自己在做什么,或者数据非常重要,考虑寻求专业的数据恢复服务。

选择分区时刚开始没有分区,进了analyse选项后分析一通才出现了linux分区,选择写入后再进去修复超级块,显示的备份超级块和mke2fs得到的不同,再次执行fsck命令但使用这里给出的备份块,选择-y全部填yes,成功修复! 将固态盘随便挂载到一个目录下,在lost+found目录下有一堆奇奇怪怪数字的目录,通过find目录找到了我的一个文件路径,继而知道哪一个奇怪数字就是root目录,将对应的数据拷贝处理,操作成功,满头大汗!

Bad magic number in super-block

Linux: Recover Corrupted Partition From A Bad Superblock

github加速网站

GitHub520

matplotlib中文乱码

matplotlib中文乱码的两种解决方案

1
2
3
4
5
6
7
第一步,把SimHei.ttf文件拷贝到ttf文件夹
第二步,修改matplotlibrc文档
第三步 from matplotlib.font_manager import _rebuild我报错了,删除缓存替代
#删除缓存
import matplotlib
print(matplotlib.get_cachedir())
rm -rf 缓存路径

若用plt.rcParams[‘font.sans-serif’] = [‘Times New Roman’] #指定默认字体,再输出中文将无法显示

spdk

spdk应用程序启动时默认监听本地套接字/var/tmp/spdk.sock,rpc.py通过套接字与应用程序通信,其中spdk app可以通过-r选项指定监听套接字,rpc.py可以通过-s指定连接套接字

1
2
3
4
5
6
7
# applications.md
The SPDK application framework defines a set of base command line flags for all
applications that use it. Specific applications may implement additional flags.
-r --rpc-socket string /var/tmp/spdk.sock RPC listen address
# rpc.py
parser.add_argument('-s', dest='server_addr',
help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock')
1
2
3
spdk_log_set_flag("all");
spdk_log_set_print_level(SPDK_LOG_DEBUG);
opts.print_level = SPDK_LOG_DEBUG;

k8s

推荐网站/B站视频:
Kubernetes(K8S)简介

部署Kubernetes(k8s)时,为什么要关闭swap、selinux、firewalld?

docker service start failed
docker正常安装成功,但是启动服务报错Failed to startDocker……Engine
文章使用了和我一样的方法,使用dockerd命令查看服务启动失败的原因,systemctl status docker.service的信息没有任何帮助,只不过我的问题是/etc/docker/daemon.json中报unknow option错误,删掉该选项即可

Kubernetes k8s拉取镜像失败最简单最快最完美解决方法 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver

使用类似的脚本提前拉取好了docker镜像,但一个节点一直显示not ready

1
2
3
4
5
6
7
8
9
10
11
# 简要查看各个节点状态
kubectl get nodes -o wide
kubectl describe node master
kubectl describe node node1
kubectl describe node node2
# 查看pod状态发现kube-flannel未ready
kubectl get pod -A
# 查看该pod状态发现pause未安装(与已安装的pause的版本不一致)
kubectl describe pod kube-flannel-ds-wsrfr -n kube-flannel
# 使用脚本下载所需的pause版本

污点和容忍度

systemctl status kubelet
kubeadm介绍

ssh设置了公钥登录但仍然需要输入密码

对应用户的.ssh文件夹,authorized_keys权限有问题

1
2
3
chmod go-w /home/user
chmod 700 /home/user/.ssh
chmod 600 /home/user/.ssh/authorized_keys

SSH配置公钥后仍需要输入密码问题解析
SSH Authentication Refused: Bad Ownership or Modes for Directory

patch & diff

linux内核打补丁和制作补丁

1
2
diff -Nur a.c b.c > ./patch.test
patch -p0 a.c < patch.test

这些东西内容较少,单独写个博客觉得有点奇怪,故全放在一起记录

Openkylin安装crash

Ubuntu 软件仓库镜像使用帮助
Certificate verification failed: The certificate is NOT trusted.
解决:选项是否使用 HTTPS 选择否

public key is not available: NO_PUBKEY 3F01618A51312F3F
解决:apt-key adv –recv-keys –keyserver keyserver.ubuntu.com 3B4FE6ACC0B21F32

crash参考
Kernel crash dump
安装完linux-crashdump重启即可
内核调试工具crash使用

docker安装与简单使用

安装:如何在 Ubuntu 20.04 上安装和使用 Docker

1
2
3
4
5
6
7
sudo apt update # 更新软件包索引
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common # 安装必要的依赖软件,来添加一个新的 HTTPS 软件源
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 导入源仓库的 GPG key
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" # 将 Docker APT 软件源添加到你的系统
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
docker container run hello-world

containerd.io - daemon to interface with the OS API (in this case, LXC - Linux Containers), essentially decouples Docker from the OS, also provides container services for non-Docker container managers
docker-ce - Docker daemon, this is the part that does all the management work, requires the other two on Linux
docker-ce-cli - CLI tools to control the daemon, you can install them on their own if you want to control a remote Docker daemon


史上最全Docker初学者命令大全
Docker安装及换源 本人未换源

nginx简单测试:linux的docker下安装nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
//docker拉取ngnix
docker pull nginx

//运行nginx 以80端口运行
docker run --name=nginx -p 8083:80 -it nginx:latest

//查看正在运行的镜像
docker ps

//使用curl/wget访问
curl 192.168.252.135:8083
wget 192.168.252.135:8083



开启另一个docker,访问当前docker nginx服务

1
2
3
4
docker run --name=nginx2 -p 8084:80 -it nginx:latest /bin/bash
apt update
apt install wget
wget 192.168.252.135:8083


删除所有容器,完成测试

1
docker rm -f $(docker ps -aq)

Could not resolve ‘mirrors.aliyun.com‘

DNS配置文件位置:

1
2
3
4
5
6
7
8
# /etc/resolv.conf

cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

nameserver 8.8.8.8
nameserver 8.8.4.4

ubuntu 在换源过程中遇到的坑:Could not resolve ‘mirrors.aliyun.com‘

pip换源

最近用清华源安装python第三方库时,总是显示超时,即使设置了超时参数也无济于事,故打算给pip换个阿里源,在用户目录/pip/pip.ini中设置了镜像源后,pip仍然使用的是清华源,使用命令

1
pip -v config list

发现在其他位置还有一个配置文件,覆盖了用户目录的配置,导致设置失败。
将pip换成阿里源后,就没出现超时问题了
国内镜像链接
pip配置文件读取规则

vue ui

1
vue ui

命令真的好用!,既可以创建vue项目,也可以运行调试vue项目

vue-cli安装3版本,可以避免很多错误
element-ui组件库不支持4版本,main.js中的写法改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';

Vue.use(ElementUI);

new Vue({
el: '#app',
render: h => h(App)
});


import { createApp } from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import './plugins/element.js'


createApp(App).use(ElementUI).mount('#app')

1
2
3
4
安装vue-cli4
cnpm install -g @vue/cli
安装vue-cli3
cnpm install -g @vue/cli@3.0.4

xxx:2.0.4.RELEASE’ not found

在使用spring boot创建应用时,时常会出现找不到xxx:2.0.4.RELEASE’ not found文件的情况,假设使用的是下列的maven源文件
maven阿里源文件

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

<pluginGroups />
<proxies />
<servers />

<!-- maven自动下载的jar包,会存放到该目录下 -->
<localRepository>D:/maven/repository</localRepository>
<profiles>
<profile>
<id>spring plugins</id>

<activation>
<jdk>spring plugins</jdk>
</activation>

<pluginRepositories>
<pluginRepository>
<id>spring plugins</id>
<name>Spring plugins</name>
<url>https://maven.aliyun.com/repository/spring-plugin</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
<mirror>
<id>ibiblio</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>
</mirror>
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>google-maven-central</id>
<name>Google Maven Central</name>
<url>https://maven-central.storage.googleapis.com
</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- 中央仓库在中国的镜像 -->
<mirror>
<id>maven.net.cn</id>
<name>oneof the central mirrors in china</name>
<url>http://maven.net.cn/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

</settings>

则可以在https://maven.aliyun.com/mvn/search中查找可用的版本

上图查看central中

1
2
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>

的可用版本,
随后的pom文件安装在目录

D:\maven\repository\org\springframework\boot\spring-boot-starter-parent

Windows 搭建 opengrok总结

我参照博客Windows 搭建 opengrok安装opengrok。
步骤:
1 安装JDK并配置Java环境变量
2 安装tomcat
3 安装opengrok
4 安装ctags
5 配置opengrok
6 配置Tomcat
7 运行
问题:
在配置opengrok时运行

1
java -Xmx524m -jar D:\opengrok-1.7.13\lib\opengrok.jar -W D:\opengrok-1.7.13\data\configuration.xml -P -S -v -s D:\opengrok-1.7.13\source -d D:\opengrok-1.7.13\data

出现java.lang.UnsupportedClassVersionError错误,即版本不一致,我电脑上java版本为1.8,而opengrok-1.7.13需要java版本超过11,故需要在电脑上安装高版本的java。参照博客WebService程序(电脑上安装两个版本的java)安装了java13后运行成功。
另外将war文件拷贝过去后需要运行tomcat才会有source文件夹。

mathtype宏位置

在解决MathPage.wll或MathType.dll文件找不到问题时,教程里说将添加信任位置

1
C:\Program Files\Microsoft Office\Office14\STARTUP

但在差不多的位置却找不到这个文件夹
后面发现STARTUP文件夹在

1
C:\Program Files\Microsoft Office\root\Office16\STARTUP

教程

tomcat编码问题

用startup.bat运行tomcat时,中文总是显示乱码,故想修改一下cmd的编码,在通过修改注册表修改cmd的默认编码后(博客),tomcat运行还是乱码,故修改tomcat的输出编码(博客

ubuntu关闭自动更新

1
sudo apt remove unattended-upgrades

中级篇——ubuntu系统关闭unattended upgrades无人值守更新功能
【Ubuntu】解决 error: dpkg frontend is locked by another process

zerotier libssl.so.1.1

按照zerotier官网安装

1
2
curl -s https://install.zerotier.com | sudo bash

sudo zerotier-cli info时报错,zerotier-cli: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
实际上有3个动态库版本对不上:libssl.so.1.1,libstdc++.so.6,libcrypto.so.1.1。这些版本都太高了,懒得一个一个更新

后通过下载历史版本link,选择下载1.6.0版本的deb文件,dpkg -i安装软件,问题解决!

https://download.zerotier.com/RELEASES/1.6.0/dist/debian/bionic/

麒麟系统上编译32位程序

麒麟系统架构为aarch64,需要编译32 arm程序
刚开始一直找交叉编译工具,即x86->arm,方向找错了
gcc -m32选项无效,-march也没啥用,看网上的回答说要用arm-linux-gnueabihf-gcc进行编译
apt search arm-linux
选择其中的GNU c compiler 下载

1
sudo apt install gcc-arm-linux-gnueabi

但显示libc6-armel-cross未安装,而libc6-armel-cross无法安装
网站下载gcc-arm-11.2-2022.02-aarch64-arm-none-linux-gnueabihf.tar.xz,但glibc版本太高,这些都是基于GCC 11.2,无法找到其历史版本。

最终解决方案:
首先根据网页信息,修改/etc/apt/sources.list里面的源,详见:
https://developer.aliyun.com/mirror/ubuntu-ports?spm=a2c6h.13651104.0.0.3a7b94ddis3PQ6
修改以后的文件内容如下图所示:
请添加图片描述
随后执行:

1
2
3
4
sudo apt install apt-transport-https  # apt 支持https
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-gcc hello.c

编译以后效果如下:
请添加图片描述
arm-linux-gnueabihf-gcc和arm-linux-gnueabi-gcc的区别

gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
可见这两个交叉编译器适用于armel和armhf两个不同的架构, armel和armhf这两种架构在对待浮点运算采取了不同的策略(有fpu的arm才能支持这两种浮点运算策略)

gnueabi和gnueabihf区别

时不时用到的博客

Windows下右键新建.md文件教程(转)
如何编译 Linux 内核
Ubuntu Linux内核版本升级或降级到指定版本(基于ubuntu 18.04示例)
Ubuntu 软件仓库镜像使用帮助
清华镜像站 内核源码
如何在Markdown文档中插入空格?
VMware虚拟机扩展磁盘容量
内核源码查找网站
Multi-Queue Block IO Queueing Mechanism (blk-mq)

时不时用到的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Ctrl+a跳到本行的行首 
cat /proc/version
Linux version 5.4.0-148-generic (buildd@lcy02-amd64-112) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #165-Ubuntu SMP Tue Apr 18 08:53:12 UTC 2023

cat /proc/meminfo

ls /proc/sys/kernel
acct ftrace_enabled modules_disabled overflowgid poweroff_cmd sched_migration_cost_ns shmmax unprivileged_bpf_disabled
acpi_video_flags hardlockup_all_cpu_backtrace msgmax overflowuid print-fatal-signals sched_min_granularity_ns shmmni unprivileged_userns_apparmor_policy
auto_msgmni hardlockup_panic msgmnb panic printk
sysctl -a | grep "kernel"
ls | grep watchdog | xargs cat
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

ssh-keygen -t rsa

设置ssh远程登录及公钥登录登录
安装ssh相关服务

1
sudo apt-get install openssh-client openssh-server 

修改ssh配置文件/etc/ssh/sshd_config

1
2
3
4
Port 22
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication yes

将公钥添加到authorized_keys中

1
2
3
4
5
gedit pub # 复制粘贴宿主机公钥
mkdir ~/.ssh # 其中~为你想用公钥登录的用户目录,我直接在root用户下创建
cat pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
sudo service sshd restart

解决思路

多在github上找代码解决方案,在知网博客中找文档编写方法

有时可以使用对照法,首先一个模块,观察效果,而后去除该模块,观察效果

博主推荐

面向信仰编程:https://draveness.me/
Docker 核心技术与实现原理
谈 Kubernetes 的架构设计与实现原理

博客推荐

聊聊Linux中线程和进程的联系与区别!
Linux进程: task_struct结构体成员
深入浅出分析LSM树(日志结构合并树)
Linux系统内存管理

知乎回答

进入内核态究竟是什么意思?
Linux内核页表的建立
页表到底是保存在内核空间中还是用户空间中?
怎么理解linux内核栈?

书籍推荐

数据密集型应用设计:https://github.com/Vonng/ddia

现今,尤其是在互联网领域,大多数应用都属于数据密集型应用。本书从底层数据结构到顶层架构设计,将数据系统设计中的精髓娓娓道来。其中的宝贵经验无论是对架构师、DBA、还是后端工程师、甚至产品经理都会有帮助
这也是一本深入浅出的书,讲述概念的来龙去脉而不是卖弄定义,介绍事物发展演化历程而不是事实堆砌,将复杂的概念讲述的浅显易懂,但又直击本质不失深度。每章最后的引用质量非常好,是深入学习各个主题的绝佳索引。
本书为数据系统的设计、实现、与评价提供了很好的概念框架。读完并理解本书内容后,读者可以轻松看破大多数的技术忽悠,与技术砖家撕起来虎虎生风🤣。

C++:Effective c++,Effective STL,Effective modern c++
C++: 深度探索C++对象模型,C++沉思录,C++语言的设计与演化
C:C和指针 ,C陷阱与缺陷,C专家编程
linux内核:linux内核设计与实现,深入理解linux内核
算法:王道考研机试指南

网站推荐

  1. 名校公开课程评价网
    这个项目整合了大家对于高质量公开课程的评价、总结、与建议等等,期望这些评价能对后来的同学在选择、学习课程的时候能有一些帮助。

  2. 计算机教育中缺失的一课
    其实就是名校公开课程评价网中的MIT6.NULL实用工具介绍

  3. LABULADONG 的算法网站

  4. GPT逸事