frp入门

server

我想不用做提示了,等我老了快进去的时候给我看我没准都能认识

1
docker run --restart=always --network host -d -v /root/frps/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps

frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[common]
# 监听端口
bind_port=7000

# 面板端口
dashboard_port=7500

# 登录面板账号设置
dashboard_user=root
dashboard_pwd=123456

# http https
vhost_http_port=7080
vhost_https_port=7081

# token
token=[token]

client

同上

1
docker run --restart=always --network host -d -v /etc/frp/frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc

frpc.ini

1
2
3
4
5
6
7
8
9
10
[common]
server_addr=sdadgz.cn
server_port=7000
token=[token]

[ssh]
type=tcp
local_ip=192.168.1.11 # 内网
local_port=3389 # 内网
remote_port=2288 # 公网

ZeroTier入门

第一个镜像

就离谱

1671259181647

启动命令

1
docker run -d --name ztncui -e HTTP_PORT=4000 -e HTTP_ALL_INTERFACES=yes -e ZTNCUI_PASSWD=[password] -p 4000:4000 keynetworks/ztncui

用户名:admin

添加网络,setup,ok

还有另外一个

1
docker run --name zerotier-moon -d -p 9993:9993 -p 9993:9993/udp -v /root/ztconf/:/var/lib/zerotier-one jonnyan404/zerotier-moon -4 [49.232.139.28]

看看你的

1
docker logs zerotier-moon

客户端cd到C:\ProgramData\ZeroTier\One输入刚才你看到的那个命令

测试

1
zerotier-cli listpeers

expire不生效

1
2
3
// 这个是假的,好像是用来加上一堆空格的方法 redisTemplate.opsForValue().set(key, value, timeout);
// 用没注释的这个
redisTemplate.opsForValue().set(key, value, Duration.ofSeconds(timeout));

他妈的这个配置文件怎么默认不是utf-8

进去把这个改了

1670519672459

创建文件加上小信息

file -> settings -> editor -> file and code templates -> includes -> file header -> [信息]

1
2
3
4
/**
* @author sdadgz
* @since ${DATE}
*/

idea数据库没提示

file -> settings -> languages & frameworks -> sql dialects

1679646768542

java启动项参数

1
2
3
4
5
6
java -Duser.timezone=GMT+8 -Dfile.encoding=UTF-8 -Dfml.queryResult=confirm -server -jar forge-1.7.10-10.13.4.1558-1.7.10-universal.jar nogui
# 参数解释
-Duser.timezone=GMT+8 # 时区
-Dfile.encoding=UTF-8 # 编码
-Dfml.queryResult=confirm # 我的世界mod冲突
-server # 提供服务优化 加上报错

类型转换,根据class类

他上面说了unchecked

1670858785357

用这个check一下吧,他check不对劲直接抛出异常了

1670859301338

字符串乱码转换

文件名编码多是ISO_8859_1

WR便利工具网-乱码恢复 (wrtools.top)

原来编码-> 目标编码 -> 结果

1
2
// 使用目标编码
filename = new String(param.getValue().getBytes(StandardCharsets.ISO_8859_1));

stream转数组

1
2
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer[] arr = list.stream().toArray(Integer[]::new);

NoClassDefFoundError

如果该类的一个所有静态变量或静态初始化块抛出了异常,该类也无法初始化。

链式最好不要拆开

拆开和合上是一样的

如果非要拆不做修改的放在前面

集合

singletonList

1
2
// 以下方法生成的List无法修改
Collections.singletonList(fastFile);

常用命令

1
.\jmeter -n -t test/test.jmx -l test/result.txt -e -o test/web

线程组

自带中文,配置文件修改永久中文

不测时候循环次数改0,回来接着测再改回来别再忘了

http请求默认值

  • 协议

  • 服务器名称或ip

  • 端口号

http信息头管理器

  • 键值对

http请求

  • http请求
  • 参数

查看结果树

聚合报告

响应断言

问题

大量Connection timed out: connect

  1. 注册表计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  2. 创建MaxUserPort 值 65534 十进制

  3. 重启

redis入门

依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置

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
package cn.sdadgz.web_springboot.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 连接,这逼东西得放第一位
template.setConnectionFactory(redisConnectionFactory);

