Giter VIP home page Giter VIP logo

quickbackupm's Introduction

QuickBackupM

Tip

如果需要更为先进完善的备份解决方案,你可以看看 Prime Backup 插件

English

一个支持多槽位的快速备份&回档插件

master 分支为中文版,english 分支为英文版

需要 v2.0.1 以上的 MCDReforged

snapshot

备份的存档将会存放至 qb_multi 文件夹中,文件目录格式如下:

mcd_root/
    server.py

    server/
        world/

    qb_multi/
        slot1/
            info.json
            world/

        slot2/
            ...
        ...

        overwrite/
            info.txt
            world/

命令格式说明

!!qb 显示帮助信息

!!qb make [<comment>] 创建一个储存至槽位 1 的备份,并将后移已有槽位。<comment> 为可选存档注释

!!qb back [<slot>] 回档为槽位 <slot> 的存档。

!!qb del <slot> 删除槽位 <slot> 的存档。默认为槽位 1

!!qb rename <slot> <comment> 修改槽位 <slot> 的注释,即重命名这一槽位

!!qb confirm 在执行 back 后使用,再次确认是否进行回档

!!qb abort 在任何时候键入此指令可中断回档

!!qb list 显示各槽位的存档信息

!!qb reload 重新加载配置文件

<slot> 未被指定时默认选择槽位 1

配置文件选项说明

配置文件为 config/QuickBackupM.json。它会在第一次运行时自动生成

slots

默认值:

"slots": [
    {
        "delete_protection": 0
    },
    {
        "delete_protection": 0
    },
    {
        "delete_protection": 0
    },
    {
        "delete_protection": 10800
    },
    {
        "delete_protection": 259200
    }
]

每个槽位被保护不被覆盖的秒数。设置为 0 则表示不保护

该列表的长度也决定了槽位的数量

在默认值中,一共有 5 个槽位,其中前三个槽位未设置保护时间,第四个槽位会被保护三个小时(3 * 60 * 60 秒),第五个槽位会被保护三天

请保证保护时间是随着槽位序号单调不下降的,也就是第 n 给个槽位的保护时间不能大于第 n + 1 个槽位的保护时间,否则可能有未定义的行为

由旧的 QuickBackupM 插件创建的备份不支持这个特性

size_display

默认值: true

查看备份列表是否显示占用空间

turn_off_auto_save

默认值: true

是否在备份时临时关闭自动保存

enable_copy_file_range

默认值: false

使用 os.copy_file_range 进行文件的复制

在某些文件系统中,它会使用基于写时复制(copy-on-write)的 reflink 技术,从而极大地提升复制速度

需求:

  • Linux 平台
  • Python >= 3.8
  • 选项 backup_formatplain

concurrent_copy_workers

默认值:0

参考值:0, 2, 4

复制文件时的并行度,当其值为 n 时,QBM 将使用 n 线程并行复制文件

当使用 SSD 或其他高 IO 性能的存储设备时,开启并行复制可以有效提升复制的速度,但 CPU、磁盘负载也会显著增加

设为 0 以关闭并行复制

需求:

  • 选项 backup_formatplain

ignored_files

默认值:

"ignored_files": [
    "session.lock"
]

在备份时忽略的文件名列表,默认仅包含 session.lock 以解决 session.lock 被服务端占用导致备份失败的问题

若文件名字符串以 * 开头,则将忽略以指定字符串结尾的文件,如 *.test 表示忽略所有以 .test 结尾的文件,如 a.test

若文件名字符串以 * 结尾,则将忽略以指定字符串开头的文件,如 temp* 表示忽略所有以 temp 开头的文件,如 tempfile

saved_world_keywords

默认值:

"saved_world_keywords": [
    "Saved the game",
    "Saved the world"
]

用于识别服务端已保存完毕存档的关键词

如果服务器的输出与任何一个关键词相符,则认为存档已保存完毕,随后插件将开始复制存档文件

backup_path

默认值: ./qb_multi

备份储存的路径

server_path

默认值:./server

服务端文件夹的路径。./server 即为 MCDR 的默认服务端文件夹路径

overwrite_backup_folder

默认值: overwrite

被覆盖的存档的备份位置,在配置文件均为默认值的情况下路径为 ./qb_multi/overwrite

world_names

默认值:

"world_names": [
    "world"
]

需要备份的世界文件夹列表,原版服务端只会有一个世界,在默认值基础上填上世界文件夹的名字即可

对于非原版服务端如水桶、水龙头服务端,会有三个世界文件夹,此时可填写:

"world_names": [
    "world",
    "world_nether",
    "world_the_end"
]

如果指定的世界名指向了一个符号链接文件, 则该链接文件指向的最终实际世界文件夹,以及中途所有解引用出的符号链接文件都会被备份:

mcd_root/
    server.py

    server/
        world -> target_world # world 是一个当前指向 target_world 文件夹的符号链接
        target_world/
        other_world/

    qb_multi/
        slot1/
            info.json
            world -> target_world  # 符号链接复制到了备份槽中
            target_world/ # 符号链接当前指向的世界一起复制到了备份槽中
        ...

执行 !!qb back 时,会从备份槽中指定世界名对应的符号链接开始,将所有符号链接以及最终实际的世界文件夹恢复至服务端的对应位置。这表示如果后续服务端的符号链接更改了指向的世界,回档时将恢复到备份时保存的世界,且不同世界的内容不会互相覆盖

backup_format

备份的储存格式

含义
plain 直接复制文件夹/文件来储存。默认值,这同时也是 v1.8 以前版本的 QBM 唯一支持的储存格式
tar 使用 tar 格式直接打包储存至 backup.tar 文件中。推荐使用,可有效减少文件的数量,但无法方便地访问备份里面的文件
tar_gz 使用 tar.gz 格式压缩打包储存至 backup.tar.gz 文件中。能减小备份体积,但是备份/回档的耗时将显著增加。支持自定义压缩等级
tar_xz 使用 tar.xz 格式压缩打包储存至 backup.tar.xz 文件中。能最大化地减小备份体积,但是备份/回档的耗时将极大增加

槽位的备份模式会储存在槽位的 info.json 中,并在回档时读取,因此的不同的槽位可以有着不同的储存格式。 若其值不存在,QBM 会假定这个槽位是由旧版 QBM 创建的,并使用默认值 plain

若配置文件中的 backup_format 非法,则会使用默认值 plain

compress_level

一个 1 ~ 9 的整数,代表在 backup_format 选项为 tar_gz 时,使用的压缩等级。 等级越高,压缩率相对越高,耗时也越高

默认值:1

minimum_permission_level

默认值:

"minimum_permission_level": {
	"make": 1,
	"back": 2,
	"del": 2,
    "rename": 2,
	"confirm": 1,
	"abort": 1,
	"reload": 2,
	"list": 0,
}

一个字典,代表使用不同类型指令需要权限等级。数值含义见此处

把所有数值设置成 0 以让所有人均可操作

quickbackupm's People

Contributors

91khr avatar alex3236 avatar fallen-breath avatar kahzerx avatar lucunji avatar tksmly avatar vigilans avatar x-green avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

quickbackupm's Issues

[功能请求] 忽略备份时的错误

提供一个选项,如果仅有部分文件无法备份,那么允许用户忽略错误,形成不完整备份并输出失败的文件列表。用户可以选择保留或删除这个不完整备份。

在使用新的服务端核心Folia时进行备份似乎无法进行

更换服务端核心之后,备份槽删除仍可正常进行。但若是进行备份,将会无法进行下去:
[MCDR] [01:22:12] [QBM - create/INFO]: [QBM] 备份中...请稍等
[Server] [01:22:12 INFO]: Automatic saving is now disabled
[Server] [01:22:12 INFO]: Unknown command. Type "/help" for help.

不知道是我的操作问题还是什么原因,也许是个例

有个(大)问题

当要回档的存档炸了的时候
服务器就炸了
world就废了
然后就...
存档————
rue

无法使用,也没有生成config

Traceback (most recent call last):
File "C:\python365\lib\site-packages\mcdreforged\plugin\plugin_manager.py", line 447, in trigger_listener
listener.execute(self.mcdr_server.server_interface, *args)
File "C:\python365\lib\site-packages\mcdreforged\plugin\plugin_event.py", line 79, in execute
return self.callback(*args, **kwargs)
File "plugins\QuickBackupM_en.py", line 583, in on_load
load_config(server)
File "plugins\QuickBackupM_en.py", line 564, in load_config
if info:
NameError: name 'info' is not defined
[MCDR] [12:35:20] [TaskExecutor/INFO]: Reload "[email protected]" successfully
[MCDR] [12:35:20] [TaskExecutor/INFO]: Reloaded: 1 plugins; Active plugin amount: 2

!!qb make
[Server] [12:40:54] [Server thread/INFO]: Unknown command. Type "/help" for help.

多线程qb的降速现象

少部分情况下当使用多线程qb时仍然难以达到理想速度:

  1. 可能是存档中区块数量过多,其中存在大量区块(如虚空区块)文件大小约为0;但一个个文件大小检测后再分配有点不太现实(?(仅推测 在我服跨盘保存创造服存档时出现,查看任务管理器发现复制存档开始有一段时间磁盘读写在80MB/s左右,后升高至1GB+/s)
  2. 存档中区块数量过少,线程过多导致每个线程分到的文件及总大小过小,可否尝试设定最小文件数量解决(或设定线程上限,文件过少则少开几个线程)

是否考虑加入定时存档的机制?

QuickBackupM插件非常好用。在之前我是通过自己写了一个简单的复制脚本(python语言)进行世界文件夹的复制,有了QuickBackupM插件,我可以更加智能化,在MC内管理存档和回档。但是我曾经实现的定时进行存档备份的功能在QuickBackupM中并没有具现化的实现。我考虑可能是因为定时存档过于消耗服务器的I/O资源?我简单的修改了QuickBackupM的代码,实现了定时存档的机制,但是代码过于丑陋,我现在正在进行重构工作。不过我想询问一下TIS的大佬们有没有想法加入这个功能?

My server is stagnant

At the time of uploading the backup it is stuck in saving the map and the server does not close at any time. And I have to do CNTL + C to upload the map myself by hand and start the server again. It passes me from 20 attempts 19 times it fails.
Penene

!!qb reload 坏了

错报

[MCDR] [20:15:14] [TaskExecutor/ERROR]: Error when executing command "!!qb reload" with command source "Player Alex3236" on Literal[literals={'!!qb'}] registered by [email protected]
Traceback (most recent call last):
  File "C:\Program Files\Python39\lib\site-packages\mcdreforged\command\command_manager.py", line 70, in _traverse
    node.execute(source, command)
  File "C:\Program Files\Python39\lib\site-packages\mcdreforged\command\builder\nodes\basic.py", line 411, in execute
    self._execute_command(CommandContext(source, command))
  File "C:\Program Files\Python39\lib\site-packages\mcdreforged\command\builder\nodes\basic.py", line 326, in _execute_command
    child_literal._execute_command(context)
  File "C:\Program Files\Python39\lib\site-packages\mcdreforged\command\builder\nodes\basic.py", line 305, in _execute_command
    self.__smart_callback(self._callback, context.source, context)
  File "C:\Program Files\Python39\lib\site-packages\mcdreforged\command\builder\nodes\basic.py", line 267, in __smart_callback
    return callback(*args[:spec_args_len])
  File "plugins\QuickBackupM-v1.2.2.mcdr\quick_backup_multi\__init__.py", line 489, in <lambda>
    then(get_literal_node('reload').runs(lambda src: load_config(src.get_server(), src)))
  File "plugins\QuickBackupM-v1.2.2.mcdr\quick_backup_multi\__init__.py", line 495, in load_config
    config = server.load_config_simple(CONFIG_FILE, default_config, in_data_folder=False, source_to_reply=source)
AttributeError: 'ServerInterface' object has no attribute 'load_config_simple'

原因

# /quick_backup_multi/__init__.py

# ...
# Line 510
then(get_literal_node('reload').runs(lambda src: load_config(src.get_server(), src))) # <-- 此处向 load_config 传递 src.get_server() 为 ServerInterface

# ...
# Line 514
def load_config(server, source: CommandSource or None = None):
	# ...
	config = server.load_config_simple(...) # <-- 使用 PluginServerInterface 的 load_config_simple 方法
# ...

解决方案

  1. ServerInterface 中添加一个能获取 PluginServerInterface 的办法?
  2. on_load 时将 PluginServerInterface 给到全局变量

服务器不能正常回档

[13:10:30] [main/INFO]: Loading Minecraft 1.20 with Fabric Loader 0.14.22
[13:10:30] [ForkJoinPool-1-worker-10/WARN]: The mod "the-starry-mininglist" contains invalid entries in its mod json:
- Unsupported root entry "permissions" at line 32 column 16
[13:10:30] [main/INFO]: Loading 100 mods:
	- carpet 1.4.112+v230608
	- carpet-extra 1.4.115
	- carpet-fixes 1.20-1.16.1
	   \-- com_github_llamalad7_mixinextras 0.2.0-beta.9
	- carpet-tis-addition 1.51.0
	   \-- conditional-mixin 0.4.0
	- easyauth 3.0.19
	   |-- at_favre_lib_bcrypt 0.9.0
	   |-- at_favre_lib_bytes 1.5.0
	   |-- com_mysql_mysql-connector-j 8.0.33
	   |-- de_mkammerer_argon2-jvm 2.11
	   |-- de_mkammerer_argon2-jvm-nolibs 2.11
	   |-- fabric-permissions-api-v0 0.2-SNAPSHOT
	   |-- net_java_dev_jna_jna 5.12.1
	   |-- org_iq80_leveldb_leveldb 0.12
	   |-- org_iq80_leveldb_leveldb-api 0.12
	   |-- org_mongodb_bson 4.7.2
	   |-- org_mongodb_mongodb-driver-core 4.7.2
	   |-- org_mongodb_mongodb-driver-sync 4.7.2
	   |-- placeholder-api 2.1.1+1.20
	   \-- server_translations_api 2.0.0+1.20
	        \-- packet_tweaker 0.4.0+1.19.4
	- fabric-api 0.83.0+1.20
	   |-- fabric-api-base 0.4.29+b04edc7a27
	   |-- fabric-api-lookup-api-v1 1.6.34+4d8536c927
	   |-- fabric-biome-api-v1 13.0.10+b3afc78b27
	   |-- fabric-block-api-v1 1.0.9+e022e5d127
	   |-- fabric-blockrenderlayer-v1 1.1.39+b3afc78b27
	   |-- fabric-client-tags-api-v1 1.0.20+b3afc78b27
	   |-- fabric-command-api-v1 1.2.32+f71b366f27
	   |-- fabric-command-api-v2 2.2.11+b3afc78b27
	   |-- fabric-commands-v0 0.2.49+df3654b327
	   |-- fabric-containers-v0 0.1.61+df3654b327
	   |-- fabric-content-registries-v0 4.0.7+b3afc78b27
	   |-- fabric-convention-tags-v1 1.5.3+b3afc78b27
	   |-- fabric-crash-report-info-v1 0.2.18+aeb40ebe27
	   |-- fabric-data-generation-api-v1 12.1.10+b3afc78b27
	   |-- fabric-dimensions-v1 2.1.51+b3afc78b27
	   |-- fabric-entity-events-v1 1.5.21+b3afc78b27
	   |-- fabric-events-interaction-v0 0.6.0+b3afc78b27
	   |-- fabric-events-lifecycle-v0 0.2.61+df3654b327
	   |-- fabric-game-rule-api-v1 1.0.38+b04edc7a27
	   |-- fabric-item-api-v1 2.1.26+b3afc78b27
	   |-- fabric-item-group-api-v1 4.0.7+b3afc78b27
	   |-- fabric-key-binding-api-v1 1.0.36+fb8d95da27
	   |-- fabric-keybindings-v0 0.2.34+df3654b327
	   |-- fabric-lifecycle-events-v1 2.2.20+b3afc78b27
	   |-- fabric-loot-api-v2 1.1.37+b3afc78b27
	   |-- fabric-loot-tables-v1 1.1.41+9e7660c627
	   |-- fabric-message-api-v1 5.1.6+b3afc78b27
	   |-- fabric-mining-level-api-v1 2.1.47+b3afc78b27
	   |-- fabric-models-v0 0.3.35+b3afc78b27
	   |-- fabric-networking-api-v1 1.3.8+b3afc78b27
	   |-- fabric-networking-v0 0.3.48+df3654b327
	   |-- fabric-object-builder-api-v1 11.0.6+b3afc78b27
	   |-- fabric-particles-v1 1.0.28+b3afc78b27
	   |-- fabric-recipe-api-v1 1.0.18+b3afc78b27
	   |-- fabric-registry-sync-v0 2.2.6+b3afc78b27
	   |-- fabric-renderer-api-v1 3.0.1+b3afc78b27
	   |-- fabric-renderer-indigo 1.3.1+b3afc78b27
	   |-- fabric-renderer-registries-v1 3.2.44+df3654b327
	   |-- fabric-rendering-data-attachment-v1 0.3.33+b3afc78b27
	   |-- fabric-rendering-fluids-v1 3.0.26+b3afc78b27
	   |-- fabric-rendering-v0 1.1.47+df3654b327
	   |-- fabric-rendering-v1 3.0.6+b3afc78b27
	   |-- fabric-resource-conditions-api-v1 2.3.4+b3afc78b27
	   |-- fabric-resource-loader-v0 0.11.7+f7923f6d27
	   |-- fabric-screen-api-v1 2.0.6+b3afc78b27
	   |-- fabric-screen-handler-api-v1 1.3.27+b3afc78b27
	   |-- fabric-sound-api-v1 1.0.12+b3afc78b27
	   |-- fabric-transfer-api-v1 3.2.2+b3afc78b27
	   \-- fabric-transitive-access-wideners-v1 4.2.0+b3afc78b27
	- fabric-language-kotlin 1.10.10+kotlin.1.9.10
	   |-- org_jetbrains_kotlin_kotlin-reflect 1.9.10
	   |-- org_jetbrains_kotlin_kotlin-stdlib 1.9.10
	   |-- org_jetbrains_kotlin_kotlin-stdlib-jdk7 1.9.10
	   |-- org_jetbrains_kotlin_kotlin-stdlib-jdk8 1.9.10
	   |-- org_jetbrains_kotlinx_atomicfu-jvm 0.22.0
	   |-- org_jetbrains_kotlinx_kotlinx-coroutines-core-jvm 1.7.3
	   |-- org_jetbrains_kotlinx_kotlinx-coroutines-jdk8 1.7.3
	   |-- org_jetbrains_kotlinx_kotlinx-datetime-jvm 0.4.0
	   |-- org_jetbrains_kotlinx_kotlinx-serialization-cbor-jvm 1.6.0
	   |-- org_jetbrains_kotlinx_kotlinx-serialization-core-jvm 1.6.0
	   \-- org_jetbrains_kotlinx_kotlinx-serialization-json-jvm 1.6.0
	- fabricloader 0.14.22
	- ferritecore 6.0.0
	- floodgate 2.2.0-SNAPSHOT
	   |-- adventure-platform-fabric 5.8.0-SNAPSHOT
	   |    |-- net_kyori_adventure-api 4.13.0
	   |    |-- net_kyori_adventure-key 4.13.0
	   |    |-- net_kyori_adventure-platform-api 4.2.0
	   |    |-- net_kyori_adventure-text-logger-slf4j 4.13.0
	   |    |-- net_kyori_adventure-text-minimessage 4.13.0
	   |    |-- net_kyori_adventure-text-serializer-gson 4.13.0
	   |    |-- net_kyori_adventure-text-serializer-plain 4.13.0
	   |    |-- net_kyori_examination-api 1.3.0
	   |    \-- net_kyori_examination-string 1.3.0
	   \-- cloud 1.8.3
	        |-- cloud_commandframework_cloud-brigadier_ 1.8.3
	        |-- cloud_commandframework_cloud-core_ 1.8.3
	        |-- cloud_commandframework_cloud-services_ 1.8.3
	        |-- fabric-permissions-api-v0 0.2-SNAPSHOT
	        \-- io_leangen_geantyref_geantyref 1.3.13
	- gca 2.6.0-1.20
	- geyser-fabric 2.2.0-SNAPSHOT
	   \-- fabric-permissions-api-v0 0.2-SNAPSHOT
	- java 17
	- ledger 1.2.8
	   \-- fabric-permissions-api-v0 0.2-SNAPSHOT
	- lithium 0.11.2
	- minecraft 1.20
	- nochatreports 1.20.1-v2.2.2
	   |-- fabric-rendering-v1 3.0.6+b3afc78b82
	   \-- fabric-screen-api-v1 2.0.6+b3afc78b82
	- spark 1.10.53
	- starlight 1.1.2+fabric.dbc156f
	- the-starry-mininglist 1.1
[13:10:35] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=file:/D:/mcdr/server/libraries/net/fabricmc/sponge-mixin/0.12.5+mixin.0.8.5/sponge-mixin-0.12.5+mixin.0.8.5.jar Service=Knot/Fabric Env=SERVER
[13:10:35] [main/INFO]: Compatibility level set to JAVA_17
[13:10:36] [main/INFO]: Loaded configuration file for Lithium: 115 options available, 1 override(s) found
[13:10:36] [main/WARN]: Reference map 'TheStarryMiningList-mc1.20-refmap.json' for TheStarryMiningList.mixins.json could not be read. If this is a development environment you can ignore this message
[13:10:36] [main/WARN]: Force-disabling mixin 'alloc.blockstate.StateMixin' as rule 'mixin.alloc.blockstate' (added by mods [ferritecore]) disables it and children
[13:10:40] [main/INFO]: Mixing common.MixinFriendlyByteBuf from mixins/common/nochatreports.mixins.json into net.minecraft.class_2540
[13:10:40] [main/INFO]: Renaming synthetic method lambda$onWriteJsonWithCodec$1(Ljava/lang/Object;Ljava/lang/String;)Lio/netty/handler/codec/EncoderException; to md6eb796$nochatreports$lambda$onWriteJsonWithCodec$1$0 in mixins/common/nochatreports.mixins.json:common.MixinFriendlyByteBuf from mod nochatreports
[13:10:40] [main/INFO]: Renaming synthetic method lambda$onReadJsonWithCodec$0(Ljava/lang/String;)Lio/netty/handler/codec/DecoderException; to md6eb796$nochatreports$lambda$onReadJsonWithCodec$0$1 in mixins/common/nochatreports.mixins.json:common.MixinFriendlyByteBuf from mod nochatreports
[13:10:40] [main/WARN]: Method overwrite conflict for method_5800 in carpet-fixes.mixins.json:itemFixes.ItemEntity_lightningKillsDropsMixin from mod carpet-fixes, previously written by carpet.mixins.ItemEntityMixin. Skipping method.
[13:10:44] [main/INFO]: Mixing server.MixinServerGamePacketListenerImpl from mixins/common/nochatreports.mixins.json into net.minecraft.class_3244
[13:10:44] [main/WARN]: Method overwrite conflict for getConnection in fabric-networking-api-v1.mixins.json:accessor.ServerPlayNetworkHandlerAccessor from mod fabric-networking-api-v1, previously written by carpet.mixins.ServerGamePacketListenerImpl_coreMixin. Skipping method.
[13:10:46] [main/INFO]: [EasyAuth]: EasyAuth mod by samo_lego, NikitaCartes.
[13:10:46] [main/WARN]: [EasyAuth]: Disable enforce-secure-profile to allow offline players to join the server
[13:10:46] [main/WARN]: [EasyAuth]: For more info, see https://github.com/NikitaCartes/EasyAuth/issues/68
[13:10:46] [TISCM Mapping/INFO]: Yarn mapping file yarn-1.20+build.1-v2.tiny loaded
[13:10:48] [main/INFO]: 正在加载插件...
[13:10:48] [main/INFO]: 已加载 0 个插件
[13:10:48] [main/INFO]: KONNICHIWA ZA WARUDO!
[13:10:48] [main/INFO]: Default JVM text encoding is: UTF-8
[13:10:48] [main/INFO]: Reading config file NoChatReports/NCR-Common.json...
[13:10:48] [main/INFO]: Writing config file NoChatReports/NCR-Common.json...
[13:10:48] [main/WARN]: Found outdated translation keys in extension 'dev.dubhe.gugle.carpet.GcaExtension'!
These won't be supported in a later Carpet version!
Carpet will now try to map them to the correct keys in a best-effort basis
[13:10:48] [main/WARN]: Found outdated translation keys in extension 'dev.dubhe.gugle.carpet.GcaExtension'!
These won't be supported in a later Carpet version!
Carpet will now try to map them to the correct keys in a best-effort basis
[13:10:48] [main/WARN]: Found outdated translation keys in extension 'dev.dubhe.gugle.carpet.GcaExtension'!
These won't be supported in a later Carpet version!
Carpet will now try to map them to the correct keys in a best-effort basis
[13:10:48] [main/WARN]: Found outdated translation keys in extension 'dev.dubhe.gugle.carpet.GcaExtension'!
These won't be supported in a later Carpet version!
Carpet will now try to map them to the correct keys in a best-effort basis
[13:10:48] [main/INFO]: Initializing Ledger 1.2.8
[13:10:49] [main/INFO]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD'
[13:10:51] [main/ERROR]: Failed to add settings command for carpet-fixes. It is masking previous command.
[13:10:51] [main/INFO]: Loaded 7 recipes
[13:10:52] [main/INFO]: Loaded 1271 advancements
[13:10:52] [ForkJoinPool.commonPool-worker-1/INFO]: Loaded 81 translation keys
[13:10:52] [main/INFO]: Mixing server.MixinDedicatedServer from mixins/common/nochatreports.mixins.json into net.minecraft.class_3176
[13:10:52] [main/INFO]: Mixing server.MixinPlayerList from mixins/common/nochatreports.mixins.json into net.minecraft.class_3324
[13:10:52] [main/INFO]: Applied 0 biome modifications to 0 of 64 new biomes in 3.270 ms
[13:10:52] [Server thread/INFO]: Starting background profiler...
[13:10:52] [Server thread/INFO]: The async-profiler engine is not supported for your os/arch (windows10/amd64), so the built-in Java engine will be used instead.
[13:10:53] [Server thread/INFO]: Preparing create tables statements took 15ms
[13:10:53] [Server thread/INFO]: Executing create tables statements took 16ms
[13:10:53] [Server thread/INFO]: Extracting table columns took 5ms
[13:10:53] [Server thread/INFO]: Preparing alter table statements took 5ms
[13:10:53] [Server thread/INFO]: Executing alter table statements took 0ms
[13:10:53] [Server thread/INFO]: Index on table 'players' differs only in name: in db players_player_id -> in mapping players_player_id_unique
[13:10:53] [Server thread/INFO]: Index on table 'ActionIdentifiers' differs only in name: in db ActionIdentifiers_action_identifier -> in mapping ActionIdentifiers_action_identifier_unique
[13:10:53] [Server thread/INFO]: Index on table 'ObjectIdentifiers' differs only in name: in db ObjectIdentifiers_identifier -> in mapping ObjectIdentifiers_identifier_unique
[13:10:53] [Server thread/INFO]: Index on table 'sources' differs only in name: in db sources_name -> in mapping sources_name_unique
[13:10:53] [Server thread/INFO]: Index on table 'worlds' differs only in name: in db worlds_identifier -> in mapping worlds_identifier_unique
[13:10:53] [Server thread/INFO]: Checking mapping consistence took 125ms
[13:10:53] [Server thread/INFO]: Tables created
[13:10:53] [DefaultDispatcher-worker-7/INFO]: Inserting 1499 registry keys into the database...
[13:10:53] [Server thread/INFO]: Starting minecraft server version 1.20
[13:10:53] [Server thread/INFO]: Loading properties
[13:10:53] [Server thread/INFO]: Default game type: SURVIVAL
[13:10:53] [Server thread/INFO]: Generating keypair
[13:10:53] [Server thread/INFO]: Starting Minecraft server on *:25565
[13:10:53] [Server thread/INFO]: Using default channel type
[13:10:53] [Server thread/WARN]: **** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!
[13:10:53] [Server thread/WARN]: The server will make no attempt to authenticate usernames. Beware.
[13:10:53] [Server thread/WARN]: While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.
[13:10:53] [Server thread/WARN]: To change this, set "online-mode" to "true" in the server.properties file.
[13:10:53] [Server thread/INFO]: Preparing level "world"
[13:10:53] [Server thread/WARN]: Found outdated translation keys in extension 'dev.dubhe.gugle.carpet.GcaExtension'!
These won't be supported in a later Carpet version!
Carpet will now try to map them to the correct keys in a best-effort basis
[13:10:53] [Server thread/WARN]: Found outdated translation keys in extension 'dev.dubhe.gugle.carpet.GcaExtension'!
These won't be supported in a later Carpet version!
Carpet will now try to map them to the correct keys in a best-effort basis
[13:10:53] [Server thread/INFO]: [CM] Loaded 9 settings from carpet.conf
[13:10:55] [DefaultDispatcher-worker-1/INFO]: Registry insert complete
[13:10:55] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
[13:10:57] [Worker-Main-1/INFO]: Preparing spawn area: 0%
[13:10:57] [Worker-Main-6/INFO]: Preparing spawn area: 0%
[13:10:57] [Worker-Main-1/INFO]: Preparing spawn area: 0%
[13:10:57] [Worker-Main-6/INFO]: Preparing spawn area: 0%
[13:10:57] [Worker-Main-1/INFO]: Preparing spawn area: 0%
[13:10:58] [Worker-Main-1/INFO]: Preparing spawn area: 0%
[13:10:58] [Worker-Main-4/INFO]: Preparing spawn area: 0%
[13:10:59] [Worker-Main-3/INFO]: Preparing spawn area: 27%
[13:10:59] [Worker-Main-4/INFO]: Preparing spawn area: 82%
[13:10:59] [Server thread/INFO]: Time elapsed: 4102 ms
[13:10:59] [Server thread/INFO]: Done (5.979s)! For help, type "help"
[13:10:59] [Server thread/INFO]: Starting remote control listener
[13:10:59] [Server thread/INFO]: Thread RCON Listener started
[13:10:59] [Server thread/INFO]: RCON running on 0.0.0.0:25575
[13:10:59] [RCON Listener #1/INFO]: Thread RCON Client /127.0.0.1 started
[13:10:59] [Server thread/INFO]: 启动 Floodgate,耗时53ms
[13:10:59] [Server thread/INFO]: ******************************************
[13:10:59] [Server thread/INFO]: 
[13:10:59] [Server thread/INFO]: 加载 Geyser 中, 版本 2.2.0-SNAPSHOT (git-master-5276a1e)
[13:10:59] [Server thread/INFO]: 
[13:10:59] [Server thread/INFO]: ******************************************
[13:11:00] [Netty Server IO #1/INFO]: Mixing server.MixinServerboundChatCommandPacket from mixins/common/nochatreports.mixins.json into net.minecraft.class_7472
[13:11:00] [Netty Server IO #1/INFO]: Mixing server.MixinServerboundChatPacket from mixins/common/nochatreports.mixins.json into net.minecraft.class_2797
[13:11:00] [Netty Server IO #1/INFO]: Mixing server.MixinServerboundChatSessionUpdatePacket from mixins/common/nochatreports.mixins.json into net.minecraft.class_7861
[13:11:03] [Server thread/INFO]: Geyser正在启动 0.0.0.0:19132
[13:11:03] [Server thread/INFO]: 完成 (4.015s)! 执行/geyser help 来获取帮助信息!
[13:11:03] [Server thread/INFO]: Mixing common.MixinServerStatus from mixins/common/nochatreports.mixins.json into net.minecraft.class_2926
[13:11:03] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 4105ms or 82 ticks behind
[13:11:06] [Server thread/INFO]: bai_sha_bft[/127.0.0.1:51935] logged in with entity id 34 at (-3393.1845409479583, 70.17675927506424, 5640.657497343832)
[13:11:07] [Server thread/INFO]: bai_sha_bft joined the game
[13:11:07] [Server thread/INFO]: Player bai_sha_bft joined with a matching carpet client
[13:11:16] [Server thread/INFO]: CICI799[/127.0.0.1:51944] logged in with entity id 385 at (-3427.34091328477, 69.00133597911214, 5673.4115134933545)
[13:11:16] [Server thread/INFO]: CICI799 joined the game
[13:11:19] [Server thread/INFO]: Player CICI799 joined with a matching carpet client
[13:11:34] [Server thread/INFO]: <bai_sha_bft> !!qb
[13:12:16] [Server thread/INFO]: <bai_sha_bft> !!qb back 1 快点回档!
[13:12:21] [Server thread/INFO]: <bai_sha_bft> !!qb back1 快点回档!
[13:12:30] [Server thread/INFO]: <bai_sha_bft> !!qb back 1快点回档!
[13:12:35] [Server thread/INFO]: <bai_sha_bft> !!qb back 1
[13:12:42] [Server thread/INFO]: <bai_sha_bft> !!qb confirm
[13:12:51] [Server thread/INFO]: Stopping the server
[13:12:52] [Server thread/INFO]: Geyser关闭中
[13:12:52] [Server thread/INFO]: Geyser成功关闭.
[13:12:52] [Server thread/INFO]: Stopping server
[13:12:52] [RCON Client /127.0.0.1 #2/INFO]: Thread RCON Client /127.0.0.1 shutting down
[13:12:52] [Server thread/INFO]: Saving players
[13:12:52] [Server thread/INFO]: Saving worlds
[13:12:52] [Server thread/INFO]: Saving chunks for level 'ServerLevel[world]'/minecraft:overworld
[13:12:52] [WebSocketConnectReadThread-94/INFO]: The skin uploader has been closed
[13:12:52] [Server thread/INFO]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_end
[13:12:52] [Server thread/INFO]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_nether
[13:12:52] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[13:12:52] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[13:12:52] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[13:12:52] [Server thread/INFO]: ThreadedAnvilChunkStorage: All dimensions are saved
[13:12:53] [Server thread/WARN]: Found outdated translation keys in extension 'dev.dubhe.gugle.carpet.GcaExtension'!
These won't be supported in a later Carpet version!
Carpet will now try to map them to the correct keys in a best-effort basis
[13:12:53] [Server thread/INFO]: [EasyAuth]: Shutting down EasyAuth.
[13:12:53] [Server thread/INFO]: [EasyAuth]: Database connection closed successfully
[13:12:53] [Server thread/INFO]: Thread RCON Listener stopped

回档命令发出后,Thread RCON Listener stopped显示后半小时都没有动静,打开后也没有回档

无法正常备份

控制台日志如下:
[Server] [19:26:29] [Server thread/INFO]: Automatic saving is now disabled
[Server] [19:26:29] [Server thread/INFO]: Saving the game (this may take a moment!)

[Server] [19:26:29] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[Server] [19:26:29] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[Server] [19:26:29] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[Server] [19:26:29] [Server thread/INFO]: ThreadedAnvilChunkStorage: All dimensions are saved
[Server] [19:26:29] [Server thread/INFO]: Saved the game

[MCDR] [19:26:29] [QBM - create/INFO] [quick_backup_multi]: copying ./server/world -> ./qb_multi/slot1/world

[MCDR] [19:26:29] [QBM - create/ERROR]: [QBM] Error creating backup
Traceback (most recent call last):
File "plugins/QuickBackupM-v1.6.0.mcdr/quick_backup_multi/init.py", line 267, in _create_backup
copy_worlds(config.server_path, slot_path)
File "plugins/QuickBackupM-v1.6.0.mcdr/quick_backup_multi/init.py", line 61, in copy_worlds
shutil.copytree(src_path, dst_path, ignore=lambda path, files: set(filter(config.is_file_ignored, files)))
File "/usr/lib64/python3.9/shutil.py", line 568, in copytree
return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
File "/usr/lib64/python3.9/shutil.py", line 504, in _copytree
copytree(srcobj, dstname, symlinks, ignore, copy_function,
File "/usr/lib64/python3.9/shutil.py", line 568, in copytree
return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
File "/usr/lib64/python3.9/shutil.py", line 508, in _copytree
copy_function(srcobj, dstname)
File "/usr/lib64/python3.9/shutil.py", line 444, in copy2
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "/usr/local/lib/python3.9/site-packages/speedcopy/init.py", line 183, in copyfile
fs_src_type = FilesystemInfo().filesystem(src.encode('utf-8'))
AttributeError: 'posix.DirEntry' object has no attribute 'encode'

[Server] [19:26:29] [Server thread/INFO]: Automatic saving is now enabled
求一下解决方法谢谢

游戏内部输入!!qb出现乱码,后台输入正常

如图:
bb22ba6d788f2fc5481a517ac8183a82
游戏内聊天框输入!!qb后出现的是乱码
同时后台输出如下:
5208c3d58d9c327113e775601365b503
在此之后我进行了插件重装(同时删除qb_multi和config内的配置文件,并对服务器进行重启)发现游戏内还是乱码
image
后台输出如下
image
值得注意的是在后台直接输入!!qb是没有问题的
image
image
而且也是可以正常进行备份的
游戏内玩家能看到的只有这三条提示
image

使用tar和tar.gz格式备份,显示备份失败

mc=1.18.2 with Fabric
MCDR=2.7.2

pluginl ist:
QBM=1.8.0

log:
[MCDR] [2023-04-04 23:27:20] [QBM - create/INFO]: storing ./server\world -> ./qb_multi\slot1\backup.tar.gz
[MCDR] [2023-04-04 23:27:27] [QBM - create/ERROR]: [QBM] Error creating backup
Traceback (most recent call last):
File "plugins\QuickBackupM-v1.8.0.mcdr\quick_backup_multi_init_.py", line 367, in create_backup
copy_worlds(config.server_path, slot_path, CopyWorldIntent.backup)
File "plugins\QuickBackupM-v1.8.0.mcdr\quick_backup_multi_init
.py", line 130, in copy_worlds
backup_file.add(src_path, arcname=world, filter=tar_filter)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\tarfile.py", line 1994, in add
self.add(os.path.join(name, f), os.path.join(arcname, f),
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\tarfile.py", line 1988, in add
self.addfile(tarinfo, f)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\tarfile.py", line 2016, in addfile
copyfileobj(fileobj, self.fileobj, tarinfo.size, bufsize=bufsize)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\tarfile.py", line 253, in copyfileobj
buf = src.read(remainder)
PermissionError: [Errno 13] Permission denied

TAR_GZ 模式下备份失败

image

Traceback (most recent call last):
  File "plugins\QuickBackupM-v1.9.0.mcdr\quick_backup_multi\__init__.py", line 408, in _create_backup
    copy_worlds(config.server_path, slot_path, CopyWorldIntent.backup)
  File "plugins\QuickBackupM-v1.9.0.mcdr\quick_backup_multi\__init__.py", line 156, in copy_worlds
    tar_path = os.path.join(dst, get_backup_file_name(backup_format))
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "plugins\QuickBackupM-v1.9.0.mcdr\quick_backup_multi\__init__.py", line 82, in get_backup_file_name
    return backup_format.get_file_name('backup')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "plugins\QuickBackupM-v1.9.0.mcdr\quick_backup_multi\__init__.py", line 52, in get_file_name
    return base_name + self.value.suffix
                       ^^^^^^^^^^^^^^^^^
AttributeError: 'tuple' object has no attribute 'suffix'
[MCDR] [15:10:04] [QBM - create/INFO]: [QBM] 备份失败,错误代码'tuple' object has no attribute 'suffix'

!!qb不备份存档

[Server] [19:25:12] [Server thread/INFO]: <bug_and_moiang> !!qb make 测试
[Server] [19:25:13] [Server thread/INFO]: Automatic saving is now disabled
[Server] [19:25:13] [Server thread/INFO]: Saving the game (this may take a moment!)
[Server] [19:25:14] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[Server] [19:25:14] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[Server] [19:25:14] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[Server] [19:25:14] [Server thread/INFO]: ThreadedAnvilChunkStorage: All dimensions are saved
[Server] [19:25:14] [Server thread/INFO]: Saved the game
[MCDR] [19:25:14] [QBM - create/INFO] [quick_backup_multi]: copying ./server/world -> ./qb_multi/slot1/world
[MCDR] [19:25:14] [QBM - create/WARNING] [quick_backup_multi]: ./server/world does not exist while copying (./server/world -> ./qb_multi/slot1/world)
[MCDR] [19:25:14] [TaskExecutor/INFO] [timed_quick_backup_multi]: [Timed QBM] 检测到新增的备份,重置定时器
[MCDR] [19:25:14] [TaskExecutor/INFO] [timed_quick_backup_multi]: [Timed QBM] 下次自动备份时间: 2022/05/21 19:55:14
[Server] [19:25:14] [Server thread/INFO]: Automatic saving is now enabled

输入指令后列表正常显示但是存档没有备份

类似#41和#42的问题报告

使用plain配置参数的时候可以进行正常备份,但是如果使用了tar等压缩格式则无法进行正常备份,进程没有被占用,使用管理员权限无法解决。

log文件如下:
MCDR.log

备份无法正常工作

!!qb make
[MCDR] [15:55:34] [QBM - create/INFO]: [QBM] Backing up, please wait
[Server] [15:55:34 INFO]: Automatic saving is now disabled
[Server] [15:55:34 INFO]: Saving the game (this may take a moment!)
[Server] [15:55:34 INFO]: Saved the game
!!qb list
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot Information]
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 1] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 2] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 3] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 4] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 5] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 6] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 7] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 8] None
[MCDR] [15:55:58] [QBM - list/INFO]: [Slot 9] None
[MCDR] [15:55:58] [QBM - list/INFO]: Total space consumed: 0.0 MB