// hash 用 string
template.setHashKeySerializer(RedisSerializer.string());
// key
template.setKeySerializer(RedisSerializer.string());

// 默认用json
// template.setDefaultSerializer(getRedisJsonSerializer());
template.setDefaultSerializer(RedisSerializer.json());

// 赋默认值
template.afterPropertiesSet();
return template;
}

// 废弃了,之前用自带的跑不了是因为没把连接放首位,用默认的就挺好的,我是废物
// // redis序列化用的json
// private static Jackson2JsonRedisSerializer<Object> getRedisJsonSerializer() {
// Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
// jackson2JsonRedisSerializer.setObjectMapper(getObjectMapper());
// return jackson2JsonRedisSerializer;
// }
//
// // ObjectMapper
// private static ObjectMapper getObjectMapper() {
// ObjectMapper objectMapper = new ObjectMapper();
// // 妈的不清楚ObjectMapper是个什么东西,他妈的能跑就完事了,反正我是废物
// objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
// return objectMapper;
// }

}

工具类

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package cn.sdadgz.web_springboot.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;

@Component
@Slf4j
public class RedisUtil {

// 自增带过期的默认值
public static final int DEFAULT_INCR_INT_VALUE = 1;

// 默认锁失效时间
public static final int DEFAULT_LOCK_TIMEOUT = 233;

@Resource
private RedisTemplate<String, Object> redisTemplate;

// 获取键
public Set<String> getKeys(String prefix) {
return redisTemplate.keys(prefix + "*");
}

// 取值
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}

// 类型转换取值
public <T> T get(String key, Class<T> t) {
Object o = get(key);
if (t.isInstance(o)) {
return t.cast(o);
}
return null;
}

// 设置值
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}

// 定时缓存
public void set(String key, Object value, long second) {
// redisTemplate.opsForValue().set(key, value, timeout);
redisTemplate.opsForValue().set(key, value, Duration.ofSeconds(second));
}

// 自增定时数据,首次创建定时
public void setIncrExp(String key, long timeout) {
// TODO 这样写太不讲究了,回头改了
setIncrExp(key, timeout, (k) -> log.info("创建自增定期键:{},过期时间{}秒", k, timeout));
}

// 同上,创建时带一个回调函数,不清楚是不是叫回调,回头从新看一遍java吧
public void setIncrExp(String key, long timeout, Consumer<String> consumer) {
if (GeneralUtil.isNull(get(key))) {
// 不存在创建
set(key, DEFAULT_INCR_INT_VALUE, timeout);
consumer.accept(key);
return;
}

// 存在直接自增
redisTemplate.opsForValue().increment(key);
}

// 设置过期时间
public Boolean expire(String key, long second) {
return redisTemplate.expire(key, Duration.ofSeconds(second));
}

// 获取hash
public Map<Object, Object> getHash(String key) {
return redisTemplate.opsForHash().entries(key);
}

// 获取hash
public Object getHash(String key, Object index) {
return redisTemplate.opsForHash().get(key, index);
}

// 获取hash 转类型
public <T> T getHash(String key, Object index, Class<T> clazz) {
return clazz.cast(getHash(key, index));
}

// 设置hash
public void setHash(String key, Object k, Object v) {
redisTemplate.opsForHash().put(key, k, v);
}

// 自增hash
public Long addHash(String key, Object k, long step) {
return redisTemplate.opsForHash().increment(key, k, step);
}

// 获取全部
public Set<Object> getSet(String key) {
return redisTemplate.opsForSet().members(key);
}

// 成员是否存在set
public Boolean getSet(String key, Object value) {
return redisTemplate.opsForSet().isMember(key, value);
}

public void setSet(String key, Object... value) {
redisTemplate.opsForSet().add(key, value);
}

// 删除key
public Boolean delKey(String key){
return redisTemplate.delete(key);
}

// 加锁
public Boolean lock(String key) {
return lock(key, DEFAULT_LOCK_TIMEOUT);
}

// 带过期的加锁
public Boolean lock(String key, long ms) {
return redisTemplate.opsForValue().setIfAbsent(key, System.currentTimeMillis(), Duration.ofMillis(ms));
}

// 释放锁
public Boolean unlock(String key){
return delKey(key);
}

}

测试