[改进] 优化回档用户体验

QBM原先的回档流程是

  1. 创建备份
  2. 关闭服务器
  3. 拷贝存档
  4. 开启服务器

需要较长的时间。如果改成

  1. 创建备份
  2. 拷贝存档
  3. 重启服务器

用户体验会更好一点(尽管总时间是一样的)

PermissionError: [WinError 5] 拒绝访问

提示的是【PermissionError: [WinError 5] 拒绝访问】
已知的方法就是 将python的访问权限打开。但是我已经吧所有权限打开,还是管理员身份运行python也重装过 系统也是 包括MCDR的端都重配过,依旧无法解决。

QBM插件与Luckprems插件prefix功能存在兼容问题

你好,在我使用QBM时遇到了一些问题,麻烦向下阅读。

Snipaste_2024-02-17_15-26-28
环境:
系统版本: Win10 jdk20 py3.11
QBM版本: QuickBackupM-v1.10.1
服务端版本: Leave(Paper分支)1.20.1

操作步骤:
QBM为默认设置(能够正常在服务端、客户端使用!!qb),服务端安装了LuckPrems插件,我使用/lp user Notch meta addprefix 1 "&c&l[管理员]" 指令来为“Notch”添加前缀(称号)。

错误详情:
进行上述步骤后,在客户端输入!!qb(包括其他MCDR指令)会失效(服务端!!qb不受影响)
因此我认为是QBM与Luckprems的prefix(设置玩家前缀)功能存在兼容问题。
值得一提的是,我尝试更换其他称号插件,在设置玩家前缀(称号)后,均会出现该问题。
Snipaste_2024-02-17_15-26-28