1
2
# 测试
ping

压测

1
2
# 100并发 10w请求
redis-benchmark -c 100 -n 100000 -a [password]

基础命令

切换数据库

1
2
# 默认16个数据库使用第0个
select 3

查看数据库大小

1
2
3
4
# 看看你有多(少)键
DBSIZE
# 看看你用了多少内存 返回值used_memory_human是 `以人类可读的格式返回 Redis 的内存消耗峰值` 笑死了,别人博客复制的
info memory

增删改查

1
2
3
4
5
# 查看所有键
keys *
# 删库跑路
flushdb # 单个
FLUSHALL # 全部

键值对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 新增键值对
set [key] [value]
setex [key] [expire_second] [value] # 带超时设置
setnx [key] [value] # 如果不存在,创建
mset [[key] [value]]... # 批量
msetnx [[key] [value]]... # setnx + mset, 具有原子性
# 获取键值对
get [key]
mget [key]...
# 获取并设置 - 返回旧值
getset [key] [value]

# 判断key存在
exists [key]
# 删除key
move [key] 1 # 1 -> 当前数据库
# 设置过期时间
expire [key] [second]
# 查看当前key剩余时间
ttl [key]
# 查看key类型
type [key]

数据类型

String(可以当Integer用?!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
### String ###
# 追加字符串 -> 返回长度
append [key] "[String]"
# 长度
strlen [key]
# substring - 左闭右闭
getrange [key] [fromIndex] [endIndex]
# replace - 闭
setrange [key] [fromIndex] [String]

### Integer ###
# i++
incr [key]
# i--
decr [key]
# i += [x]
incrby [key] [x]
# i -= [x]
decrby [key] [x]

List

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
### 增 ###
# 头插
lpush [key] [value]
# 尾插
rpush [key] [value]
#
linsert [key] ["atter"|"before"] [value] [insertValue]

### 删 ###
# 头删 -> 删的元素
lpop [key]
# 尾删 -> 被删元素
rpop [key]
# 删指定元素指定个数
lrem [key] [count] [value]
# substring - 左闭右闭
ltrim [key] [startIndex] [endIndex]

### 改 ###
#
lset [key] [index] [value]
# 他的屁股弄他头上
rpoplpush [fromList] [toList]

### 查 ###
# index -> element
lindex [key] [index]
# range - 左闭右闭
lrange [key] [fromIndex] [endIndex]
# length
llen [key]

Set

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
### 增 ###
#
sadd [key] [value]

### 删 ###
#
srem [key] [value]
# 随机删除
spop [key]

### 改 ###
# 移动到另一个集合
smove [fromKey] [toKey] [value]

### 查 ###
# 查全
smembers [key]
# 随机抽
srandmember [key]
srandmember [key] [count]
# exists
sismember [key] [value]
# length
scard [key]
集合间关系
1
2
3
4
5
6
# A - B1 - B2
sdiff [baseKey] [otherKey]...
# A ∩ B
sinter [key]...
# A ∪ B
sunion [key]...

hash(key - Map<String, String>)

举一反三吧我不想记了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 
hset [mapKey] [key] [value]
# 批量增
hmset [mapKey] [[key] [value]]...

#
hdel [mapKey] [key]...

#
hget [mapKey] [key]
# 批量查
hmget [mapKey] [key]...
# 查全
hgetall [mapKey]
# exists
hexists [mapKey] [key]
# 多少个键值对
hlen [mapKey]

# 举一反三
hincrby
hsetnx
...

zset(有序集合)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 
zadd [[key] [score] [value]]...

# 查 - 用到再差,笔记不全
zrangebyscore [key] [min] [max]

# 举一反三
zrange
zrem
zcard
zrevrange
zcount
...

geospatial地理位置

底层使用zset,可以用zset命令

1
2
3
4
5
6
7
8
9
10
11
# 添加
geoadd [key] [经度] [纬度] [value]
# 获取经纬度
geopos [key] [value]...
# 距离
geodist [key] [value] [otherValue] [单位]
# 附近的人 - 用到在查
georadius
georadiusbymember
geohash
...

hyperloglog计数,有误差

1
2
3
4
5
6
7
# 
pfadd [key] [value]...

# length
pfcount [key]
# 并集
pfmerge [resultKey] [key]...

bitmap统计

1
2
3
4
5
6
7
# 
setbit [key] [index] [0|1]

#
getbit [key] [index]
# count
bitcount [key]

事务

1
2
3
4
5
6
# 启动事务
multi
# 划句号
exec
# 跳车
discard

乐观锁watch

1
watch [key]

springboot

springboot发现你装redis了,所以就会用你的新欢代替他的默认缓存,他真的,我哭死

我原以为那是mybatis的二级缓存,没想到那个缓存是springboot的缓存,妈的认错人了

1
2
3
4
opsForValue // 操作字符串
opsForList // list
opsForSet // set
...
1
2
3
4
// 直接操控
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
connection.flushDb();
connection.flushAll();

消息队列?经典白学

我赌你的枪里没有子弹,如果我输了,我翻回去再看

1
2
3
subscribe
publist
...

集群经典白学

info replication查看当前库信息

1
2
3
4
5
6
7
# 找哥哥。用命令连接有点不讲究啊
slaveof [ip] [port]

# 配置文件写
replicaof [ip] [port]
# saber的master有密码
masterauth [password]

哨兵

1
2
3
4
5
6
7
8
9
# 配置文件.conf 1表示主机挂了投票选主机 从机自动,我哭死
sentinel monitor [name] [主机ip] [主机port] [1]
# 相信不加注释我也能看明白
port 26379
dir /tmp
sentinel auth-pass [name] [password]
# 30秒不接就是失踪
sentinel down-after-milliseconds [name] 30000
# 这个视频狗der都没说配置文件,估计是他也不会

重中之重

老游戏以兼容模式运行

mod冲突

1
sv_consistency 0

创意工坊角色语音包

闲话:

特殊情况之后语音包需要重装,但是原来的语音包没丢

解包工具

GCFScape 创意工坊解包

新方法

update文件夹不删,完了改里面对应sound

update改名,音频重构,改回来

最后一步

1
2
3
4
# (控制台)音频重构,这个是必须的
snd_rebuildaudiocache
disconnect
quit

角色对应文件夹

例:Left 4 Dead 2\left4dead2_dlc1\sound\player\survivor\voice

1669702023905

压缩文件

1
2
3
4
5
6
7
8
# 压缩
tar -czvf file.tgz source
# 解压
tar -xzvf file.tgz
# 分卷
split -d -b 200M nfs.tgz nfs.tgz.
# 合卷
cat nfs.tgz.* > nfs.tgz

备份服务器

  • 软链接
  • 文件夹权限 chmod +t data
  • 直接tgz解决所有烦恼

scp

  • -r:递归地复制整个目录和子目录。
  • -p:保留文件的权限和时间戳。
  • -q:安静模式,不显示进度和错误信息。
  • -v:显示详细的进度和错误信息。
  • -l:复制软链接。 # 不存在
  • -u:跳过已经存在的文件或比目标文件更新的文件。 # 不存在
  • -P:指定远程服务器的端口号,默认值是22。
  • -i:指定用于身份验证的私钥文件。
  • -C:对复制的数据进行压缩。
  • -S:指定用于加密和身份验证的加密程序。
1
2
# 常用命令
scp -Crp [source]... [target]

软链接

备份服务器时软链接不会拷贝过去

1
2
3
4
# 找软链接
find . -type l
# 手动链接
ln -s [target] [link]

看看还有多少内存可以压榨

1
free -m

看看还有多少外存

1
df -h

看看文件夹大小

1
du -sh /root

创建用户

1
2
3
4
5
adduser [username]
# 手动创建 .ssh 文件加和 authorized_keys 文件
# 公钥仍里头
# 重启sshd
service sshd restart

看看文件夹里面有多少文件,不包括文件夹

1
ls -l |grep "^-"|wc -l

升级内核

他妈的找半天问题结果是内核版本过低,他妈的

内核下载

非常喜欢这种CTRL+F就能找到自己想要的信息的网站

下谁呢?

  • linux-image-X.Y.Z-generic-*.deb
  • linux-modules-X.Y.Z*-generic-*.deb
1
2
3
4
5
6
# 安装
dpkg --install *.deb
# 重启
reboot
# 检查
uname -r

起别名

Ubuntu的 /root/.bashrc

1
2
alias ll='ls -al'
alias cd='rm -rf'

看看文件夹多大

1
du -h --max-depth=1 ./*

ssh连接

客户端

config

1
2
3
4
5
# config文件名字加双引号
Host "02"
HostName 49.232.139.28
User root
IdentityFile ~/.ssh/ssh

创建密钥对

1
ssh-keygen

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
# ssh配置文件
sudo vim /etc/ssh/sshd_config
# 配置文件
PermitRootLogin yes #允许Root登录
PubkeyAuthentication yes #使用秘钥登录
#PasswordAuthentication no #使用密码登录
ClientAliveInterval 120 #表示每隔120秒向客户端发送一个“空包”,以保持于客户端的连接。
ClientAliveCountMax 720 #表示总共发送720次“空包”,之后断开它们之间的连接,也就是:120秒 × 720 = 86400 秒 = 24小时 后。
UseDNS no # ssh卡了,关了不卡了
# 重启sshd
service sshd restart
# 公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCD8YuUC/B3Fs7kf573PjYIoiQ6DfKZPeH9KOuQ63wSIikNl0JVjgjcaYo+ciEUuWnqRj67eHkPU9ypoh5hexz2RTgfDuWfdpfEUL4Gu3IZvzQsXdWqDYox23z96nVPIYXj7nHpS6qYdrf8BWJMZzKNp6M0ItBkmZ9yqSBVJeBw42oKy3STr8xhX5tdIVAzBGLRrr2PjFAHFBZWm8fVj78saGFxET6vwF0gYlyltnAcMkehj0DsDzSlLkOIMLZVsXo2EYzFATosGE2xBLK76rAh88+XxxxWeUeuGd+MOmFuJ9mOnjmuIXNC3mavwMVcwVd4ly9UgdlxMHwPbGVOG45ZJ5MHfcfl0svGsFhUXp8E14Uixdh8BU8UCEwEMPm+vmYQMoDK23SLGhte6loZuECZf8j8Fs1XYWqgDAnyKUB7EurRFYVRLC/q4Xwk+GT4Lstr/oH+i58fw83i4uMEfaYlMLky1R53/VGb/kZY5qHfV7l0qLsoodZRKvKtKE8ld8= 02@DESKTOP-2AV1H2V

软件包

降版本

1
2
3
4
5
6
# 看看版本
apt-cache policy [package_name]
# 回退版本
apt install [package_name]=[package-version-number]
# 禁用更新
apt-mark hold [package_name]

服务器玩宕机乐

  1. 进入救援模式
  2. mkdir /mnt/vm1 创建挂载点
  3. cd /dev 看设备有一栏是disk的
  4. mount /dev/vda1 /mnt/vm1 挂载上,多试几个
  5. 一顿操作修好乐
  6. 退出救援模式
1
2
mkdir /mnt/vm1
mount /dev/vda2 /mnt/vm1

apt换源

/etc/apt/sources.list 打开,改好了输sudo apt-get update apt upgrade

还得是腾讯,服务器上的文件扒下来不能用

1
2
3
4
5
6
7
8
9
10
11
12
13
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

拓展磁盘大小

前置:VMware拓展磁盘

1
2
3
4
5
6
7
8
# 查看磁盘信息
fdisk -l
# 拓展
lvextend -L +10G /dev/mapper/ubuntu--vg-ubuntu--lv
# 刷新
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
# 不行再试另一个刷新
xfs_growfs /dev/mapper/ubuntu--vg-ubuntu--lv

自启动脚本

以校园网自动登录为例

1
2
3
4
# login.sh U、P是变量,U是学号P是密码
U=20141308100
P=073513 curl
'https://login.sjzc.edu.cn/drcom/login?callback=dr1004&DDDDD='$U'&upass='$P'&0MKKey=123456&R1=0&R3=0&R6=0¶=00&v6ip=&v=6087' -H 'Host: 210.31.250.87' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' -H 'Accept: */*' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' --compressed -H 'Referer: http://210.31.250.87/a79.htm' -H 'Cookie: PHPSESSID=nok6k05sdodv5ufo6khocudgar' -H 'Connection: keep-alive'

启动

1
echo sh [/root/init/03-login.sh] start >>/etc/rc.local