无法备份

[MCDR] [08:21:26] [TimedQBM/INFO] [timed_quick_backup_multi]: [Timed QBM] 每30.0分钟一次的定时备份触发
[MCDR] [08:21:26] [TimedQBM/INFO]: [QBM] 正在回档中,请等待操作执行完成
[MCDR] [08:21:26] [TimedQBM/INFO] [timed_quick_backup_multi]: [Timed QBM] 定时备份失败,可能发生了某些错误
[MCDR] [08:21:26] [TimedQBM/INFO] [timed_quick_backup_multi]: [Timed QBM] 下次自动备份时间: 2024/01/19 08:51:26

!!MCDR plg ra
[MCDR] [08:21:56] [TaskExecutor/INFO]: 刷新所有插件中
[MCDR] [08:21:56] [TaskExecutor/ERROR]: 插件 [email protected] 加载失败
[MCDR] [08:21:56] [TaskExecutor/ERROR]: 插件 [email protected] 的 Python 依赖库需求未被满足: required package 'No package metadata was found for requests' not installed
[MCDR] [08:21:56] [TaskExecutor/INFO] [timed_quick_backup_multi]: 插件卸载,停止时钟
[MCDR] [08:21:56] [TaskExecutor/INFO]: 插件 [email protected] 已卸载
[MCDR] [08:21:56] [TaskExecutor/INFO]: 插件 [email protected] 已卸载
[MCDR] [08:21:56] [TaskExecutor/INFO]: 插件 [email protected] 已卸载
[MCDR] [08:21:56] [TaskExecutor/INFO]: 插件 [email protected] 已卸载
[MCDR] [08:21:57] [WSConnection/WARNING] [ipanel_mcdreforged]: 连接已断开
[MCDR] [08:21:57] [TaskExecutor/INFO]: 插件 [email protected] 已卸载
[MCDR] [08:21:57] [TaskExecutor/INFO]: 插件 [email protected] 已重载
[MCDR] [08:21:57] [TaskExecutor/INFO]: 插件 [email protected] 已重载
[MCDR] [08:21:57] [TaskExecutor/INFO]: 插件 [email protected] 已重载
[MCDR] [08:21:57] [TaskExecutor/INFO]: 插件 [email protected] 已重载
[MCDR] [08:21:57] [TaskExecutor/INFO]: 插件 [email protected] 已重载
[MCDR] [08:21:57] [TaskExecutor/WARNING] [ipanel_mcdreforged]: "config.customName"为空,将使用默认名称"MCDReforged#2.3.0.0"
[MCDR] [08:21:57] [TaskExecutor/INFO] [ipanel_mcdreforged]: [email protected]加载成功.
[MCDR] [08:21:57] [TaskExecutor/INFO] [quick_backup_multi]: 配置文件已加载
[MCDR] [08:21:57] [TaskExecutor/INFO] [start_stop_helper_r]: 配置文件已加载
[MCDR] [08:21:57] [TaskExecutor/INFO] [timed_quick_backup_multi]: 配置文件已加载
[MCDR] [08:21:57] [TaskExecutor/INFO]: 共重载: 6 个插件; 加载失败: 2 个插件; 已加载插件数: 8
!!qb
[MCDR] [08:24:55] [QBM_Help/INFO]: ------ Quick Backup Multi v1.10.1 ------
[MCDR] [08:24:55] [QBM_Help/INFO]: 一个支持多槽位的快速备份&回档插件
[MCDR] [08:24:55] [QBM_Help/INFO]: 【格式说明】
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb 显示帮助信息
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb make [] 创建一个储存至槽位1的备份。为可选注释
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb back [] 回档为槽位的存档。默认为槽位1
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb del 删除槽位的存档
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb rename 修改槽位的注释,即重命名这一槽位
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb confirm 再次确认是否进行回档
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb abort 在任何时候键入此指令可中断回档
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb list 显示各槽位的存档信息
[MCDR] [08:24:55] [QBM_Help/INFO]: !!qb reload 重新加载配置文件
[MCDR] [08:24:55] [QBM_Help/INFO]: 当未被指定时默认选择槽位1
[MCDR] [08:24:55] [QBM_List/INFO]: 【槽位信息】
[MCDR] [08:24:55] [QBM_List/INFO]: [槽位1] [▷] [×] 日期: 2024-01-18 13:45:32; 注释: I'm a comment
[MCDR] [08:24:55] [QBM_List/INFO]: [槽位2] [▷] [×] 日期: 2024-01-18 12:02:24; 注释: Timed QBM Scheduled Backup
[MCDR] [08:24:55] [QBM_List/INFO]: [槽位3] [▷] [×] 日期: 2024-01-18 10:56:08; 注释: Timed QBM Scheduled Backup
[MCDR] [08:24:55] [QBM_List/INFO]: [槽位4] [▷] [×] 日期: 2024-01-18 10:26:08; 注释: Timed QBM Scheduled Backup
[MCDR] [08:24:55] [QBM_List/INFO]: [槽位5] [▷] [×] 日期: 2024-01-16 19:44:57; 注释: Timed QBM Scheduled Backup
[MCDR] [08:24:55] [QBM_Help/INFO]: 【快捷操作】
[MCDR] [08:24:55] [QBM_Help/INFO]: >>> 点我创建一个备份 <<<
[MCDR] [08:24:55] [QBM_Help/INFO]: >>> 点我回档至最近的备份 <<<
!!qb make back
[MCDR] [08:26:08] [QBM_Create/INFO]: [QBM] 正在回档中,请等待操作执行完成
!!qb abort
[MCDR] [08:26:13] [TaskExecutor/INFO]: [QBM] 终止操作!
!!qb make back
[MCDR] [08:26:15] [QBM_Create/INFO]: [QBM] 正在回档中,请等待操作执行完成
!!qb abort
[MCDR] [08:26:32] [TaskExecutor/INFO]: [QBM] 终止操作!
!!qb abort
[MCDR] [08:29:45] [TaskExecutor/INFO]: [QBM] 终止操作!
!!qb abort
[MCDR] [08:29:46] [TaskExecutor/INFO]: [QBM] 终止操作!
!!qb make back
[MCDR] [08:29:49] [QBM_Create/INFO]: [QBM] 正在回档中,请等待操作执行完成

回档后假人会消失

备份不能保存GCA的假人文件,回档后假人会消失
希望能增加保存fake_player.gca.json文件的功能

能否兼容Folia端

Folia端无法使用QB进行备份
其原因为Folia端禁用了save-all命令
不知道有没有其他办法

备份时,如果备份槽满了的话会报错

备份失败,错误代码[WinError 5]拒绝访问。:'./qb_multi/slot5\world'

如果手动删掉slot5则不会出现这个
请问这个怎么处理?
还有回档的时候也是,会显示拒绝访问,任意插槽的都无法回档

[bug] 备份状态有时显示不正确

复现环境:
Python: 3.11.2
MCDR: 2.9.1
插件只安装了qb和mpm,均为最新版
测试用的存档是15.2G

复现方法:
1.控制台输入!!qb make 1,完成后再输入!!qb make 2
Screenshot_20230713_082350
2.在2备份未完成时,输入!!qb back 1(回档但未确认)
Screenshot_20230713_082420
3.重载插件
4.直到2备份被完成,输入!!qb make或!!qb back任意指令,均会显示【QBM】正在?中,请等待操作执行完成(玩家在游戏里面打也一样),在2备份完成后,恢复正常
Screenshot_20230713_082615

想要在备份完成之前跳出这个不正确的状态,只能彻底退出MCDR后重启 或 将插件qb禁用后再启用,其他的!!qb reload、重载插件、热重载mcdr都没有用

((开世吞的时候要回档了,想提前结束上一次备份赶快回档发现的bug(awa

槽位信息未显示

!!qb make
[MCDR] [12:01:50] [PT1-on_info@QuickBackupM/INFO]: [QBM] 备份中...请稍等
[Server] [12:01:50] [Server thread/INFO]: Automatic saving is now disabled
[Server] [12:01:50] [Server thread/INFO]: Saving the game (this may take a moment!)
[Server] [12:01:50] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[Server] [12:01:50] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[Server] [12:01:50] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[Server] [12:01:50] [Server thread/INFO]: Saved the game
[MCDR] [12:01:50] [PT1-on_info@QuickBackupM/INFO]: [QBM] 备份完成,耗时0.3秒
[MCDR] [12:01:50] [PT1-on_info@QuickBackupM/INFO]: [QBM] 日期: 2020-11-29 12:01:50; 注释: 空
[Server] [12:01:50] [Server thread/INFO]: Automatic saving is now enabled
!!qb list
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: 【槽位信息】
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位1] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位2] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位3] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位4] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位5] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位6] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位7] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位8] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位9] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: [槽位10] None
[MCDR] [12:02:04] [PT3-on_info@QuickBackupM/INFO]: 备份总占用空间: 9.71 MB

在1.15.2版本中MCDR使用回档指令无法回档

我在使用qb back并qb confirm后出现这样几行代码:
Wait for server to stop
Exception in thread on_info@QuickBackupM:
Traceback (most recent call last):
File "C:\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Python\Python38-32\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "./plugins/QuickBackupM.py", line 345, in on_info
onServerInfo(server, info2)
File "./plugins/QuickBackupM.py", line 331, in onServerInfo
confirm_restore(server, info)
File "./plugins/QuickBackupM.py", line 252, in confirm_restore
while server.is_server_running():
AttributeError: 'ServerInterface' object has no attribute 'is_server_running'
后面接着就是正常服务器关闭后的文件保存,然后出现两行提示信息:
[MCDR] [14:35:29] [MainThread/INFO]: 等待服务端进程停止
[MCDR] [14:35:29] [MainThread/INFO]: 服务端进程返回代码: 0
最后就停在这不动弹了,请问怎么解决

'posix.DirEntry' object has no attribute 'encode'

Sys:Debian12;MC:fabric1.16.5 ;Java:jdk-17 ;MCDR:2.7.2 ; Python:3.11.2 qb: M-1.7.0

log:

!!qb make 注释
[Server] [17:32:16] [Server thread/INFO]: Automatic saving is now disabled
[Server] [17:32:16] [Server thread/INFO]: Saving the game (this may take a moment!)
[Server] [17:32:16] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[Server] [17:32:16] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[Server] [17:32:16] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[Server] [17:32:16] [Server thread/INFO]: Saved the game
[MCDR] [17:32:16] [QBM - create/INFO] [quick_backup_multi]: Slot 1 (None) is deleted to provide spaces for the incoming backup
[MCDR] [17:32:16] [QBM - create/INFO] [quick_backup_multi]: copying ./server/world -> ./qb_multi/slot1/world
[MCDR] [17:32:16] [QBM - create/ERROR]: [QBM] Error creating backup
Traceback (most recent call last):
File "plugins/[备份]QuickBackupM-v1.7.0.mcdr/quick_backup_multi/init.py", line 304, in _create_backup
copy_worlds(config.server_path, slot_path)
File "plugins/[备份]QuickBackupM-v1.7.0.mcdr/quick_backup_multi/init.py", line 61, in copy_worlds
shutil.copytree(src_path, dst_path, ignore=lambda path, files: set(filter(config.is_file_ignored, files)))
File "/usr/lib/python3.11/shutil.py", line 561, in copytree
return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/shutil.py", line 497, in _copytree
copytree(srcobj, dstname, symlinks, ignore, copy_function,
File "/usr/lib/python3.11/shutil.py", line 561, in copytree
return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/shutil.py", line 497, in _copytree
copytree(srcobj, dstname, symlinks, ignore, copy_function,
File "/usr/lib/python3.11/shutil.py", line 561, in copytree
return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/shutil.py", line 501, in _copytree
copy_function(srcobj, dstname)
File "/usr/lib/python3.11/shutil.py", line 436, in copy2
copyfile(src, dst, follow_symlinks=follow_symlinks)
File "/home/t_sandland/.local/lib/python3.11/site-packages/speedcopy/init.py", line 183, in copyfile
fs_src_type = FilesystemInfo().filesystem(src.encode('utf-8'))
^^^^^^^^^^
AttributeError: 'posix.DirEntry' object has no attribute 'encode'
[Server] [17:32:16] [Server thread/INFO]: Automatic saving is now enabled

求助. . . .

1.12版本服务器无法完成备份

[Server] [22:34:29] [Server thread/INFO]: Turned off world auto-saving§r
[Server] [22:34:29] [Server thread/INFO]: Saving...§r
[Server] [22:34:30] [Server thread/INFO]: Saved the world§r

以上是Catserver 1.12服务器后台返回的信息, 返回的并非Saved the game导致无法完成备份

在tar,tar_gz,tar_xz备份模式下并未忽略ignored_files内的文件

环境:Windows 11,Ubuntu 22.04(Docker)
MCDR版本:2.10.2
QuickBackupM版本:1.9.0
服务端版本:Fabric 0.14.21 with Minecraft 1.20.1
Python 3.10.8
复现过程:将备份文件的格式设为tar,tar_gz,tar_xz这三种模式的任意一种,然后在MCDR控制台内运行!!qb make,在Windows上会报出如下错误:

[MCDR] [21:13:20] [QBM - create/INFO]: [QBM] 备份中...请稍等
[Server] [21:13:20] [Server thread/INFO]: Automatic saving is now disabled
[Server] [21:13:20] [Server thread/INFO]: Saving the game (this may take a moment!)
[Server] [21:13:20] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[Server] [21:13:20] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[Server] [21:13:20] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[Server] [21:13:20] [Server thread/INFO]: ThreadedAnvilChunkStorage: All dimensions are saved
[Server] [21:13:20] [Server thread/INFO]: Saved the game
[MCDR] [21:13:20] [QBM - create/INFO] [quick_backup_multi]: Slot 1 (None) is deleted to provide spaces for the incomingp
[MCDR] [21:13:20] [QBM - create/INFO] [quick_backup_multi]: storing ./server\world -> ./qb_multi\slot1\backup.tar.xz
[MCDR] [21:13:22] [QBM - create/ERROR]: [QBM] Error creating backup
Traceback (most recent call last):
  File "plugins\QuickBackupM-v1.9.0.mcdr\quick_backup_multi\__init__.py", line 408, in _create_backup
    copy_worlds(config.server_path, slot_path, CopyWorldIntent.backup)
  File "plugins\QuickBackupM-v1.9.0.mcdr\quick_backup_multi\__init__.py", line 169, in copy_worlds
    backup_file.add(src_path, arcname=world, filter=tar_filter)
  File "D:\Program_File\python\lib\tarfile.py", line 2008, in add
    self.add(os.path.join(name, f), os.path.join(arcname, f),
  File "D:\Program_File\python\lib\tarfile.py", line 2002, in add
    self.addfile(tarinfo, f)
  File "D:\Program_File\python\lib\tarfile.py", line 2030, in addfile
    copyfileobj(fileobj, self.fileobj, tarinfo.size, bufsize=bufsize)
  File "D:\Program_File\python\lib\tarfile.py", line 254, in copyfileobj
    buf = src.read(remainder)
PermissionError: [Errno 13] Permission denied
[MCDR] [21:13:22] [QBM - create/INFO]: [QBM] 备份失败,错误代码[Errno 13] Permission denied

在Linux上,不会出现能在控制台里看见的错误,但是备份文件里依然会包含ignored_files里的文件

存取被拒

PermissionError: [WinError 5] 存取被拒。: './qb_multi\slot2\world\data'
[MCDR] [23:27:25] [QBM - create/INFO]: [QBM] Back up unsuccessfully, error code [WinError 5] 存取被拒。: './qb_multi\slot2\world\data'

在搭配TimedQBM時發現此問題,在五個slot都存檔後會發生此問題,在刪除任意一個slot裡面的文件後會修復,應該是無法覆蓋的緣故,需要額外加入對特定slot刪除並覆蓋的動作。

无权限玩家输入指令依旧可以执行

# MCDR permission check global MinimumPermissionLevel if cmd_len >= 2 and command[1] in MinimumPermissionLevel.keys(): if server.get_permission_level(info) < MinimumPermissionLevel[command[0]]: print_message(server, info, '§c权限不足!§r') return
更改为
# MCDR permission check global MinimumPermissionLevel if cmd_len >= 2 and command[1] in MinimumPermissionLevel.keys(): if server.get_permission_level(info) < MinimumPermissionLevel[command[1]]: print_message(server, info, '§c权限不足!§r') return

聊天窗口无法点击指令

mc版本1.19.2 最新MCDR中,运行QBM,在聊天窗口处,点击提示信息无任何反应,比如回档中,提示点击确认,点击后无任何反应,需要自己手动输入confitm指令

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.