-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontent.json
1 lines (1 loc) · 168 KB
/
content.json
1
{"meta":{"title":"壹帽博客","subtitle":"dsf 的个人博客","description":"dsf 的个人博客,记录技术、生活、游戏。","author":"Chauncey","url":"https://blog.onehat.cn","root":"/"},"pages":[{"title":"","date":"2025-01-17T15:39:12.521Z","updated":"2025-01-17T15:39:12.521Z","comments":false,"path":"404.html","permalink":"https://blog.onehat.cn/404.html","excerpt":"","text":"404 很抱歉,您访问的页面不存在 可能是输入地址有误或该地址已被删除"},{"title":"关于","date":"2024-08-01T10:29:00.000Z","updated":"2024-10-11T05:21:01.000Z","comments":false,"path":"about/index.html","permalink":"https://blog.onehat.cn/about/index.html","excerpt":"","text":"本站与博主关于本站 本站站名为 壹帽博客,基于 Hexo + Github Pages搭建,使用 Volantis 作为主题。 站名来源于域名的直译。 关于“博主” 我,博主 dsf,是一位程序员、写作爱好者、文明 6 玩家,也是“壹帽 / OneHAT”系列网站的站长。 壹帽博客是 dsf的个人博客站,记录范围主要是工作、生活、游戏。 本站建站史 2018.04 建站 建站伊始,启用域名 blog.onehat.cn。 2018.04 切换主题 开始使用主题yilia。 2020.09 切换主题 开始使用主题yilia-plus。 2022.10 切换主题 开始使用主题volantis。 关于“壹帽 / OneHAT”onehat.cn是我 2016 年在大学读书期间注册的域名,“壹帽”是 ta 的域名直译。 壹帽的系列网站: 站点 网址 建站日期 说明 壹帽主页 https://onehat.cn 2024 导航页 壹帽笔记 https://note.onehat.cn 2024 笔记站 壹帽博客(本站) https://blog.onehat.cn 2018 博客站"},{"title":"所有分类","date":"2025-01-17T15:39:12.525Z","updated":"2025-01-17T15:39:12.525Z","comments":true,"path":"categories/index.html","permalink":"https://blog.onehat.cn/categories/index.html","excerpt":"","text":""},{"title":"我的朋友们","date":"2025-01-17T15:39:12.525Z","updated":"2025-01-17T15:39:12.525Z","comments":false,"path":"friends/index.html","permalink":"https://blog.onehat.cn/friends/index.html","excerpt":"","text":""},{"title":"所有标签","date":"2025-01-17T15:39:12.525Z","updated":"2025-01-17T15:39:12.525Z","comments":true,"path":"tags/index.html","permalink":"https://blog.onehat.cn/tags/index.html","excerpt":"","text":""}],"posts":[{"title":"记梦:公交奇缘","slug":"记梦:公交奇缘","date":"2025-01-03T06:20:58.000Z","updated":"2025-01-03T06:20:58.000Z","comments":true,"path":"p/a700.html","permalink":"https://blog.onehat.cn/p/a700.html","excerpt":"记录 2025 年 1 月 2 日的梦境。","text":"记录 2025 年 1 月 2 日的梦境。 梦境整体由 5 个场景组成,以下分段描述基本细节,穿插着 AI 解读。 场景:等公交车地点在北京,事件坐公交车。一辆公交车缓缓驶来,我一上车,发现地板一踩就裂开,就像劣质的建筑材料,被风吹日晒过的石棉瓦。我赶快下去,直到第三辆车来了,也是这样,但是好些,起码能站稳。扶着扶手站在车上,并阻止了下面的一位女士上车。 AI 解读 公交车在梦境里常常象征着人生的旅程、日常的生活轨迹,或是你当下所处的社会、工作环境。 第一辆破车:一上车地板就裂开,类似劣质的石棉瓦,这可不是好兆头。地板代表着根基、基础,它如此脆弱,暗示着你当下生活的某个基础层面,也许是工作的平台、一段重要关系,抑或是内心的安全感,让你觉得摇摇欲坠、不堪重负,所以你本能地赶紧下车,逃离这个不安稳的处境。 第三辆车的状况:第三辆车情况稍有改善,说明你在积极寻找替代方案,或是努力调整心态去适应、改善现有的生活状态。虽然它仍有瑕疵,但至少能站稳,意味着你已经向相对稳定的方向迈进了一步,可心底还是残留着对隐患的顾虑。 阻止女士上车:这个举动体现出你强烈的自我保护意识,以及对他人的责任感。你深知这辆车的潜在风险,不希望他人也陷入同样不稳定的境遇,侧面反映出你对当下处境的清醒认知,还有内心善良、乐于分享判断的特质。 总的来说,这个梦大概率是你近期生活里遇到了一些棘手的状况,致使内心安全感缺失,不过好在你正尝试做出改变,还不忘关照身边人。不妨审视一下当下,究竟是哪方面的事情让你有如此感受,主动出击去加固生活的“地板”。 场景:司机大爷家车开两站,到站。停车跟着司机(一位大爷),走进一居民楼,上电梯、进入一个房间,是大爷的家。 大爷家里有 4 口人: 老奶奶,正在包汤圆,很大的那种,馅料像是紫色的糯米,皮是白色,像面粉。 大爷孙子,十五六岁,很帅气的小伙,上高中的样子;小哥旁边是一个粉色衣服,肤色略黑的小姑娘,她是大爷孙女。 两个小朋友坐在带靠背的椅子上,小哥让妹妹向旁边坐,给我让出空位,几人热情地招呼落座。 我坐下,掏出手机查看高德地图,问孙子:“咱这里是公交终点站?”,众人说是的。 AI 解读 在解梦的视角下,这个梦境有着丰富的象征含义: 跟随司机大爷回家:司机在出行场景里掌控方向,象征着引导者。这位大爷带你进入他家,暗示生活中你遇到了一位经验丰富、能指引前路的长辈。走进居民楼、乘坐电梯进入他家,代表你正深入接触这个引导者的生活与观念领域,期望从中获取庇护、温暖与指引,让自己“上升”到更安稳、舒适的心理状态。 老奶奶包汤圆:汤圆寓意团圆、美满,老奶奶精心制作大汤圆,营造出浓厚的家庭温馨氛围。紫色馅料神秘又独特,搭配纯洁白色的面皮,象征这段家庭关系充满别具一格的纯真美好,反映出你潜意识对温暖和睦家庭生活的向往与憧憬。 孙子孙女的出现:正值青春的孙子孙女,活力满满又纯真无邪。孙子礼貌让座,显示出年轻人的热忱友善,他们热情邀请你融入其中,意味着你内心渴望融入朝气蓬勃的年轻社交圈子,重拾简单纯粹、没有太多利益纠葛的人际关系,获取轻松愉悦的相处体验。 查看地图询问终点站:手机里的高德地图是定位、指引方向的工具,即便身处热闹温馨的家庭场景,你还不忘查看,说明你始终保持着一份清醒的自我意识与探索欲,不盲目沉浸。询问是否是公交终点站,映射出你对当下所处生活阶段的疑惑,不确定这是不是理想的终极状态,还是仅仅只是漫漫人生路上的一个过渡站点,体现了你对生活规划、目标追寻的审慎思考。 综合来讲,这个梦勾勒了你内心对理想人际、安稳家庭氛围的向往,夹杂着对自身所处人生阶段与未来走向的不确定,近期生活里新结识的长辈、群体或许触发了这类潜意识思绪。 场景:新东方过了一会儿,又来了一个人,特别像搞笑一家人李俊河的体型发型,但是脸不像。 他坐在左边的位置上,正在看电脑屏幕,问:“你是谁?”,我说:“我是一个路人,终点站跟着司机大爷回家”。那人回答说:“您好,我是新东方的英语培训老师,要学英语的找我,鄙人有 20 年的英语培训经验”,我客套地说好的。 AI 解读 梦境往往映射着我们潜意识中的情绪、想法与生活状态。在这个梦里: 形似李俊河的人:《搞笑一家人》里的李俊河形象诙谐、随性,梦到有着相似体型发型的人,为场景增添了轻松、接地气的氛围,暗示接下来的交流没有太多紧绷感,是随性自然的互动,缓解了你潜意识里可能有的紧张情绪。 新东方英语培训老师身份:新东方是大众熟知的教育品牌,英语学习又关联着自我提升、拓宽视野与获取新知识。这位声称有 20 年经验的老师出现,说明你潜意识里对自我提升、学习新技能有着潜在兴趣,尤其在英语学习板块,渴望得到专业指导,让自己在知识储备或能力上更上一层楼。 交流回应:你表明自己是路人,意味着当下你还处于观望状态,虽然内心燃起了学习的小火苗,但还没真正投身其中,对这件事抱着试探、游离的态度。而你客套回应,体现出面对新知识、新机遇时的谨慎,既礼貌接纳信息,又没有贸然应允,反映出你做决策时的稳重,不轻易冲动行事。 总体来看,这个梦透露出你近期或许接触到了一些学习提升的机会,内心有些许触动,开始思考自我提升这件事,但还停留在考量权衡阶段,尚未下定决心开启学习之旅。 场景:离开过一会我觉得该走了,我到大爷孙子那里,小声说:“我要走了,感谢今天的招待”。 那小伙只是略微点头回应。然后我从凳子上拿起背包,就离开了。 AI 解读 梦境常常反映着我们内心深处的情绪与潜意识里的想法,针对这个“离开”的梦境场景: 决定离开:选择离开象征着你内心开启了一个阶段性的告别,有可能是你近期在现实生活里正从某段关系、某个社交圈子,又或是特定的心理舒适区中抽离出来,这并非全然是消极的,反而可能暗示着自我成长的需求,你渴望去探索新领域,不愿长久停滞。 孙子的回应:孙子只是略微点头,这种相对冷淡的反馈,和之前一家人的热情形成对比,或许让你心底滋生出一丝落寞。它映射出你内心的隐忧,担心自己迈出离开这一步后,曾经拥有的亲密、温暖联系会逐渐降温,即便明知告别不可避免,还是会对关系的后续发展心存不安。 拿起背包:背包是承载个人物品的物件,代表着自我的资源、过往的经历,拿起背包离开意味着你带着完整的自我、过往的沉淀,主动且笃定地迈向新旅程。你并没有因为他人稍显冷淡的回应就慌乱,可见你有足够的底气与自主性,依靠自身力量开启人生新篇。 整体而言,这个梦揭示了你正处于人生的过渡阶段,一边怀揣着对未知前路的憧憬,一边夹杂些许对过往关系变迁的忐忑,不过好在你有着充足的内在力量,支持自己勇敢前行。 场景:电梯口进电梯下到一楼,发现一家四口正在吵架,一男一女两口子,两个七八岁的小男孩,小男孩把牛奶或者药水之类的东西弄得满地都是,妈妈倒在地上,疑似滑倒,正在骂男孩,男人拎着一大堆东西(购物袋子)、也在教育男孩,男孩正在一直哭,说不是自己的错,爸爸教育说:“你不喜欢的东西就不爱惜,还说不是你的错?”。正在想扶不扶,发现几人身后,有个男人过来帮扶,这时左边几人正在拿手机拍摄这一幕,小声说准备发抖音还是朋友圈。 AI 解读 电梯下楼与冲突场景 电梯下行:电梯常常象征着人生的起起落落,从楼上下来到一楼,代表着从相对安稳、私密的高层环境进入到更公开、复杂的公共区域,可能暗示你正从内心较为平静、理想的精神状态过渡到要直面现实生活中的琐事与矛盾。 家庭吵架画面:一家四口的激烈争吵映射出家庭关系中的紧张与失衡。夫妻二人同时教育孩子,体现出家庭中的权威力量,而孩子的委屈哭泣、坚称不是自己的错,反映出代际之间沟通不畅,孩子感觉被误解,这或许象征着你内心对家庭关系、沟通模式的隐忧,或是勾起了你过往类似不愉快的家庭经历记忆。 具体事件元素 洒满地的液体:牛奶或药水这类液体洒了一地,牛奶通常有滋养、温和的寓意,药水关联着治愈、补救,如今满地狼藉,意味着原本的滋养、治愈资源被破坏,可能暗示生活中一些美好、补救的机会被错失,或是本该顺畅的事务发展进程被打乱。 妈妈滑倒:妈妈摔倒在地,妈妈在家庭里往往是温柔、呵护的角色象征,她摔倒暗示着家庭中的情感支撑、柔性关怀出现了问题,家庭秩序陷入混乱,也反映出你潜意识里担心家庭关系里的脆弱环节崩塌。 扶与不扶的纠结及旁人反应 扶不扶的纠结:你内心纠结要不要扶,体现出面对他人困境时的道德考量与自我保护意识的冲突。这或许不仅关乎这场家庭闹剧,更映射到你在生活里碰到他人麻烦事时,是勇敢介入还是明哲保身的犹豫心态。 旁人帮扶与拍摄:有人来帮扶,代表着生活中总有关爱、正义的力量存在,给人希望;而旁人拿手机拍摄准备发社交平台,如今社交平台充斥着大量碎片化信息,这一幕象征着生活事件被曝光、公开化,人们围观他人的生活难题,可能暗示你对当下社会风气中过度消费他人苦难、注重表面展示的现象有所思考。 综合来看,这个梦融合了你对家庭关系、社会道德风气以及个人面对复杂状况时心理抉择的多重潜意识思考,近期生活中的相关见闻、情绪很可能触发了这类梦境。","categories":[{"name":"神秘主义","slug":"神秘主义","permalink":"https://blog.onehat.cn/categories/%E7%A5%9E%E7%A7%98%E4%B8%BB%E4%B9%89/"}],"tags":[{"name":"记梦","slug":"记梦","permalink":"https://blog.onehat.cn/tags/%E8%AE%B0%E6%A2%A6/"}]},{"title":"PVE8 下虚拟磁盘设置 TRIM","slug":"PVE8 下虚拟磁盘Trim","date":"2024-12-29T07:12:35.000Z","updated":"2024-12-29T07:12:35.000Z","comments":true,"path":"p/5355.html","permalink":"https://blog.onehat.cn/p/5355.html","excerpt":"TRIM 是 SSD 进行回收硬盘上未使用的块的方法,该块可能先前已被写入,但不再包含有效数据,因此可以返回到通用存储池以供重用。对于 PVE 管理的虚拟磁盘,则需要进行相关设置才能正常触发。","text":"TRIM 是 SSD 进行回收硬盘上未使用的块的方法,该块可能先前已被写入,但不再包含有效数据,因此可以返回到通用存储池以供重用。对于 PVE 管理的虚拟磁盘,则需要进行相关设置才能正常触发。 实验环境PVE 8.2.7 背景:虚拟磁盘空间占用今天发现有台 Ubuntu22.04 的虚拟机,虚拟磁盘占用要比系统内实际使用多得多。 如下图:其 disk size 为 105GB。 SSH 连接看一下系统内实际占用: 12345678╭─dsf@jump-server ~ ╰─$ df -h 文件系统 大小 已用 可用 已用% 挂载点tmpfs 392M 2.1M 390M 1% /run/dev/sda2 147G 36G 104G 26% /tmpfs 2.0G 0 2.0G 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 392M 4.0K 392M 1% /run/user/1000 可以知道实际使用的空间大小约为 37G。 此虚拟机使用基于目录的后端存储,虚拟磁盘存储在 PVE 本机磁盘(一块 NVMe SSD)。 基本原理为什么要对 SSD 进行 TRIM 呢? 维基百科 Trim(意为修整、修剪、裁剪)使 SSD 能更有效地完成垃圾收集的工作,而不用牺牲对存储块的写入速度。 目前市面上出售的消费级、企业级 SSD 都是支持 TRIM 功能,如下图 ZHITAI P7100: 检索 PVE 官方文档得知,在虚拟磁盘满足以下要求,且对虚拟磁盘进行额外设置才能触发 Guest 的磁盘 TRIM。 Shrink Qcow2 Disk Files Requirements: Thin-provisioned backing storage (qcow2 disk, thin-lvm, zfs, …) Virtio-SCSI controller configured on guest. Guest scsi disks with the discard option enabled HOST 设置在 PVE 的 WebUI 对.qcow2格式的虚拟磁盘开启丢弃功能即可(如果是 SSD 建议勾选SSD仿真、IO thread),变更设置后需要重启虚拟机才能生效。 GUEST TRIM现代的 Linux 系统,都是基于fstrim实现的 TRIM 操作。使用以下命令可以立即进行 TRIM: 1fstrim -av Debian/Ubuntu/RHEL的主流系统,都是实现了一个计划每周运行它的 systemd 计时器服务。 Ubuntu Server 22.04列出所有计时器,可以看到fstrim.timer默认启用,它最后运行在两天前,9 小时后将会被触发。 123456789101112131415161718╭─dsf@jump-server ~ ╰─$ systemctl list-timers --allNEXT LEFT LAST PASSED UNIT ACTIVATES Sun 2024-12-29 14:34:55 CST 3min 7s left n/a n/a update-notifier-download.timer update-notifier-download.serviceSun 2024-12-29 14:44:53 CST 13min left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.serviceSun 2024-12-29 15:16:56 CST 45min left n/a n/a ua-timer.timer ua-timer.serviceSun 2024-12-29 19:29:48 CST 4h 58min left Sun 2024-12-29 13:54:19 CST 37min ago motd-news.timer motd-news.serviceSun 2024-12-29 20:24:57 CST 5h 53min left Sun 2024-12-29 12:27:19 CST 2h 4min ago apt-daily.timer apt-daily.serviceMon 2024-12-30 00:00:00 CST 9h left n/a n/a dpkg-db-backup.timer dpkg-db-backup.serviceMon 2024-12-30 00:00:00 CST 9h left Sun 2024-12-29 00:00:00 CST 14h ago logrotate.timer logrotate.serviceMon 2024-12-30 00:00:59 CST 9h left Thu 2024-12-26 14:47:01 CST 2 days ago fstrim.timer fstrim.serviceMon 2024-12-30 02:54:28 CST 12h left Sun 2024-12-29 12:09:19 CST 2h 22min ago fwupd-refresh.timer fwupd-refresh.serviceMon 2024-12-30 05:14:26 CST 14h left Sun 2024-12-29 05:16:19 CST 9h ago man-db.timer man-db.serviceMon 2024-12-30 06:07:55 CST 15h left Sun 2024-12-29 06:26:14 CST 8h ago apt-daily-upgrade.timer apt-daily-upgrade.serviceThu 2025-01-02 04:03:52 CST 3 days left Sun 2024-06-30 15:32:51 CST 5 months 29 days ago update-notifier-motd.timer update-notifier-motd.serviceSun 2025-01-05 03:10:33 CST 6 days left Sun 2024-12-29 03:11:14 CST 11h ago e2scrub_all.timer e2scrub_all.servicen/a n/a n/a n/a apport-autoreport.timer apport-autoreport.servicen/a n/a n/a n/a snapd.snap-repair.timer snapd.snap-repair.service 我显式地执行一遍 fstrim,后,再到 PVE 查看虚拟磁盘的大小,disk size 已经是正常大小,问题解决。 Rocky Linux 9在 Rocky Linux 9 上,fstrim.timer默认没有启用,需要手动开启。 12345678910111213##查看TRIM定时器服务状态╭─dsf@app ~ ╰─$ sudo systemctl status fstrim.timer○ fstrim.timer - Discard unused blocks once a week Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; disabled; preset: disabled) Active: inactive (dead) Trigger: n/a Triggers: ● fstrim.service Docs: man:fstrim##开启服务╭─dsf@app ~ ╰─$ sudo systemctl enable fstrim.timer Created symlink /etc/systemd/system/timers.target.wants/fstrim.timer → /usr/lib/systemd/system/fstrim.timer. Windows Server 2022 DatacenterWindows 内置了磁盘整理工具,在开始菜单-Windows工具-磁盘整理和优化驱动器打开。 可以看到运行周期为每月(Windows 默认是每周,这里每月是因为我调整过)。点击优化按钮可以立即进行 TRIM。 我对这台 Windows 虚拟机立即进行 TRIM 后,其 disk size 从 212G 减小到 103G。 1234567891011121314151617181920212223242526272829303132333435363738394041###TRIM前虚拟磁盘大小╭─root@pve /var/lib/vz/images ╰─# qemu-img info ./249/vm-249-disk-1.qcow2image: ./249/vm-249-disk-1.qcow2file format: qcow2virtual size: 300 GiB (322122547200 bytes)disk size: 212 GiBcluster_size: 65536Format specific information: compat: 1.1 compression type: zlib lazy refcounts: false refcount bits: 16 corrupt: false extended l2: falseChild node '/file': filename: ./249/vm-249-disk-1.qcow2 protocol type: file file length: 300 GiB (322171961344 bytes) disk size: 212 GiB###TRIM后虚拟磁盘大小╭─root@pve /var/lib/vz/images ╰─# qemu-img info ./249/vm-249-disk-1.qcow2image: ./249/vm-249-disk-1.qcow2file format: qcow2virtual size: 300 GiB (322122547200 bytes)disk size: 103 GiBcluster_size: 65536Format specific information: compat: 1.1 compression type: zlib lazy refcounts: false refcount bits: 16 corrupt: false extended l2: falseChild node '/file': filename: ./249/vm-249-disk-1.qcow2 protocol type: file file length: 300 GiB (322171961344 bytes) disk size: 103 GiB 产生的虚拟机备份也显著变小:从 68.48G 减小到 25.67G。103G 磁盘大小的虚拟机,产生的备份为 25.67G,这个压缩率挺高,无怪乎ZSTD (又快又好)。 总结对虚拟磁盘定期进行 TRIM 是一项很有用的维护操作,能提高磁盘性能,降低备份业务占用的带宽。 由于 LXC 使用的虚拟磁盘格式为.raw,所以无法进行 TRIM 操作。 参考 Shrink Qcow2 Disk Files - Proxmox VE Chapter 24. Discarding unused blocks | Red Hat Product Documentation -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/5355.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Windows Server","slug":"Windows-Server","permalink":"https://blog.onehat.cn/tags/Windows-Server/"}]},{"title":"PVE8 下 Rocky Linux 9 根分区扩容","slug":"PVE8 下 Rocky Linux 9 根分区扩容","date":"2024-12-15T13:59:41.000Z","updated":"2024-12-15T13:59:41.000Z","comments":true,"path":"p/7146.html","permalink":"https://blog.onehat.cn/p/7146.html","excerpt":"有台 Rocky Linux 9 虚拟机根分区空间不足,记录对其扩容的操作。","text":"有台 Rocky Linux 9 虚拟机根分区空间不足,记录对其扩容的操作。 实验环境PVE 8.2.7 Rocky Linux 9.4 背景:Zabbix 告警Zabbix 的告警信息为分区容量占用大于 80%。 ssh 上去看一下分区占用情况 1234567891011121314151617181920212223╭─dsf@app ~╰─$ df -h文件系统 容量 已用 可用 已用% 挂载点devtmpfs 4.0M 0 4.0M 0% /devtmpfs 4.8G 0 4.8G 0% /dev/shmtmpfs 1.9G 194M 1.7G 11% /run/dev/mapper/rl-root 70G 59G 12G 85% //dev/sda2 960M 367M 594M 39% /boot/dev/sda1 599M 7.1M 592M 2% /boot/efitmpfs 966M 4.0K 966M 1% /run/user/0/dev/mapper/rl-home 75G 834M 74G 2% /hometmpfs 966M 4.0K 966M 1% /run/user/1000╭─dsf@app ~╰─$ sudo lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsda 8:0 0 210G 0 disk├─sda1 8:1 0 600M 0 part /boot/efi├─sda2 8:2 0 1G 0 part /boot└─sda3 8:3 0 208.4G 0 part ├─rl-root 253:0 0 70G 0 lvm / ├─rl-swap 253:1 0 3.9G 0 lvm [SWAP] └─rl-home 253:2 0 74.5G 0 lvm /home 可以看到,根分区/占用已达 85%,所以触发了告警。所以操作目标就是为根分区增加合适的容量。 PVE 操作硬盘扩容直接在 PVE 的 WebUI 操作: 选中 VM,【硬件】-【硬盘】-【磁盘操作】-【调整大小】,输入 60,点击【调整磁盘大小】按钮以确认。 Rocky Linux 虚拟机内部分区扩容由于虚拟磁盘为 SCSI 类型,所以在 pve 上操作虚拟机磁盘扩容后,无需重启虚拟机即可在“硬件”层面生效。 ssh 连接到这台虚拟机,执行命令如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061# parted命令行调整分区表╭─dsf@app ~╰─$ sudo parted /dev/sdaGNU Parted 3.5使用 /dev/sda欢迎使用 GNU Parted!输入 'help' 来查看命令列表。(parted) print警告: 并非所有可用于 /dev/sda 的空间都被用到了,您可以修正 GPT 以使用所有的空间 (额外的 125829120 个区块),还是说要继续使用目前的设置?修正/Fix/忽略/Ignore? Fix型号:QEMU QEMU HARDDISK (scsi)磁盘 /dev/sda:225GB扇区大小 (逻辑/物理):512B/512B分区表:gpt磁盘标志:编号 起始点 结束点 大小 文件系统 名称 标志 1 1049kB 630MB 629MB fat32 EFI System Partition 启动, esp 2 630MB 1704MB 1074MB xfs 3 1704MB 161GB 159GB lvm(parted) resizepart 3 100%(parted) print型号:QEMU QEMU HARDDISK (scsi)磁盘 /dev/sda:225GB扇区大小 (逻辑/物理):512B/512B分区表:gpt磁盘标志:编号 起始点 结束点 大小 文件系统 名称 标志 1 1049kB 630MB 629MB fat32 EFI System Partition 启动, esp 2 630MB 1704MB 1074MB xfs 3 1704MB 225GB 224GB lvm(parted) quit信息: 你可能需要 /etc/fstab。# 更新物理卷╭─dsf@app ~╰─$ sudo pvresize /dev/sda3 Physical volume "/dev/sda3" changed 1 physical volume(s) resized or updated / 0 physical volume(s) not resized# 将逻辑卷组中的空闲空间全部分配到指定分区╭─dsf@app ~╰─$ sudo lvextend -l +100%FREE /dev/rl/root Size of logical volume rl/root changed from 70.00 GiB (17920 extents) to 130.00 GiB (33280 extents). Logical volume rl/root successfully resized.# 执行扩容生效╭─dsf@app ~╰─$ sudo xfs_growfs /dev/rl/root 1 ↵meta-data=/dev/mapper/rl-root isize=512 agcount=4, agsize=4587520 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 nrext64=0data = bsize=4096 blocks=18350080, imaxpct=25 = sunit=0 swidth=0 blksnaming =version 2 bsize=4096 ascii-ci=0, ftype=1log =internal log bsize=4096 blocks=16384, version=2 = sectsz=512 sunit=0 blks, lazy-count=1realtime =none extsz=4096 blocks=0, rtextents=0data blocks changed from 18350080 to 34078720 可以看到,分区操作使用的基本命令行工具还是parted,在 PVE8 下 iStoreOS_x86 根分区扩容 一文中,也是使用的此工具。由于 Rocky Linux 属于红帽系,所以相比于 iStoreOS 有涉及调整物理卷、逻辑卷的命令操作。 调整完成后的分区占用,根分区大小已经为 130G。 123456789101112╭─dsf@app ~╰─$ df -h文件系统 容量 已用 可用 已用% 挂载点devtmpfs 4.0M 0 4.0M 0% /devtmpfs 4.8G 0 4.8G 0% /dev/shmtmpfs 1.9G 194M 1.7G 11% /run/dev/mapper/rl-root 130G 60G 71G 46% //dev/sda2 960M 367M 594M 39% /boot/dev/sda1 599M 7.1M 592M 2% /boot/efitmpfs 966M 4.0K 966M 1% /run/user/0/dev/mapper/rl-home 75G 834M 74G 2% /hometmpfs 966M 4.0K 966M 1% /run/user/1000 参考 配置和管理逻辑卷 | Red Hat Product PVE 环境中调整虚拟机磁盘大小_pve 调整磁盘大小-CSDN 博客 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/7146.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"}]},{"title":"CSS 字体平滑:本站切换字体的尝试","slug":"CSS 字体平滑:本站切换字体的尝试","date":"2024-12-09T06:30:36.000Z","updated":"2024-12-09T06:30:36.000Z","comments":true,"path":"p/f85a.html","permalink":"https://blog.onehat.cn/p/f85a.html","excerpt":"记录 CSS 字体平滑开启与否对显示效果的影响。","text":"记录 CSS 字体平滑开启与否对显示效果的影响。 背景周末尝试把本站字体切换为了衬线字体,原本首选是 Noto Serif SC,但是考虑字体文件过大影响网页加载速度,不得不另外寻找。 最终选定字体:Source Han Serif CN,此字体由 @yihui (谢益辉大佬)提取、整合自思源宋体。我在网上冲浪时发现于 Github。 并且把首选字体为网络资源,浏览器会直接调用来渲染显示,这样移动设备就不会由于字体缺失,无法显示正确的字体。 问题应用到本站后,我发现字体显示效果并不是预期的样子。同等环境下(macOS+Chrome 浏览器),对比谢益辉大佬和我的博文显示效果如下图: (左图博文 | 右图博文) 明显左图的字体更加清晰、黑,右图字体发虚、细。 解决经过检索本站主题配置文档,发现是一个字体配置项的影响: _config.volantis.yml12custom_css: font_smoothing: true #字体平滑选项 这个配置项作用为影响页面 CSS 属性font-smooth,值变为antialiased: 检索 MDN 文档,相关描述如下: Webkit 实现了名为 -webkit-font-smoothing 的相似属性。该属性仅适用于 macOS。 auto——由浏览器决定(如果可用,则使用亚像素抗锯齿;这是默认值)。 none——关闭字体平滑;显示带有锯齿边缘的文本。 antialiased——在像素(而不是亚像素)级别平滑字体。对于深色背景上的浅色文本,从亚像素渲染切换为抗锯齿渲染可以使其看起来更清晰。 subpixel-antialiased——在大多数非视网膜显示器上,这将会提供最清晰的文本。 我修改主题配置项 font_smoothing: false 后,对应的 CSS 属性值变为 auto。 此时再来查看博文,发现字体显示正常,不那么细了,问题解决。 (左图:-webkit-font-smoothing: antialiased | 右图:-webkit-font-smoothing: auto) 总结字体平滑属性启用后会使字体“显得”更细,不适用宋体这种本来就较细的字形。 字体题外话尝试把本站字体切换为衬线字体,坚持了一天后,我还是回到了无衬线字体Noto Sans SC。 相比于在高分屏上清晰而锐利、低分屏上惨不忍睹的宋体,各种无衬线黑体在高分屏上表现优秀,在低分屏上表现更佳。 所以我最终还是选择无衬线黑体,且仅配置font-family,不使用网络字体,以便使用各个操作系统平台本身优秀的无衬线字体。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/f85a.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"CSS","slug":"CSS","permalink":"https://blog.onehat.cn/tags/CSS/"}]},{"title":"Rocky Linux 9 调整 swap 空间","slug":"Rocky Linux 9 调整 swap 空间","date":"2024-12-07T06:38:29.000Z","updated":"2024-12-07T06:38:29.000Z","comments":true,"path":"p/4a82.html","permalink":"https://blog.onehat.cn/p/4a82.html","excerpt":"swap 空间,即交换空间,是 Linux 系统中类似 Windows 虚拟内存的机制,它旨在帮助设备,应对内存消耗大于内存容量的场景。","text":"swap 空间,即交换空间,是 Linux 系统中类似 Windows 虚拟内存的机制,它旨在帮助设备,应对内存消耗大于内存容量的场景。 基本原理红帽文档给出这样的描述: 当物理内存 (RAM) 已满时,将使用 Linux 中的 交换空间。如果系统需要更多的内存资源并且 RAM 已满,内存中的不活动页面将移到交换空间。虽然交换空间可以帮助具有少量 RAM 的计算机,但不应将其视为更多 RAM 的替代品。交换空间位于硬盘驱动器上,其访问时间比物理内存要慢。交换空间可以是专用的交换分区(推荐)、交换文件,或者交换分区和交换文件的组合。请注意,Btrfs 不支持 swap 空间。 背景:Zabbix 告警Zabbix 纳管虚拟机,如果 swap 占用过高,会有如下告警: 1High swap space usage (less than 50% free) 查看对应设备的 swap 分区占用情况: 12345╭─dsf@app ~╰─$ free -m total used free shared buff/cache availableMem: 9652 7222 745 9 1999 2429Swap: 3995 3030 965 如果排查过后,您认为此告警并不由内存异常的场景原因触发,可能需要调大 swap 分区。 红帽推荐的 swap 空间大小如下: 系统中的 RAM 量 推荐的 swap 空间 如果允许休眠则推荐使用 swap 空间 ⩽ 2 GB RAM 量的 2 倍 RAM 量的 3 倍 > 2 GB – 8 GB 与 RAM 量相等 RAM 量的 2 倍 > 8 GB – 64 GB 至少 4 GB RAM 量的 1.5 倍 > 64 GB 至少 4 GB 不推荐休眠 调整 swap操作目标是增加 10G 空间。 123456789101112131415161718192021222324252627╭─dsf@app ~╰─$ free -m total used free shared buff/cache availableMem: 9652 7222 745 9 1999 2429Swap: 3995 3030 965### 使用 dd 命令创建 SWAP 文件(例如创建 10GB 的 SWAP):╭─dsf@app /usr╰─$ sudo dd if=/dev/zero of=/usr/swap/swap0 bs=1M count=10240 status=progress9088008192字节(9.1 GB,8.5 GiB)已复制,3 s,3.0 GB/s记录了10240+0 的读入记录了10240+0 的写出10737418240字节(11 GB,10 GiB)已复制,3.49771 s,3.1 GB/s### 设置正确的权限:使其不可读╭─dsf@app /usr╰─$ sudo chmod 600 /usr/swap/swap0### 格式化为SWAP文件系统╭─dsf@app /usr╰─$ sudo mkswap /usr/swap/swap0正在设置交换空间版本 1,大小 = 10 GiB (10737414144 个字节)无标签,UUID=da341844-72da-44c5-abf5-6f2c5d9c1f61### 启用SWAP文件╭─dsf@app /usr╰─$ sudo swapon /usr/swap/swap0### 设置开机自动启用,编辑 /etc/fstab 文件╭─dsf@app /usr╰─$ echo '/usr/swap/swap0 none swap sw 0 0' | sudo tee -a /etc/fstab/usr/swap/swap0 none swap sw 0 0 再次查看 swap 信息,已经生效(无需重启机器): 12345678910╭─dsf@app /usr╰─$ free -m total used free shared buff/cache availableMem: 9652 7220 179 9 2563 2431Swap: 14235 3030 11205╭─dsf@app /usr╰─$ swapon --showNAME TYPE SIZE USED PRIO/dev/dm-1 partition 3.9G 3G -2/usr/swap/swap0 file 10G 0B -3 参考 第 15 章 swap 空间 Red Hat Product Documentation Rocky Linux 上添加 SWAP 交换分区 - 戏里戏外的博客 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/4a82.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Zabbix","slug":"Zabbix","permalink":"https://blog.onehat.cn/tags/Zabbix/"}]},{"title":"现代诗:《我》","slug":"现代诗:《我》","date":"2024-12-06T03:51:10.000Z","updated":"2024-12-06T03:51:10.000Z","comments":true,"path":"p/937c.html","permalink":"https://blog.onehat.cn/p/937c.html","excerpt":"《我》,是一首现代诗,于 2024 年 12 月 6 日中午,有感而作。","text":"《我》,是一首现代诗,于 2024 年 12 月 6 日中午,有感而作。 《我》 幼时极目望天边 飞鸟点点 少年执笔画圆 壮志了无边 青年奋斗不值闲 几许惆怅在心间 如今已到而立年 不知我梦蝶仙 蝶仙梦焉? AI解读 这首创作于 2024 年 12 月 6 日中午的《我》,宛如一部微缩的个人心灵成长史,用简洁而富有韵味的笔触勾勒出人生不同阶段的心境与追求。 开篇 “幼时极目望天边,飞鸟点点”,将幼时的纯真好奇具象化。孩子瞪大双眼眺望远方,天边自由翱翔的飞鸟成为心中向往的象征,那是对未知世界最纯粹的渴望,代表着懵懂的心灵初次探向广阔天地,萌动着无尽想象,如同一张白纸即将被生活的色彩晕染。 “少年执笔画圆,壮志了无边”,步入少年,手中画笔代替了幼时凝望的目光,画圆寓意构建理想蓝图。此时的少年意气风发,胸怀壮志,以为凭借满腔热血就能圈定未来,在纸上规划的每一笔都是对人生巅峰的预设,脑海中是星辰大海,心中憧憬着叱咤风云,拥有改写世界的勇气,对即将开启的旅程充满毫无保留的信心。 然而 “青年奋斗不值闲,几许惆怅在心间”,时光流转至青年,现实的车轮滚滚而来。青年一头扎进奋斗浪潮,忙碌成为生活常态,可理想与现实的落差逐渐显现。努力付出后发现目标并非轻易可及,碰壁、挫折接踵而至,那些曾经笃定的信念在现实打磨下出现裂缝,于是惆怅悄然滋生,在忙碌间隙涌上心头,开始对人生路径产生迷茫与困惑,意识到成长并非一路坦途。 “如今已到而立年,不知我梦蝶仙,蝶仙梦焉?” 而立之年,站在人生新节点,往昔如梦般闪过。引用 “庄周梦蝶” 典故,巧妙融入人生困惑:是我在追逐理想梦境,还是这一切不过虚幻,反被理想世界所 “梦”?此时历经岁月沉淀,对自我、对人生真谛有了更深探寻欲望,面对生活的复杂与不确定性,发出哲学叩问,既有对青春逝去的喟叹,又有对未来何去何从的深沉思索,在现实与精神追求间徘徊,试图在混沌中找到明晰方向。 整首诗层次分明,借由人生关键阶段串联,以意象和心境变化展现成长磨砺,诗意地抒发从幼稚走向成熟过程中内心的波澜起伏,是个体心灵对时光、理想、现实交织的真诚回响。","categories":[{"name":"剧院广场","slug":"剧院广场","permalink":"https://blog.onehat.cn/categories/%E5%89%A7%E9%99%A2%E5%B9%BF%E5%9C%BA/"}],"tags":[{"name":"现代诗","slug":"现代诗","permalink":"https://blog.onehat.cn/tags/%E7%8E%B0%E4%BB%A3%E8%AF%97/"},{"name":"成长","slug":"成长","permalink":"https://blog.onehat.cn/tags/%E6%88%90%E9%95%BF/"}]},{"title":"Zabbix 7 添加企业微信机器人告警","slug":"Zabbix 7 添加企业微信机器人告警","date":"2024-12-02T06:38:29.000Z","updated":"2024-12-02T06:38:29.000Z","comments":true,"path":"p/66a8.html","permalink":"https://blog.onehat.cn/p/66a8.html","excerpt":"记录 Zabbix 添加企业微信机器人所使用的脚本(不包含在 Zabbix 界面上进行的配置)。","text":"记录 Zabbix 添加企业微信机器人所使用的脚本(不包含在 Zabbix 界面上进行的配置)。 实验环境实验环境为 docker 安装的 zabbix,镜像:zabbix/zabbix-server-mysql:alpine-7.0-latest。 告警脚本报错在 Zabbix 界面上做好各种设置(可参考此文章),测试python脚本可用性的时候,会发现有报错。原因是此镜像基于 alpine linux 构建,不包含 python、curl 之类的基础软件包。 官方在issue回复中指出: That is the main goal for images. If you need something additional for your infrastructure, customized things - you build your own image using official one images using some CI / automation. For example you can use hub.docker.com 和 automate such process. 这是图像的主要目标。如果您的基础设施需要一些额外的东西,定制的东西 - 您可以使用官方的镜像并使用一些 CI / 自动化来构建您自己的镜像。例如,您可以使用 hub.docker.com 并自动化此过程。 Regarding packages installation, usually container is running under non-root user, so you can not install anything into container. 关于软件包安装,通常容器在非 root 用户下运行,因此您无法将任何东西安装到容器中。 所以只能使用基础的 shell 脚本,好在 alpine 里集成了 busybox,我们可以使用 wget。 wget 救急zabbix-server 容器中的 wget 输出信息: 12345678910111213141516171819202122500a7c147742:/var/lib/zabbix$ wgetBusyBox v1.36.1 (2024-06-10 07:11:47 UTC) multi-call binary.Usage: wget [-cqS] [--spider] [-O FILE] [-o LOGFILE] [--header STR] [--post-data STR | --post-file FILE] [-Y on/off] [-P DIR] [-U AGENT] [-T SEC] URL...Retrieve files via HTTP or FTP --spider Only check URL existence: $? is 0 if exists --header STR Add STR (of form 'header: value') to headers --post-data STR Send STR using POST method --post-file FILE Send FILE using POST method -c Continue retrieval of aborted transfer -q Quiet -P DIR Save to DIR (default .) -S Show server response -T SEC Network read timeout is SEC seconds -O FILE Save to FILE ('-' for stdout) -o LOGFILE Log messages to FILE -U STR Use STR for User-Agent header -Y on/off Use proxy 调整后的脚本12345678910111213#!/bin/bashWEBHOOK_URL="机器人webhook地址"if [ $# -eq 0 ]; then echo "Please provide a message as an argument." exit 1fiMESSAGE="$1"echo $1wget --post-data="{\\"msgtype\\":\\"text\\",\\"text\\":{\\"content\\":\\"$MESSAGE\\"}}" -O /dev/null $WEBHOOK_URL 测试调整后的脚本后,就成功推送信息了。 参考 Zabbix5.0 设置企业微信群机器人推送告警信息 - 知乎 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/66a8.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Docker","slug":"Docker","permalink":"https://blog.onehat.cn/tags/Docker/"},{"name":"Zabbix","slug":"Zabbix","permalink":"https://blog.onehat.cn/tags/Zabbix/"}]},{"title":"网页离线存储之道","slug":"网页离线存储之道","date":"2024-11-02T03:22:33.000Z","updated":"2024-11-02T03:22:33.000Z","comments":true,"path":"p/517b.html","permalink":"https://blog.onehat.cn/p/517b.html","excerpt":"本文记录桌面端环境下对网页离线存储、备份、浏览的方法。","text":"本文记录桌面端环境下对网页离线存储、备份、浏览的方法。 先决条件具备以下实验环境: 桌面端操作系统、Chrome 浏览器 Git 仓库 演示链接:https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/route_ws2008 方案一:MHTML+Git 仓库 适用于普通用户的离线网页存储、浏览行为。 保存快捷键 Ctrl+S保存网页,选择 单个文件,即可保存成 .mhtml格式。在此过程中可以自定义需要的文件名,便于后期检索。 保存完成后可以看到文件,大小为 795.6 KiB。 123456> ls╭───┬───────────────────────────────┬──────┬───────────┬───────────────╮│ # │ name │ type │ size │ modified │├───┼───────────────────────────────┼──────┼───────────┼───────────────┤│ 0 │ route _ Microsoft Learn.mhtml │ file │ 795.6 KiB │ 3 minutes ago │╰───┴───────────────────────────────┴──────┴───────────┴───────────────╯ 备份设置好同步目录,将 .mhtml上传到 Git 仓库、云盘即可。 浏览使用浏览器程序可以直接打开 .mhtml文件,进行浏览。如需搜索可使用 Everything工具搜索文件名,需要注意的是,我们无法直接检索到网页文件的文本内容。 方案二:SingleFile+Git 仓库+HamsterBase 需要部署自托管 docker 容器 HamsterBase。HamsterBase引入了标签系统和全文检索功能,方便了使用。 在此过程中,我也相当于把离线网页文件保存了两份,一份在 Github,一份在 HamsterBase里。 SingleFile官方仓库:https://github.com/gildas-lormeau/SingleFile HamsterBase官方仓库:https://github.com/hamsterbase/hamsterbase 保存使用 Chrome 扩展程序 SingleFile 进行保存离线网页。 点此访问 Chrome 应用商店安装扩展,安装完成后点击 SingleFile 图标即可保存网页。 SingleFile 生成的为单个 .HTML文件,默认情况下,会将网页文件保存到文件系统(也就是弹出对话框以选择保存位置)。 右键 SingleFile 图标,选择 选项,可以设置其保存位置,此处我使用 保存到Github,要用到个人访问令牌(Personal access tokens)。 另外也可以使用 保存到WebDAV服务器,大家按需选择。 相比于 .mhtml文件,SingleFile 保存的 .html文件大了数倍。 1234567> ls╭───┬───────────────────────────────┬──────┬───────────┬─────────────╮│ # │ name │ type │ size │ modified │├───┼───────────────────────────────┼──────┼───────────┼─────────────┤│ 0 │ route _ Microsoft Learn.html │ file │ 6.9 MiB │ now ││ 1 │ route _ Microsoft Learn.mhtml │ file │ 795.6 KiB │ an hour ago │╰───┴───────────────────────────────┴──────┴───────────┴─────────────╯ 备份保存到 Github 就已经拥有了备份。 浏览使用 docker 部署 HamsterBase,点此参考官方文档。 部署完成后,打开其 WebUI,可以看到上传界面,这个界面适用于手动操作,了解即可。 我们已经将网页文件保存到了 Github,如何将其导入 HamsterBase 呢? 查询官方文档得知,只要把网页文件放在 数据库的地址/workspace/inbox ,HamsterBase 会自动导入。 这里使用一个定时作业脚本完成,您可以将其运行在喜欢的运维平台上。我的同步周期为每 12 小时一次。 123456789101112131415161718192021222324# 切换到本地Git仓库目录cd /home/dsf/FileHubgit_repo=我的Github仓库地址# 获取本地当前分支名称local_branch=$(git rev-parse --abbrev-ref HEAD)# 获取本地当前分支的最新提交哈希值local_commit=$(git rev-parse $local_branch)# 获取远程分支对应的本地跟踪分支的最新提交哈希值remote_commit=$(git ls-remote $git_repo refs/heads/$local_branch | cut -f1)echo -e "本地$local_commit。\\n远端$remote_commit。"if [ "$local_commit" = "$remote_commit" ];then echo "本地仓库的$local_branch分支与远端一致,业务结束。"else echo "本地仓库的$local_branch分支与远端不一致,触发Git更新。" #拉取Gitea仓库数据 git pull origin singlefile #延迟15秒 sleep 15 echo "Git更新结束。" #导入至HamsterBase的inbox(全量拷贝) cp -rf ./*.html /mnt/disk1/appdata/hamsterbase/data/workspace/inbox/ echo "导入HamsterBase的inbox完成,业务结束。"fi 同步完成后,在 HamsterBase 里即可使用标签、全文检索、访问原 URL 功能。 需要注意的是,每次都是使用全量拷贝以供 HamsterBase 自导导入,随着网页数量的增多,其导入速度肯定是会变慢的。这样做的主要原因是 HamsterBase 不支持批量导出原数据,所以我宁愿把数据保存两份:一份是在 Github 仓库里,以 .html文件的形式存在,作为异地备份;一份在 HamsterBase 中,方便使用。 总结根据自身情况按需选择。 网页格式 优点 缺点 方案一 mhtml 简单、保存文件小、更好的适用范围(浏览器) 想使用标签,只能在文件名上做文章;无法检索离线网页内容 方案二 html 标签、全文检索 更高的部署难度;保存的网页文件过大 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/517b.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"Docker","slug":"Docker","permalink":"https://blog.onehat.cn/tags/Docker/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"MHTML","slug":"MHTML","permalink":"https://blog.onehat.cn/tags/MHTML/"},{"name":"Chrome","slug":"Chrome","permalink":"https://blog.onehat.cn/tags/Chrome/"},{"name":"Github","slug":"Github","permalink":"https://blog.onehat.cn/tags/Github/"}]},{"title":"双网卡设置内外网静态路由","slug":"双网卡设置内外网静态路由","date":"2024-10-09T10:29:00.000Z","updated":"2024-10-11T05:21:01.000Z","comments":true,"path":"p/7b7a.html","permalink":"https://blog.onehat.cn/p/7b7a.html","excerpt":"记录在双网卡设置静态路由,实现一台机内外网同时连接。","text":"记录在双网卡设置静态路由,实现一台机内外网同时连接。 先决条件一台有两块网卡的电脑,且都具备网络连接。 Windows 环境实验环境为 Windows11,网卡如下: 网卡 DHCP IP 子网掩码 网关 备注 Realtek Gaming 2.5GbE Family Controller 否 192.168.31.254 255.255.255.0 192.168.31.221 板载网卡,网线连接内网 Realtek RTL8811AU Wireless LAN 802.11ac USB 2.0 Network Adapter 是 192.168.43.252 255.255.255.0 192.168.43.1 USB 网卡,WIFI 连接外网 macOS 环境实验环境为 macOS 13.6.9,网卡如下: 网卡 DHCP IP 子网掩码 网关 备注 以太网 是 192.168.31.142 255.255.255.0 192.168.31.1 板载网卡,网线连接内网 Wi-Fi 是 192.168.43.127 255.255.255.0 192.168.43.1 无线网卡,WIFI 连接外网 需要注意的是,两个网卡是否设置静态 IP 都不影响路由,只需确定好对应网段的网关和子网掩码。 现在确定目标:只要 192.168.31.x的都属于内网,走网线;除了内网其他都属于外网,走 WIFI。 Windows 设置静态路由windows 下使用 route 命令进行路由管理,需要以管理员权限运行 powershell。 先 route print查看路由表: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960PowerShell 7.4.5PS C:\\Users\\dsf> route print===========================================================================接口列表 7...........................Tailscale Tunnel 9...1c 86 0b 21 28 b1 ......Realtek Gaming 2.5GbE Family Controller 31...22 0d b0 30 0a 6e ......Microsoft Wi-Fi Direct Virtual Adapter 36...20 0d b0 30 0a 6e ......Microsoft Wi-Fi Direct Virtual Adapter #2 25...20 0d b0 30 0a 6e ......Realtek RTL8811AU Wireless LAN 802.11ac USB 2.0 Network Adapter 1...........................Software Loopback Interface 1===========================================================================IPv4 路由表===========================================================================活动路由:网络目标 网络掩码 网关 接口 跃点数 0.0.0.0 0.0.0.0 192.168.43.1 192.168.43.252 55 0.0.0.0 0.0.0.0 192.168.31.221 192.168.31.254 21 127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331 127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331 127.255.255.255 255.255.255.255 在链路上 127.0.0.1 331 169.254.0.0 255.255.0.0 在链路上 169.254.83.107 261 169.254.83.107 255.255.255.255 在链路上 169.254.83.107 261 169.254.255.255 255.255.255.255 在链路上 169.254.83.107 261 192.168.31.0 255.255.255.0 在链路上 192.168.31.254 276 192.168.31.254 255.255.255.255 在链路上 192.168.31.254 276 192.168.31.255 255.255.255.255 在链路上 192.168.31.254 276 192.168.43.0 255.255.255.0 在链路上 192.168.43.252 311 192.168.43.252 255.255.255.255 在链路上 192.168.43.252 311 192.168.43.255 255.255.255.255 在链路上 192.168.43.252 311 224.0.0.0 240.0.0.0 在链路上 127.0.0.1 331 224.0.0.0 240.0.0.0 在链路上 192.168.43.252 311 224.0.0.0 240.0.0.0 在链路上 192.168.31.254 276 255.255.255.255 255.255.255.255 在链路上 127.0.0.1 331 255.255.255.255 255.255.255.255 在链路上 192.168.43.252 311 255.255.255.255 255.255.255.255 在链路上 192.168.31.254 276===========================================================================永久路由: 网络地址 网络掩码 网关地址 跃点数 0.0.0.0 0.0.0.0 192.168.31.221 1===========================================================================IPv6 路由表===========================================================================活动路由: 接口跃点数网络目标 网关 1 331 ::1/128 在链路上 25 311 fe80::/64 在链路上 9 276 fe80::/64 在链路上 25 311 fe80::f1e:1694:f3b4:4780/128 在链路上 9 276 fe80::5056:bce5:95a8:c141/128 在链路上 1 331 ff00::/8 在链路上 25 311 ff00::/8 在链路上 9 276 ff00::/8 在链路上===========================================================================永久路由: 无 可以看到有两条通用的路由地址,网络目标均为 0.0.0.0,将其全部删除。 12PS C:\\Users\\dsf> route delete 0.0.0.0 操作完成! 找到两块网卡对应的接口分别为内网 9、外网 25,这两个编号会在机器网卡有增减时产生变化。 添加内网路由 12PS C:\\Users\\dsf> route add 192.168.31.0 mask 255.255.255.0 192.168.31.221 if 9 操作完成! 添加外网路由 12PS C:\\Users\\dsf> route add 0.0.0.0 mask 0.0.0.0 192.168.43.1 if 25 操作完成! 设置完成后路由列表如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657PS C:\\Users\\dsf> route print===========================================================================接口列表 7...........................Tailscale Tunnel 9...1c 86 0b 21 28 b1 ......Realtek Gaming 2.5GbE Family Controller 31...22 0d b0 30 0a 6e ......Microsoft Wi-Fi Direct Virtual Adapter 36...20 0d b0 30 0a 6e ......Microsoft Wi-Fi Direct Virtual Adapter #2 25...20 0d b0 30 0a 6e ......Realtek RTL8811AU Wireless LAN 802.11ac USB 2.0 Network Adapter 1...........................Software Loopback Interface 1===========================================================================IPv4 路由表===========================================================================活动路由:网络目标 网络掩码 网关 接口 跃点数 0.0.0.0 0.0.0.0 192.168.43.1 192.168.43.252 56 127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331 127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331 127.255.255.255 255.255.255.255 在链路上 127.0.0.1 331 169.254.0.0 255.255.0.0 在链路上 169.254.83.107 261 169.254.83.107 255.255.255.255 在链路上 169.254.83.107 261 169.254.255.255 255.255.255.255 在链路上 169.254.83.107 261 192.168.31.0 255.255.255.0 在链路上 192.168.31.254 276 192.168.31.0 255.255.255.0 192.168.31.221 192.168.31.254 21 192.168.31.254 255.255.255.255 在链路上 192.168.31.254 276 192.168.31.255 255.255.255.255 在链路上 192.168.31.254 276 192.168.43.0 255.255.255.0 在链路上 192.168.43.252 311 192.168.43.252 255.255.255.255 在链路上 192.168.43.252 311 192.168.43.255 255.255.255.255 在链路上 192.168.43.252 311 224.0.0.0 240.0.0.0 在链路上 127.0.0.1 331 224.0.0.0 240.0.0.0 在链路上 192.168.43.252 311 224.0.0.0 240.0.0.0 在链路上 192.168.31.254 276 255.255.255.255 255.255.255.255 在链路上 127.0.0.1 331 255.255.255.255 255.255.255.255 在链路上 192.168.43.252 311 255.255.255.255 255.255.255.255 在链路上 192.168.31.254 276===========================================================================永久路由: 无IPv6 路由表===========================================================================活动路由: 接口跃点数网络目标 网关 1 331 ::1/128 在链路上 25 311 fe80::/64 在链路上 9 276 fe80::/64 在链路上 25 311 fe80::f1e:1694:f3b4:4780/128 在链路上 9 276 fe80::5056:bce5:95a8:c141/128 在链路上 1 331 ff00::/8 在链路上 25 311 ff00::/8 在链路上 9 276 ff00::/8 在链路上===========================================================================永久路由: 无PS C:\\Users\\dsf> 需要注意的是,这两条都不是永久路由,重启电脑后就会失效,需要重新设置,如需设置永久路由,在两条 route add命令后添加参数 -p即可。 如需删除手动设置的静态路由,使用 route delete命令: 1route delete 192.168.31.0 如果对网络适配器进行变更(如禁用、启用网卡、在 Windows 里设置重新静态 IP),可能会自动生成路由记录,需要重新进行以上配置。 macOS 设置静态路由首先设置正确的网卡服务顺序,进入 系统偏好设置 - 网络 - 设定服务顺序,拖动来进行网络优先级设置。 使连接外网的网卡位于内网网卡之上,此时已经可以正常访问外网。 添加内网路由 1sudo route -n add -net 192.168.31.0 -netmask 255.255.255.0 192.168.31.1 添加外网路由 1sudo route -n add default 192.168.43.1 如需删除,也是使用 route delete命令: 1sudo route delete -net 192.168.31.0 -netmask 255.255.255.0 192.168.31.1 至此,目标完成。 参考 route _ Microsoft Learn mac 配置双网卡 mac 同时使用内网和外网 - ygunoil - 博客园 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/7b7a.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"网络","slug":"网络","permalink":"https://blog.onehat.cn/tags/%E7%BD%91%E7%BB%9C/"}]},{"title":"文明 6 知识点汇总","slug":"文明 6 知识点汇总","date":"2024-09-24T12:16:48.000Z","updated":"2024-10-24T10:23:01.000Z","comments":true,"path":"p/cd85.html","permalink":"https://blog.onehat.cn/p/cd85.html","excerpt":"《 文明 VI 》是由 Firaxis Games 开发的回合策略游戏,是 文明系列的最新作品,同时是庆祝该系列 25 周年的作品(以下简称“文明 6”)。本文汇总游玩过程中具备参考意义的一些玩法机制、数据、设定,仅供参考,所使用游戏版本为 Steam 文明 6 典藏版。","text":"《 文明 VI 》是由 Firaxis Games 开发的回合策略游戏,是 文明系列的最新作品,同时是庆祝该系列 25 周年的作品(以下简称“文明 6”)。本文汇总游玩过程中具备参考意义的一些玩法机制、数据、设定,仅供参考,所使用游戏版本为 Steam 文明 6 典藏版。 以下内容收集于网络,如有侵权请联系博主删除。 区域加成来源:抖音@BlackCatM.E 部落村庄(蘑菇收益)来源:B 站@小巴拉 Stu BV1S8411Z7sq 时代分来源:B 站@小巴拉 Stu BV1Ts4y1F7kg 时代分获取 时代着力点 黑暗政策卡 商路来源:B 站@小巴拉 Stu BV1yu411H7Xc 商路所需回合数 伟人、奇观对商路增益 各区域内外商收益 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/cd85.html 原创作品,转载请保留出处。","categories":[{"name":"娱乐中心","slug":"娱乐中心","permalink":"https://blog.onehat.cn/categories/%E5%A8%B1%E4%B9%90%E4%B8%AD%E5%BF%83/"}],"tags":[{"name":"游戏","slug":"游戏","permalink":"https://blog.onehat.cn/tags/%E6%B8%B8%E6%88%8F/"},{"name":"文明","slug":"文明","permalink":"https://blog.onehat.cn/tags/%E6%96%87%E6%98%8E/"}]},{"title":"文明 6 基准测试","slug":"文明 6 基准测试","date":"2024-08-14T09:29:39.000Z","updated":"2024-08-14T09:29:39.000Z","comments":true,"path":"p/4104.html","permalink":"https://blog.onehat.cn/p/4104.html","excerpt":"记录自己 PC 设备的文明 6 基准测试。","text":"记录自己 PC 设备的文明 6 基准测试。 先决条件OS 均为 Win11,Steam 版本文明 6 典藏版本,游戏均安装在 NVMe 固态上,且登录账号完全一致。 额外开启软件:MSI AFTERBURNER。 测试结果 设备 CPU 显卡 内存容量 固态 图像设置 图像性能 AI 性能 NT-GG(台式机) Intel 12400F NVIDIA 2060S 32G(8G DDR4 3200 x4) 1TB PCIE4 固态 4k 高特效,无边框,垂直同步开。 14.467+18.596 7.37 NT-MC(核显笔记本) AMD 6800H AMD Radeon 680M 64G(32G DDR5 4800 x2) 1TB PCIE3 固态 2k 中特效,无边框,垂直同步开。 11.251+14.144 7.52 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/4104.html 原创作品,转载请保留出处。","categories":[{"name":"娱乐中心","slug":"娱乐中心","permalink":"https://blog.onehat.cn/categories/%E5%A8%B1%E4%B9%90%E4%B8%AD%E5%BF%83/"}],"tags":[{"name":"游戏","slug":"游戏","permalink":"https://blog.onehat.cn/tags/%E6%B8%B8%E6%88%8F/"},{"name":"文明","slug":"文明","permalink":"https://blog.onehat.cn/tags/%E6%96%87%E6%98%8E/"},{"name":"游戏测试","slug":"游戏测试","permalink":"https://blog.onehat.cn/tags/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/"}]},{"title":"PVE8 下 iStoreOS_x86 根分区扩容","slug":"PVE8 下 iStoreOS_x86 根分区扩容","date":"2024-06-05T02:29:39.000Z","updated":"2024-06-05T02:29:39.000Z","comments":true,"path":"p/bd39.html","permalink":"https://blog.onehat.cn/p/bd39.html","excerpt":"在 pve 上面安装了 iStoreOS 虚拟机,默认根分区只有 2.5 G 空间,此处记录扩容根分区过程(增加 20G)。","text":"在 pve 上面安装了 iStoreOS 虚拟机,默认根分区只有 2.5 G 空间,此处记录扩容根分区过程(增加 20G)。 实验环境PVE 8.1.5 iStoreOS 22.03.6 2024052410 PVE 操作硬盘扩容直接在 PVE 的 WebUI 操作: 选中 VM,【硬件】-【硬盘】-【磁盘操作】-【调整大小】,输入 20,点击【调整磁盘大小】按钮以确认。 iStoreOS 内部分区扩容在 pve 上操作虚拟机磁盘扩容后,ssh 连接到 istoreos,执行命令如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061# 执行partedroot@iStoreOS:~# partedGNU Parted 3.4Using /dev/sdaWelcome to GNU Parted! Type 'help' to view a list of commands.# 执行print命令,查看当前分区情况(parted) printModel: QEMU QEMU HARDDISK (scsi)Disk /dev/sda: 24.0GBSector size (logical/physical): 512B/512BPartition Table: gptDisk Flags:Number Start End Size File system Name Flags128 17.4kB 262kB 245kB bios_grub 1 262kB 134MB 134MB fat16 legacy_boot 2 134MB 403MB 268MB 3 403MB 2550MB 2147MB ext4 4 2551MB 24.0GB 21.5GB primary# 这里对分区3进行扩容,完成后退出(parted) resizepartPartition number? 3Warning: Partition /dev/sda3 is being used. Are you sure you want to continue?Yes/No? yesEnd? [2550MB]? 100%(parted) qInformation: You may need to update /etc/fstab.# 执行df -h可以看到分区大小未更新root@iStoreOS:~# df -hFilesystem Size Used Available Use% Mounted on/dev/root 169.0M 169.0M 0 100% /romtmpfs 494.1M 5.3M 488.8M 1% /tmp/dev/sda3 1.9G 1.8G 74.2M 96% /overlayoverlayfs:/overlay 1.9G 1.8G 74.2M 96% /tmpfs 4.0M 156.0K 3.8M 4% /mnt/dev/sda1 127.7M 5.7M 122.1M 4% /boot/dev/sda1 127.7M 5.7M 122.1M 4% /boottmpfs 512.0K 0 512.0K 0% /devtmpfs 512.0K 0 512.0K 0% /sys/module/md_mod/parameters/new_array# 执行resize2fs对文件系统进行扩容root@iStoreOS:~# resize2fs -p /dev/sda3resize2fs 1.46.5 (30-Dec-2021)Filesystem at /dev/sda3 is mounted on /overlay; on-line resizing requiredold_desc_blocks = 1, new_desc_blocks = 3The filesystem on /dev/sda3 is now 5767168 (4k) blocks long.# 执行df -h可以看到分区大小已经更新root@iStoreOS:~# df -hFilesystem Size Used Available Use% Mounted on/dev/root 169.0M 169.0M 0 100% /romtmpfs 494.1M 5.3M 488.8M 1% /tmp/dev/sda3 21.6G 1.8G 19.8G 8% /overlayoverlayfs:/overlay 21.6G 1.8G 19.8G 8% /tmpfs 4.0M 156.0K 3.8M 4% /mnt/dev/sda1 127.7M 5.7M 122.1M 4% /boot/dev/sda1 127.7M 5.7M 122.1M 4% /boottmpfs 512.0K 0 512.0K 0% /devtmpfs 512.0K 0 512.0K 0% /sys/module/md_mod/parameters/new_arrayroot@iStoreOS:~# 打开 Web 界面,发现分区大小已经变化,扩容成功。 参考 iStoreOS x86 根分区扩容 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/bd39.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"iStoreOS","slug":"iStoreOS","permalink":"https://blog.onehat.cn/tags/iStoreOS/"}]},{"title":"NAS 快速跨磁盘拷贝数据","slug":"NAS 快速跨磁盘拷贝数据","date":"2024-05-05T13:46:39.000Z","updated":"2024-05-05T13:46:39.000Z","comments":true,"path":"p/fc3d.html","permalink":"https://blog.onehat.cn/p/fc3d.html","excerpt":"记录使用 ServerSide Copy实现快速文件拷贝。","text":"记录使用 ServerSide Copy实现快速文件拷贝。 前置条件NAS 设置 SMB 共享,不同盘挂载为主机电脑的不同文件夹。 问题远程操作 NAS 时,在不同硬盘间复制或移动文件,经常发现会占用本机网络。 假如我的网络目前为千兆,数据通过电脑中转的话下载上传各占满带宽一半,导致移动文件的速度只有 50MB/s 左右非常慢。数据都是要经过我的电脑中转的,无法直接在 NAS 内部通过硬盘传送。 那么是否可以实现直接在 NAS 跨磁盘传输数据呢? 解决SMB 协议有个功能特性为 ServerSide Copy (服务器端复制操作),顾名思义,可以直接在 NAS 跨磁盘传输数据。 Samba 4.1.0 是第一个通过 SMB2 FSCTL_SRV_COPYCHUNK 请求支持服务器端复制操作的版本。 对于 NFS,2016 年 11 月发布的 NFSv4.2 规范支持 ServerSide Copy。 方法一:在 NAS 本机传输(熟悉命令行也可以使用命令行传输文件,但是并不是太好用)。 推荐在 NAS 安装具备 WebUI 的文件管理器 APP(如 Filebrowser),在文件管理器中进行文件操作。 方法二:使用 Windows使用支持 SMB ServerSide Copy 特性的 SMB 客户端进行文件操作,操作系统如 Windows 8+ 的 文件资源管理器即可支持。 但是对于 macOS Finder,需要服务器 Samba 在 smb.conf 中包含 vfs_fruit 模块和 fruit:copyfile = yes。 对于 macOS,Finder 及第三方文件管理器,均无法支持 SMB 的ServerSide Copy。 参考 Server-Side Copy - SambaWiki MacOS | < preparing to move…< folders between directories in the SAME truenas share. Why is this taking so long% - TrueNAS General - TrueNAS Community Forums -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/fc3d.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"SMB","slug":"SMB","permalink":"https://blog.onehat.cn/tags/SMB/"}]},{"title":"Ubuntu 镜像站网速比拼","slug":"Ubuntu 镜像站网速比拼","date":"2024-03-12T16:29:39.000Z","updated":"2024-03-12T16:29:39.000Z","comments":true,"path":"p/9a33.html","permalink":"https://blog.onehat.cn/p/9a33.html","excerpt":"Ubuntu 镜像站网速比拼:下载速度哪家强?不服跑个 upgrade!","text":"Ubuntu 镜像站网速比拼:下载速度哪家强?不服跑个 upgrade! 实验环境宽带规格:广州联通,带宽 1000M。 测速方法:使用 VMware Workstation Pro 17 安装 Ubuntu 23.10 虚拟机,打上快照。依次切换用不同的镜像源进行更新,单个源更新过程中不做任何额外操作,等待完成后,恢复快照、切换源,重复实验。 实验对象几个华南区域常用的镜像站:科大、清华、腾讯云。 实验结果 站点 速度 截图 科大 下载 756MB,耗时 20 秒 (38.7MB/s) 清华 下载 756MB,耗时 2 分 11 秒 (38.7MB/s) 腾讯云 下载 756MB,耗时 53 秒 (14.2MB/s) -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/9a33.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"里甲","slug":"里甲","permalink":"https://blog.onehat.cn/categories/%E9%87%8C%E7%94%B2/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://blog.onehat.cn/tags/Ubuntu/"}]},{"title":"CloudflareTunnel 内网穿透","slug":"CloudflareTunnel 内网穿透","date":"2024-03-09T02:29:39.000Z","updated":"2024-03-09T02:29:39.000Z","comments":true,"path":"p/cbe0.html","permalink":"https://blog.onehat.cn/p/cbe0.html","excerpt":"记录 CloudflareTunnel 内网穿透操作。","text":"记录 CloudflareTunnel 内网穿透操作。 Proxmox VE版本:8.1.4 使用 https,需要在 Public Hostname Page 的 Additional application settings 开启以下 3 个选项。 123No TLS VerifyHTTP2 connectionDisable Chunked Encoding Unraid版本:6.12.6 使用 http 协议,配置如图: SSH设置 连接如官方文档Connect as a user所示,请首先在你的电脑上安装 cloudflared。 然后配置 SSH, 比如 ~/.ssh/config 12345678Host home-ubuntu.example.com HostName home-ubuntu.example.com TCPKeepAlive yes User dong ServerAliveInterval 15 IdentityFile ~/.ssh/dell_ubuntu Port 22 ProxyCommand /opt/homebrew/bin/cloudflared access ssh --hostname %h 注意,这里主要的区别是多了 ProxyCommand /opt/homebrew/bin/cloudflared access ssh --hostname %h,以及Hostname 由 192.168.1.101变成了你在 Cloudflare 设置的 home-ubuntu.example.com。 参考 Cloudflare tunnel 实现内网穿透 SSH,SMB,和 web_老旧笔记本第二春 - 木叶下 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/cbe0.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Cloudflare","slug":"Cloudflare","permalink":"https://blog.onehat.cn/tags/Cloudflare/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"}]},{"title":"转载--SSMS 格式化插件 SQL Printer for SSMS 破解","slug":"转载--SSMS 格式化插件 SQL Printer for SSMS 破解","date":"2024-02-20T08:05:39.000Z","updated":"2024-02-20T08:05:39.000Z","comments":true,"path":"p/89b9.html","permalink":"https://blog.onehat.cn/p/89b9.html","excerpt":"使用 dnSpy 去除插件的试用提示。 管理员权限打开 dnSpy,定位到指定函数,[编辑类],修改后保存即可。 原文地址:https://www.52pojie.cn/thread-1416605-1-1.html","text":"使用 dnSpy 去除插件的试用提示。 管理员权限打开 dnSpy,定位到指定函数,[编辑类],修改后保存即可。 原文地址:https://www.52pojie.cn/thread-1416605-1-1.html 一款 SQL 格式化插件,免费版试用 60 天找到 DLL 路径在:C:\\Program Files (x86)\\Gudusoft\\ppforssms直接上 dnSpy 爆破,调试和找关键代码的过程我就跳过了。关键方法是 checkkey(),发现每次都会调用它,我们直接让它返回 True。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"获取信息源","slug":"获取信息源","permalink":"https://blog.onehat.cn/categories/%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF%E6%BA%90/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"MSSQL","slug":"MSSQL","permalink":"https://blog.onehat.cn/tags/MSSQL/"},{"name":".NET","slug":"NET","permalink":"https://blog.onehat.cn/tags/NET/"},{"name":"转载","slug":"转载","permalink":"https://blog.onehat.cn/tags/%E8%BD%AC%E8%BD%BD/"}]},{"title":"syslog 实践","slug":"syslog 实践","date":"2024-01-28T09:20:39.000Z","updated":"2024-01-28T09:20:39.000Z","comments":true,"path":"p/7ea6.html","permalink":"https://blog.onehat.cn/p/7ea6.html","excerpt":"目标是要把各个设备的系统日志收集起来,便于集中管理。","text":"目标是要把各个设备的系统日志收集起来,便于集中管理。 实验环境 主机 OS 用途 192.168.31.250 windows server 2022 日志服务器 192.168.31.250 windows server 2022 syslog 发送日志(客户端),这台机同时也做日志服务器。 192.168.31.240 debian 12 syslog 发送日志(客户端) 192.168.31.220 Unraid 6.12.6 syslog 发送日志(客户端) Serverwindows : Kiwi Syslog Server 主机 IP:192.168.31.250 windows/windows server 系统搭建 syslog 服务器,使用 Kiwi_Syslog_Server_9.5.0。 安装与激活,请参考以下博文: 【逗老师带你学 IT】Kiwi Syslog Web Access 与 Active Directory 集成认证-CSDN 博客 2015 年的老软件,资源占用并不多。 ClientUnraid 主机 IP:192.168.31.220 Unraid 系统自带 syslog 日志客户端,在 WebUI 设置日志服务器即可。 设置>系统日志服务器>远程系统日志服务器 注册完成后,在 syslog server 即可看到当前主机 192.168.31.220 的日志。 windows : evtsys 主机 IP:192.168.31.250 Windows 系统并无发送 syslog 的配置功能。所以,需要借助 evtsys 来实现 Windows 系统日志采集。 evtsys 代码托关于 Google Code: https://code.google.com/archive/p/eventlog-to-syslog/downloads 我此时下载最新版本 Evtsys_4.5.1_64-Bit.zip,解压到合适目录下。 启动 Powershell,命令行 .\\evtsys.exe -h可以查看参数用法。 12345#管理员权限#注册服务,指定日志服务器.\\evtsys.exe -i -h 192.168.31.250 -p 514#启动服务net start evtsys 如果需要卸载 12345#管理员权限#停止服务net stop evtsys#卸载服务.\\evtsys.exe -u -h 192.168.31.250 -p 514 注册完成后,在 syslog server 即可看到当前主机 192.168.31.250 的日志。 debian12 : rsyslog 主机 IP:192.168.31.240 debian 12 不再附带 syslog,它已被 journald 取代。如果想要使用 syslog,可以安装和配置 rsyslog。 12345678#安装rsyslogapt install rsyslog#编辑配置文件vi /etc/rsyslog.conf#最下方添加一行,指定消息都发往日志服务器*.info;mail.none;authpriv.none;cron.none @192.168.31.250:514#保存后重启服务systemctl restart rsyslog 完成后,在 syslog server 即可看到当前主机 192.168.31.240 的日志。 总览至此,3 台客户端的日志消息都可以在日志服务器看到。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/7ea6.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Unraid","slug":"Unraid","permalink":"https://blog.onehat.cn/tags/Unraid/"},{"name":"Debian","slug":"Debian","permalink":"https://blog.onehat.cn/tags/Debian/"},{"name":"Windows","slug":"Windows","permalink":"https://blog.onehat.cn/tags/Windows/"}]},{"title":"Windows Server 下 MySQL5.7 配置","slug":"Windows Server 下 MySQL5.7 配置","date":"2023-11-30T02:29:39.000Z","updated":"2023-11-30T02:29:39.000Z","comments":true,"path":"p/7919.html","permalink":"https://blog.onehat.cn/p/7919.html","excerpt":"记录绿色版 MySQL5.7 的安装、配置。","text":"记录绿色版 MySQL5.7 的安装、配置。 先决条件本次实验环境如下: 项目 版本 备注 OS Windows Server 2022 Datacenter IP 地址 192.168.31.165 MySQL 5.7.44 mysql-5.7.44-winx64.zip 微软运行库 微软常用运行库合集 2023.11.13 注册服务需要使用 安装、注册将 mysql-5.7.44-winx64.zip解压到目录 C:\\opt\\mysql。 配置文件 my.ini放到 bin目录下,注意其中的两个路径需要修改。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546[mysqld]# 设置 3306 端口port=3306# 设置 mysql 的安装目录basedir=C:\\opt\\mysql\\mysql-5.7.44-winx64# 设置 mysql 数据库的数据的存放目录datadir=C:\\opt\\mysql\\mysql-5.7.44-winx64\\Data# 允许最大连接数max_connections=200# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统max_connect_errors=10# 服务端使用的字符集默认为 UTF8character-set-server=utf8# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB# 默认使用“mysql_native_password”插件认证default_authentication_plugin=mysql_native_password[mysql]# 设置 mysql 客户端默认字符集default-character-set=utf8mb4[client]# 设置 mysql 客户端连接服务端时默认使用的端口port=3306default-character-set=utf8 并在系统环境变量添加 bin路径,以供全局命令行使用。 管理员权限打开 cmd,进行注册: 12345678910###安装服务mysqld --install###生成datamysqld --initialize###启动服务net start mysql###尝试登录mysql -u root###修改root密码ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; 开启远程访问在配置 3306 端口的 windows 防火墙规则后,需要开启 MySQL 服务的远程访问权限。 Host 列指定了允许用户登录所使用的 IP,比如 user=root、Host=192.168.111.101。这里的意思就是说 root 用户只能通过 192.168.111.101 的客户端去访问。 user=root、Host=localhost,表示只能通过本机客户端去访问。而%是个通配符,如果 Host=192.168.1.%,那么就表示只要是 IP 地址前缀为“192.168.1.”的客户端都可以连接。如果 Host=%,表示所有 IP 都有连接权限。 注意:在生产环境下不能为了省事将 host 设置为%,这样做会存在安全问题,具体的设置可以根据生产环境的 IP 进行设置。 12345678910111213141516171819202122###登录mysqlmysql -u root -p###进行配置mysql> use mysql;Database changedmysql> select Host,User from user;+-----------+---------------+| Host | User |+-----------+---------------+| 127.0.0.1 | halodb || localhost | halodb || localhost | mysql.session || localhost | mysql.sys || localhost | root |+-----------+---------------+5 rows in set (0.00 sec)mysql> update user set host = '%' where user ='root';Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> flush privileges; -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/7919.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Windows Server","slug":"Windows-Server","permalink":"https://blog.onehat.cn/tags/Windows-Server/"},{"name":"MySQL","slug":"MySQL","permalink":"https://blog.onehat.cn/tags/MySQL/"}]},{"title":"Everything HTTP 服务显示磁盘标签","slug":"Everything HTTP 服务显示磁盘标签","date":"2023-10-25T02:29:39.000Z","updated":"2023-10-25T02:29:39.000Z","comments":true,"path":"p/ebb.html","permalink":"https://blog.onehat.cn/p/ebb.html","excerpt":"Everything 开启配置实现在 HTTP 服务器显示磁盘标签。","text":"Everything 开启配置实现在 HTTP 服务器显示磁盘标签。 前置条件本次实验环境 Everything 版本 V1.4.1.1022 (x64) 修改配置在 Everything 1.3 中移除了云端硬盘标签,因为根文件夹可以是文件夹或文件列表。 这样会导致无法区分硬盘。 退出 Everything 的程序、后台服务。 打开配置文件 1notepad %APPDATA%\\Everything\\Everything.ini 搜索 http_server_show_drive_labels,将值改为 1。 1http_server_show_drive_labels=1 参考 HTTP Server Help - voidtools forum -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/ebb.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"软件","slug":"软件","permalink":"https://blog.onehat.cn/tags/%E8%BD%AF%E4%BB%B6/"},{"name":"Everything","slug":"Everything","permalink":"https://blog.onehat.cn/tags/Everything/"}]},{"title":"Docker 安装 Oracle11g 数据库并进行持久化","slug":"Docker 安装 Oracle11g 数据库并进行持久化","date":"2023-10-23T02:29:39.000Z","updated":"2023-10-23T02:29:39.000Z","comments":true,"path":"p/e850.html","permalink":"https://blog.onehat.cn/p/e850.html","excerpt":"记录使用 docker 安装 Oracle11g,持久化需要使用 Unraid docker 的发布参数功能。","text":"记录使用 docker 安装 Oracle11g,持久化需要使用 Unraid docker 的发布参数功能。 先决条件本次实验环境如下: Unraid 版本:6.12.6 Docker 版本:20.10.24 安装并配置 Oracle11g 数据库容器这部分不细写,网上教程很多,也很详细。(可以参考此教程:docker 部署 oracle11g 并进行持久化) 解决持久化问题上述博文中给出的持久化步骤并不完全正确,如果只是停止、重启容器是持久化成功的。如果每次修改容器参数后重建,都需要对容器重新操作。最佳方案是使用 docker 启动前/启动后脚本,但我试过并不生效(不知是 Unraid 的问题还是 docker 问题?)。 经查询 Unraid 论坛相关帖子,发现使用 Unraid docker 可视化编辑器的发布参数(Post Arguments)功能可以解决问题。发布参数的作用就是在容器创建后执行某命令,尝试过调用 shell 脚本不生效,所以就把命令用&&连起来写在一起。 在发布参数添加以下命令,即可不受容器重建的影响。 1&& docker exec -d DB-Oracle11g bash -c "/bin/cp -rf /home/oracle/app/oracle/oradata/helowin/control01.ctl /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl && /home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/dbstart " 同时贴出 Unraid 的 docker 模板供参考 文件:/boot/config/plugins/dockerMan/templates-user/my-DB-Oracle11g.xml 1234567891011121314151617181920212223242526272829<?xml version="1.0"?><Container version="2"> <Name>DB-Oracle11g</Name> <Repository>registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g</Repository> <Registry/> <Network>bridge</Network> <MyIP/> <Shell>bash</Shell> <Privileged>false</Privileged> <Support/> <Project/> <Overview/> <Category/> <WebUI>http://[IP]:[PORT:21580]/</WebUI> <TemplateURL/> <Icon>https://cdn.jsdelivr.net/gh/dsf1995cn/PicHub/icons/oracledb.png</Icon> <ExtraParams>--restart=unless-stopped --memory=4G</ExtraParams> <PostArgs>&& docker exec -d DB-Oracle11g bash -c "/bin/cp -rf /home/oracle/app/oracle/oradata/helowin/control01.ctl /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl && /home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/dbstart "</PostArgs> <CPUset/> <DateInstalled>1710235946</DateInstalled> <DonateText/> <DonateLink/> <Requires/> <Config Name="port" Target="1521" Default="" Mode="tcp" Description="" Type="Port" Display="always" Required="false" Mask="false">1521</Config> <Config Name="Host Key 1" Target="ORACLE_HOME" Default="" Mode="" Description="" Type="Variable" Display="always" Required="false" Mask="false">/home/oracle/app/oracle/product/11.2.0/dbhome_2</Config> <Config Name="ORACLE_SID" Target="ORACLE_SID" Default="" Mode="" Description="" Type="Variable" Display="always" Required="false" Mask="false">helowin</Config> <Config Name="ocadata" Target="/home/oracle/app/oracle/oradata" Default="" Mode="rw" Description="" Type="Path" Display="always" Required="false" Mask="false">/mnt/disk1/appdata/oracle11g/oradata</Config> <Config Name="ORACLE_HOME" Target="ORACLE_HOME" Default="" Mode="" Description="" Type="Variable" Display="always" Required="false" Mask="false">/home/oracle/app/oracle/product/11.2.0/dbhome_2</Config></Container> 参考 docker 部署 oracle11g 并进行持久化 Run a script after docker container starts? - Docker Engine - Unraid -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/e850.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Unraid","slug":"Unraid","permalink":"https://blog.onehat.cn/tags/Unraid/"},{"name":"数据库","slug":"数据库","permalink":"https://blog.onehat.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"},{"name":"Oracle","slug":"Oracle","permalink":"https://blog.onehat.cn/tags/Oracle/"}]},{"title":"PVE8 安装 LXC 并启用硬解(Jellyfin 篇)","slug":"PVE8 安装 LXC 并启用硬解","date":"2023-10-05T01:29:39.000Z","updated":"2023-10-05T01:29:39.000Z","comments":true,"path":"p/834f.html","permalink":"https://blog.onehat.cn/p/834f.html","excerpt":"记录在 PVE8 虚拟化平台下安装 LXC 容器以实现 Jellyfin 的核显硬解,原则上适用于所有 12-13 代英特尔核显。","text":"记录在 PVE8 虚拟化平台下安装 LXC 容器以实现 Jellyfin 的核显硬解,原则上适用于所有 12-13 代英特尔核显。 先决条件具备实验环境Proxmox VE 8.0 12proxmox-ve: 8.0.2 (running kernel: 6.2.16-14-pve)qemu-server: 8.0.7 PVE 主机正常驱动核显,我使用的 CPU 为 12900 ES(QXQ3),核显为 UHD770。 123╭─root@pve ~╰─# ls /dev/driby-path card0 renderD128 开启 GUC 支持(PVE 主机)编辑文件 /etc/modprobe.d/i915.conf 1nano /etc/modprobe.d/i915.conf 添加以下内容 1options i915 enable_guc=3 重启 PVE 主机后生效,此时终端输入 dmesg | grep i915查看到 guc 启用情况为 enable,且可以看到 dmc firmware和 huc firmware两个固件的信息。 下载并创建 LXC 容器下载 CT 模板在 PVE 的 web 界面,找到 local-CT模板-模板,弹窗中搜索 debian,选中 debian12 的模板下载。 新建 LXC 容器下载完成后,右键节点,使用 debian12 的模板新建 LXC 容器,注意去除勾选 无特权容器 配置 LXC 容器基础配置创建完成后,先不启动,在 LXC 容器的配置文件中映射主机的核显设备编辑配置文件 /etc/pve/lxc/218.conf 1nano /etc/pve/lxc/218.conf 最下方添加以下内容 123456lxc.cgroup2.devices.allow: c 226:0 rwmlxc.cgroup2.devices.allow: c 226:128 rwmlxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=filelxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=filelxc.apparmor.profile: unconfinedlxc.cap.drop: 完成后启动 LXC 容器,在 PVE 控制台中登录,开启 ssh 远程登录权限。 12345678nano /etc/ssh/sshd_config #编辑sshd配置文件###sshd_config配置项修改 beginPermitRootLogin yesPasswordAuthentication yes###sshd_config配置项修改 endservice ssh restart #重启sshd服务 对 LXC 容器进行换源、更新操作。 12345678910nano /etc/apt/sources.list #编辑源文件###sources.list 源文件修改 begindeb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmwaredeb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmwaredeb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware###sources.list 源文件修改 endapt update && apt upgrade -y #更新 安装 intel_gpu_top,在命令行查看核显占用。 1apt install intel-gpu-tools 终端输入 intel_gpu_top看到如下信息,Ctrl+C 取消。 挂载 NFS影音文件保存在 NAS 中,NAS 开启 NFS 分享,在 LXC 容器中挂载以供 Jellyfin 服务使用。 123456789apt install nfs-common -y #安装nfs-commonapt install nfs-utils -y #高版本Ubuntu中,可安装nfs-utilsmount -t nfs 192.168.31.220:/mnt/disk2 /mnt/share_nfs #挂载NFSnano /etc/fstab #编辑配置文件#配置文件fstab begin192.168.31.220:/mnt/disk2 /mnt/share_nfs nfs defaults 0 0#配置文件fstab end 挂载完成后查看文件是否存在,挂载得到的文件权限可以在 NFS 服务端做出配置。如无问题,则修改 /etc/fstab文件开机自动挂载 NFS 目录。 安装 docker 版 Jellyfin12345apt install curl -y && curl -sSL https://get.docker.com/ | sh #安装docker#安装Jellyfindocker run -d -p 8096:8096 -p 8920:8920 --volume jellyfin-config:/config --volume jellyfin-cache:/cache -v /mnt/share_nfs:/media --device=/dev/dri:/dev/dri --restart=always --name jellyfin nyanmisaka/jellyfin:latest 配置 docker 在 NFS 挂载后启动默认情况下 docker 和 NFS 挂载动作的执行是不区分先后顺序的,这会导致开机以后 docker 服务已经启动但 NFS 挂载点未就绪,于是在 docker 应用中就无法正常的看到存储池中的文件。终端执行 systemctl list-units | grep mount寻找与 fstab 中配置对应的信息,我的挂载任务为:mnt-share_nfs.mount 编辑 docker 服务配置,将上面找到的挂载任务设置为 After 项目以及 Wants 项目。 1nano /lib/systemd/system/docker.service #编辑配置文件 如有远程连接 docker 需求,可在下方的 ExecStart 中添加 -H tcp://0.0.0.0:2375(上图为已添加)。 修改完成后执行 systemctl daemon-reload重载系统服务。systemctl restart docker重新启动 docker。 由于我的 NFS 存储服务由运行在虚拟机里的 Unraid 提供,需要设置 LXC 容器开机自启动时添加延时 180 秒,一般情况下需要重启主机,Unraid 虚拟机可以在 3 分钟内就绪。 配置 Jellyfin开启核显硬解转码由于使用的是 nyanmisaka定制的镜像(镜像特点),只需在 控制台-播放开启硬解即可。 安装插件MetaShark 刮削插件(豆瓣)进入 Jellyfin 控制台 > 插件 > 存储库,点击添加 输入存储库名称:MetaShark 输入存储库 URL:https://ghproxy.com/https://github.com/cxfksword/jellyfin-plugin-metashark/releases/download/manifest/manifest_cn.json MetaTube 刮削插件(成人)进入 Jellyfin 控制台 > 插件 > 存储库,点击添加 输入存储库名称:MetaTube 输入存储库 URL:https://raw.githubusercontent.com/metatube-community/jellyfin-plugin-metatube/dist/manifest.json MeiamSubtitles 字幕插件进入 Jellyfin 控制台 > 插件 > 存储库,点击添加 输入存储库名称:MeiamSubtitles 输入存储库 URL:https://github.com/91270/MeiamSubtitles.Release/raw/main/Plugin/manifest-stable.json SkinManager 主题美化插件进入 Jellyfin 控制台 > 插件 > 存储库,点击添加 输入存储库名称:SkinManager 输入存储库 URL:https://raw.githubusercontent.com/danieladov/JellyfinPluginManifest/master/manifest.json YouTubeMetaData 刮削插件进入 Jellyfin 控制台 > 插件 > 存储库,点击添加 输入存储库名称:YoutubeMetadata 输入存储库 URL:https://raw.githubusercontent.com/ankenyr/jellyfin-plugin-repo/master/manifest.json 存储库设置完成后,在插件 Tab 页下找到 MetaTube、Shooter Subtitles、Thuner Subtitles、SkinManager、YoutubeMetadata ,依次点击安装,安装完成需要重启容器才能生效。 测试硬解4k-120Mbps 转码,可以看出 GPU 占用如下: 此时的 CPU 占用处于较低的水准。则说明核显硬解配置成功。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/834f.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"娱乐中心","slug":"娱乐中心","permalink":"https://blog.onehat.cn/categories/%E5%A8%B1%E4%B9%90%E4%B8%AD%E5%BF%83/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"Docker","slug":"Docker","permalink":"https://blog.onehat.cn/tags/Docker/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"HomeLab","slug":"HomeLab","permalink":"https://blog.onehat.cn/tags/HomeLab/"}]},{"title":"Docker 开启远程 API","slug":"Docker 开启远程 API","date":"2023-09-30T02:29:39.000Z","updated":"2024-04-27T07:23:01.000Z","comments":true,"path":"p/2c94.html","permalink":"https://blog.onehat.cn/p/2c94.html","excerpt":"docker 提供 rest api 服务,开启后可以使用第三方管理工具进行 Docker 管理。一般情况下,会使用 2375 端口号。","text":"docker 提供 rest api 服务,开启后可以使用第三方管理工具进行 Docker 管理。一般情况下,会使用 2375 端口号。 前置条件具备 Docker 实验环境。 本次使用的实验环境如下: 系统 版本信息 Linux Ubuntu Server 22.04 Unraid 6.11.5 群晖 7.2.1 Linux 开启 Docker 远程 API修改配置文件打开 docker 的 systemd 服务注册文件 1sudo nano /lib/systemd/system/docker.service 查看 13 行左右的 execStart,是否有类似“-H tcp://0.0.0.0:2375”的参数: 1234#### 找到[Service]下面的(修改前)ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock#### 改为如下(修改后)ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock 重启服务12sudo systemctl daemon-reload # 重新加载守护进程配置sudo systemctl restart docker.service # 重启 docker 服务 Shell 脚本自动化每次使用包管理器升级 docker 后,配置都会重置,需要重新添加。这里提供一个 Shell 脚本用于定时作业自动化执行,减少繁琐的手动配置。 Shell 脚本内容如下: 12345678910if test -z "$(cat /usr/lib/systemd/system/docker.service | grep 2375)"; #判断是否不存在关键字2375then echo "不存在关键字2375,执行自动添加。" sudo sed -i 's#ExecStart=.*#ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock#' /usr/lib/systemd/system/docker.service sudo systemctl daemon-reload # 重新加载守护进程配置 sudo systemctl restart docker.service # 重启 docker 服务 echo "不存在关键字2375,自动添加、重启服务完成。"else echo "存在关键字2375,结束。"fi 这里使用 1Panel 的计划任务功能实现定时作业,如下图:OS_UPDATE为每月执行一次的更新系统,ENABLE_DOCKER_API放在其之后执行,以便能达到 docker 升级后自动化开启远程 API 的效果。 Unraid 开启 Docker 远程 API修改配置文件打开配置文件 1vi /boot/config/docker.cfg 最下方添加 1DOCKER_OPTS="--storage-driver=btrfs -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375" 重启服务1/etc/rc.d/rc.docker restart 群晖 DSM 开启 Docker 远程 API修改配置文件DSM 7.2 以后,Docker 更名为 Container Manager,所以配置文件路径不一样 1234###docker改名前sudo vi /var/packages/Docker/etc/dockerd.json###docker改名Container Manager后sudo vi /var/packages/ContainerManager/etc/dockerd.json 重启服务完成后到套件中心停用 - 启用 docker 套件。 参考 Docker 如何开启远程访问,实现 api 远程管理?其实只需要改一个地方即可_怎么开启远程 api 接口-CSDN 博客 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/2c94.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Unraid","slug":"Unraid","permalink":"https://blog.onehat.cn/tags/Unraid/"},{"name":"Docker","slug":"Docker","permalink":"https://blog.onehat.cn/tags/Docker/"},{"name":"群晖","slug":"群晖","permalink":"https://blog.onehat.cn/tags/%E7%BE%A4%E6%99%96/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"}]},{"title":"我的 HomeLab 入坑之路:实现篇","slug":"我的 Homelab 入坑之路:实现篇","date":"2023-09-26T01:29:39.000Z","updated":"2024-11-15T12:41:10.000Z","comments":true,"path":"p/c1d8.html","permalink":"https://blog.onehat.cn/p/c1d8.html","excerpt":"记录家庭网络拓扑、Homelab 的服务。","text":"记录家庭网络拓扑、Homelab 的服务。 系列文章: 我的 HomeLab 入坑之路:概述篇 我的 HomeLab 入坑之路:实现篇 网络拓扑光猫改桥接,主路由拨号,Homelab 连 2.5G 交换机。 家庭设备 设备 型号、配置 联网方式 用途、备注 光猫 联通千兆光猫 千兆有线 主路由 红米 AC2100 千兆路由器 千兆有线 拨号、WIFI 2.5G 交换机 爱快 IK-S3009MT 8 口 2.5G 千兆有线 拓展 2.5G 网络 AurStation i3 12100 + 64G RAM 2.5G 有线 Homelab 本体 MacMini 黑苹果,华擎 Deskmini H310 准系统 + i5 9400 + 32G RAM 千兆有线 台式机;macOS x64 日用 NT-GG i3 12400F + 32G RAM + RTX 2060S 2.5G 有线 台式机;游戏 + 主力开发机 NT-MC 6800H + 64G RAM 无线 笔记本;主力开发机 Macbook Air m1 + 16G RAM 无线 笔记本;macOS 日用 常用服务 虚拟机 操作系统 用途 服务 重要级别 221 (istoreos) istoreos 旁路由 openclash、adguardhome、kms s1 220 (unraid) unraid 主 NAS,提供基础存储服务(SMB、NFS),运行一些存储密集型的服务 s2 250 (dc-server) Windows Server 2022 域控服务器、DNS 服务器、RDP 授权服务器 管理内网 AD 域、DNS、RDP 会话主机激活 s3 200 (proxy) Rocky Linux 9 代理服务器,核心为 NPM,负责在使用 tailscale 时,代理内网的数据库服务;另外部署了 zabbix 和 harbor s3 246 (app) Rocky Linux 9 应用服务器,各种 docker 应用 s4 244 (console) Windows Server 2022 控制台,负责提供一个临时的 Windows 环境:当使用 macOS 需要临时使用 Windows 程序、外网使用 tailscale 连进来需要使 Windows 时就派上用场 已加入 AD 域,运行各种 Windows 桌面程序 s4 249 (db-server) Windows Server 2022 数据库服务器 已加入 AD 域,运行 3 大关系数据库:SQL Server 2012、Oracle 11g、MySQL 5.7 s4 223 (haos) homeassistant os 智能家居中枢 s4 222 (dsm) dsm 7.1 黑群晖系统,无直通硬盘,备用 s4 218 (media) debian 12 穿透核显的 lxc 容器,作为媒体服务器 s5 254 (w11-dev) windows 11 直通独显的 windows 虚拟机,可以插上显示器作为临时终端使用 虚拟机管理PVE 8 在虚拟机管理方面体验已经挺好了,向旁路由、NAS 虚拟机直通了 PCIE 网口、向虚拟机、LXC 直通了独显和核显。 将 NAS 的存储挂载到 PVE 里,设置定时的备份任务:每周一次整机备份到 NFS;每日增量备份到 PBS。 应用管理(Docker)绝大多数服务使用 docker-compose 部署,在内网 Gitea 建立存储库管理 compose 文件,使用 Portainer-EE 进行 stack 管理,其 GitOps update 功能,可以定时的检查 Git 存储库,有更新则直接拉取对应文件并更新 stack,这属于简单的容器流水线实现。 音乐管理资源来源wusunk.com 管理与播放下载完成后,在 MusicTag/MusicTag Web 刮削元数据。然后拷贝到 Navidrom 目录下,终端(手机、PC、MAC)使用音流 APP 听歌。 音流 PC 端: 影视管理电影、电视剧:从网络下载,在 TMM 刮削元数据,拷贝到 Jellyfin 媒体库目录,终端(手机、PC、MAC)使用 Jellyfin Media Player 观看。 电子书管理资源来源安娜的档案、Zlibrary 管理与阅读我的图书资源分为文学类和技术类两大类。 文学类从网络下载 epub、PDF 电子书,导入 Calibre-Web 进行管理、刮削。 桌面端(PC、MAC)安装 Calibre 链接 Calibre-Web 数据库,直接阅读。 移动端浏览器访问 Calibre-Web,下载到本地,使用 APP 阅读(APP 推荐 kybook3) 。 技术类技术类书籍使用 Zotero 进行纳管,Zotero 安装配置茉莉花插件后,支持与 Zotero Connector 浏览器插件联动进行豆瓣书籍刮削。 茉莉花插件:安装 Zotero Connector 浏览器插件(豆瓣读书): 安装 虽然 Zotero 软件内已经支持阅读 PDF、EPUB 等格式书籍,但是我觉得体验不佳,好在可以在设置中添加自己喜欢的阅读器,用来阅读书籍。 UPS 管理光猫、主路由、交换机、Aurstation、MacMini 等设备电源接入 UPS,在未开启 MacMini 的情况下,内网设备功耗约为 70-90w。 UPS 数据管理连接到 PVE 的 host,其安装了 NUT-Server,向局域网提供 NUT 服务,在断电时会先通知各个 NUT Client 关机,PVE 最后关机。 Unriad NUT PeaNutDocker 的 PeaNut 服务提供简单的 WebUI 以查看 UPS 信息: -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/c1d8.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"群晖","slug":"群晖","permalink":"https://blog.onehat.cn/tags/%E7%BE%A4%E6%99%96/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"HomeLab","slug":"HomeLab","permalink":"https://blog.onehat.cn/tags/HomeLab/"}]},{"title":"我的 HomeLab 入坑之路:概述篇","slug":"我的 Homelab 入坑之路:概述篇","date":"2023-09-26T01:29:39.000Z","updated":"2024-10-22T10:23:01.000Z","comments":true,"path":"p/a169.html","permalink":"https://blog.onehat.cn/p/a169.html","excerpt":"记录自己的 HomeLab 入坑之路。","text":"记录自己的 HomeLab 入坑之路。 系列文章: 我的 HomeLab 入坑之路:概述篇 我的 HomeLab 入坑之路:实现篇 设备历程自从 2020 年玩矿渣开始,陆续在网络附加存储(NAS)和家庭实验室(HomeLab)领域花了不少的时间和金钱,本文仅做记录使用,也可以作为参考自建的依据。 目前我保留的设备为两台,一台物理黑群晖(以下简称 WSQ),一台基于 PVE 虚拟化的 AIO 设备(以下简称 AurLab)。 WSQ 的配置为 J1900+4G RAM,AurLab 的配置较为复杂,看下文描述。 目前我保留的设备只有一台基于 PVE 虚拟化的 AIO 设备(以下简称 AurStation)。 硬件概述因在两三年内存在硬件更换设备使用,本节列出的硬件以目前设备上机使用的为准。 WSQ 为某多购入的矿渣设备整机。(2024.03 已将 WSQ 出二手,净 290 元,回血率 60.29%) 硬件 规格 数量 平台 价格 日期 整机 J1900+4G RAM 绿牌 WSQ-1 1 多 481 2020.11.07 风扇 超频三 F85 8cm 机箱风扇 1 东 18.49 2020.11.11 硬盘 西数蓝盘 2TB 2.5 英寸 7mm SATA3 1 东 374.99 2022.09.03 合计 874.48 AurStation 的硬件以目前上机的为主,几乎所有硬件都是全新的(某鱼购入的默认二手),价格为当时购入的花费。 硬件 规格 数量 平台 价格 日期 主板 铭瑄 B660M 终结者 1 鱼 600 2023.04.12 CPU 酷睿 i9 12900 ES(已更换为 i3 12100) 1 鱼 670 2023.04.12 CPU 酷睿 i3 12100 1 宝 630 2022.11.11 内存 光威天策马甲条 D4 3200 32G 2 东 737.99 2023.04.13 机箱 御夫座套餐(盘位规格 2 个 2.5+6 个 3,5) 1 宝 778 2023.04.12 风扇 御夫座套餐 - - - - 散热器 御夫座套餐(五热管,解热 150w) - - - - 定制 SATA 线 御夫座套餐 - - - - 电源 鑫谷 AM650 全模组 650w 白牌电源 1 多 287.79 2023.04.12 转接卡 JMicron 585 芯片 m2 转 5 SATA 1 多 100.83 2023.04.14 交换机 爱快 IK-S3009MT 8 口 2.5G 1 东 370.07 2023.06.16 网卡 DIEWU 4 口 2.5G PCIE 网卡 1 宝 295 2023.07.12 网卡 Realtek R8125BG PCIE 网卡(给与 NAS 连接的主机使用) 1 宝 42.68 2023.07.15 网卡 Intel i226-v PCIE 网卡(给与 NAS 连接的主机使用) 1 多 78 2023.09.20 固态 闪迪至尊 3D 1T SATA 固态(全国联保 5 年) 1 东 829 2020.10.01 固态 梵想 S790 2T m2 固态(全国联保 5 年) 1 东 438.12 2023.05.31 机械硬盘 西数企业盘 HC320 8T(全国联保 5 年) 1 宝 958 2020.11.07 机械硬盘 西数企业盘 HC320 8T(全国联保 5 年) 1 多 836.51 2022.10.22 机械硬盘 希捷监控盘酷鹰 ST4000VX015 4T(海康联保 3 年) 1 宝 428 2023.08.05 机械硬盘 日立企业盘 HUS726040ALE611 4T(二手,店保一年) 1 多 189.99 2023.08.05 UPS 施耐德 APC BK650M2-CH 1 东 472.5 2022.09.03 合计 8073.48 软件一览一般来说,想在单一的系统下自由的飞翔实现丰富的功能并不容易,所以我选择虚拟化平台,将各个不同的系统以虚拟机的形式组合起来,以供发挥每个系统的优势,相对而言,比起单一的系统,会产生更大的资源消耗。 底层系统:Promox VE底层使用 PVE 系统,仅做基本的直通配置,服务和功能都交给虚拟机来实现。 2023.10 以前使用 12900ES2023.10 使用 12100 NAS 系统 1:黑群晖业务负载为备份,除 PBS 外不跑任何的 docker 服务,用于备份 PVE 的虚拟机、macOS 的时间机器。 2024.10 黑群晖不再承载任何业务,仅作为实验环境使用。 NAS 系统 2:Unraid业务负载为磁盘管理、影音服务器、家用服务器,上面运行了各种 dockr 服务,特别是数据库之类的 IO 密集容器,直接装在 NAS 里使用可以减少资源损耗。 2023.09 使用 6.11.5 2024.01 使用 6.12.6 堡垒机/跳板机:JumpServer使用 JumpServer,将内网环境集中到浏览器中,一个浏览器,可以做到远程桌面、SSH 连接、数据库连接、调用桌面原生程序。通过 Cloudflare-Tunnel 内网穿透,将 JumpServer 映射到外网,便于外网快速访问 HomeLab 上的资源(不使用下载密集场景,因为穿透网速感人)。 服务一览 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/a169.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"群晖","slug":"群晖","permalink":"https://blog.onehat.cn/tags/%E7%BE%A4%E6%99%96/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"HomeLab","slug":"HomeLab","permalink":"https://blog.onehat.cn/tags/HomeLab/"}]},{"title":"PVE8 虚拟机迁移到 ESXi","slug":"PVE8 虚拟机迁移到 ESXi","date":"2023-09-23T02:29:39.000Z","updated":"2023-09-23T02:29:39.000Z","comments":true,"path":"p/adb8.html","permalink":"https://blog.onehat.cn/p/adb8.html","excerpt":"本文迁移对象为虚拟机磁盘,而非虚拟机整机。即借助 PVE 命令行工具 qemu-img、ESXi 命令行工具 vmkfstools做磁盘格式转换。 qemu-img不局限 PVE 环境,在大多数基于 kvm 的虚拟化平台都可用。","text":"本文迁移对象为虚拟机磁盘,而非虚拟机整机。即借助 PVE 命令行工具 qemu-img、ESXi 命令行工具 vmkfstools做磁盘格式转换。 qemu-img不局限 PVE 环境,在大多数基于 kvm 的虚拟化平台都可用。 先决条件具备实验环境Proxmox VE 8.0 12proxmox-ve: 8.0.2 (running kernel: 6.2.16-14-pve)qemu-server: 8.0.7 ESXi 8.0 1ESXi-8.0U1c-22088125-standard qcow2 转换为 vmdk操作对象为 PVE 环境。PVE 虚拟机存储目录为 /var/lib/vz/images,其下为各个 VMID 对应的子文件夹。进入子文件夹,则可以看到 qcow2 格式的虚拟机磁盘文件。 将 kvm 虚拟机由 qcow2 转换成 vmdk 格式。为了防止镜像被拆分为 2GB 的小块,需要增加 compat6 的选项。 1qemu-img convert -f qcow2 虚拟磁盘名.qcow2 -O vmdk 虚拟磁盘名.vmdk -o compat6 大约等个几分钟(随着文件大小而定),文件格式转换完成。 vmdx 二次转换操作对象为 ESXi 环境。开启 ssh 访问,将上述转换得到的 vmdk 文件上传到 ESXi 的存储中。 使用命令行转换 vmdk 为 ESXi 能使用的磁盘格式。 1vmkfstools -i 虚拟磁盘名.vmdk -d thin 虚拟磁盘名_new.vmdk 其中-d 参数 thin为精简置备,生产环境按需调整为厚置备置零 eagerzeroedthick、厚置备延迟置零 zeroedthick。 命令执行后出现百分比,等待转换完成会有 100% 输出。 ESXi 新建虚拟机,挂载转换后的磁盘即可。 相关问题Windows sid 变更sid 作为 windows 系统唯一的标识,对某些集群业务有依赖关系,如果重复可能导致集群部署异常。如:域控 AD 就依赖 sid 功能。 硬盘转换前后两个系统的唯一标识符 sid 是一样的,最好对后者进行变更。 查看 sid 命令行 whoami /all 修改 sid 命令行 C:\\Windows\\System32\\Sysprep\\sysprep.exe,弹出系统准备工具,勾选通用,确定后自动重启进入 OOBE 创建用户界面,建议保留原有用户账号、密码。 windows 网卡变更虚拟机网卡变更将会导致原有网卡设备由于未接入而隐藏,这就像 USB 拔出将无法查看到设备信息。 如不变更 IP,重新设置相同的静态 IPV4,操作系统会自动提示删除,点是。 如有变更 IP 的需要,需要手动处理。 CMD 控制台: 12set devmgr_show_nonpresent_devices=1start devmgmt.msc 设备管理器删除旧设备释放网卡配置: 1HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters\\Interfaces 找到之前的网络信息,并且删除重启。 Linux 机器号如果需要重置机器 id 12sudo rm -f /etc/machine-idsudo rm -f /var/lib/dbus/machine-id 然后关机,下次启动会生成新的机器 id,如果没有生成,可以运行以下命令: 1sudo systemd-machine-id-setup Linux 系统其他问题可能会存在 GRUB 引导失败、网卡变更问题,需要修复引导、重设上网网卡和静态 IP。 参考 KVM 虚拟机迁移到 ESXi(3) - 知乎 (zhihu.com) 支持的磁盘格式 (vmware.com) -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/adb8.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"ESXi","slug":"ESXi","permalink":"https://blog.onehat.cn/tags/ESXi/"}]},{"title":"Ubuntu22.04 开启 RDP 远程桌面","slug":"Ubuntu22.04 开启 RDP 远程桌面","date":"2023-09-14T02:29:39.000Z","updated":"2023-09-14T02:29:39.000Z","comments":true,"path":"p/f62e.html","permalink":"https://blog.onehat.cn/p/f62e.html","excerpt":"记录如何使用默认设置开启 Ubuntu 的远程桌面连接(RDP)。","text":"记录如何使用默认设置开启 Ubuntu 的远程桌面连接(RDP)。 先决条件本次实验环境为 Ubuntu22.04 桌面版,默认 DE 为 Gnome42。 系统已设置静态 IPv4。 开启共享在设置 - 共享 - 远程桌面,打开按钮 远程桌面和 远程控制,并在下方的认证维护好远程登录使用的用户名和密码,推荐与本机登录密码一致。完成后即可使用 mstsc 进行登录。 设置无人值守开启用户自动登录在设置 - 用户,先点击右上角解锁按钮认证,以解锁此页的设置权限。 完成认证后开启自动登录按钮。 关闭屏幕超时锁屏在设置 - 隐私 - 屏幕,息屏延时设置为从不,自动锁屏关闭。 登录密钥环密码清空如不清空,每次自动登录后都需要手动解锁,才能使用远程桌面,达不到无人值守的目的。 在终端输入 seahorse,打开 密码和密钥,选中 登录,右键更改密码,设置空即可。 至此,已完成全部设置,重启验证是否有效。 推荐同时开启 ssh 登录,以备不时之需。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/f62e.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"}]},{"title":"Ubuntu22.04 使用 SSSD 加入 AD 域","slug":"Ubuntu22.04 使用 SSSD 加入 AD 域","date":"2023-09-05T02:29:39.000Z","updated":"2023-09-05T02:29:39.000Z","comments":true,"path":"p/97b7.html","permalink":"https://blog.onehat.cn/p/97b7.html","excerpt":"记录 Ubuntu 如何接入 AD 域,linux 系统加入 AD 域的方式有很多种,SSSD 是其中的一种。","text":"记录 Ubuntu 如何接入 AD 域,linux 系统加入 AD 域的方式有很多种,SSSD 是其中的一种。 先决条件具备已配置好的 AD 域服务器、AD 域用户组、AD 域用户 本次域控实验环境如下: AD 域名 AD 域服务器 IP 域用户 所属用户组 onehat.cn 192.168.31.250 Administrator admin Ubuntu22.04 实验环境如下: 主机名 IP 本地用户名 ub22-227 192.168.31.227 dsf 网络已设置为静态 IP,主 DNS 指向域控服务器。 安装依赖包1sudo apt install sssd-ad sssd-tools realmd adcli 加入域1sudo realm join -v onehat.cn 默认要求验证域控管理员账户,输入密码完成验证则可加入成功。 验证域用户可登录性1sudo login 使用域用户登录,格式为 user@xxxx.xx 回车后按提示录入密码,则登录成功。 添加域控组到 sudoersudo 是 linux 发行版常用的提权组件,使用域控用户登录后,发现是无法获取 sudo 权限的,返回以下提示信息: 12administrator@onehat.cn@ub22-227:/$ sudo apt updateadministrator@onehat.cn 不在 sudoers 文件中。此事将被报告。 新开一个终端窗口,新建域控使用的 sudoer 文件: 1sudo vi /etc/sudoers.d/domain_admins 在 vim 窗口输入,然后保存并退出。无需重启,原有的已登录域用户的终端窗口,已经可以使用 sudo 命令了。 1%admin@onehat.cn ALL=(ALL) ALL #作用是将域控用户组admin添加到sudoer用户列表,允许组内用户使用sudo提权。 至此,域控用户已经可以在 Ubuntu 本机完成登录、提权的操作了。 参考 How to set up SSSD with Active Directory | Ubuntu -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/97b7.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://blog.onehat.cn/tags/Ubuntu/"},{"name":"AD 域","slug":"AD-域","permalink":"https://blog.onehat.cn/tags/AD-%E5%9F%9F/"}]},{"title":"Ubuntu22.04 安装 RTL8125B 驱动","slug":"Ubuntu22.04 安装 RTL8125B 驱动","date":"2023-07-25T02:29:39.000Z","updated":"2023-07-25T02:29:39.000Z","comments":true,"path":"p/59dc.html","permalink":"https://blog.onehat.cn/p/59dc.html","excerpt":"购入了一块 RTL8125BG 的 4 口 2.5G 网卡(PCIE x4 接口),记录一下在 Uuntu 下安装官方驱动程序。","text":"购入了一块 RTL8125BG 的 4 口 2.5G 网卡(PCIE x4 接口),记录一下在 Uuntu 下安装官方驱动程序。 下载从 Realtek 瑞昱下载驱动压缩包。瑞昱半导体 (realtek.com) 安装先在 Ubuntu 安装编译环境 1sudo apt install build-essential 解压缩驱动包,进入驱动目录,执行: 1sudo ./autorun.sh 等待终端输出 Completed,即安装完成。 使用内网测速,则上传/下载基本可以跑满 2.5G。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/59dc.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://blog.onehat.cn/tags/Ubuntu/"}]},{"title":"PVE8 添加 PCIE 网卡后导致网卡编号变化","slug":"PVE8 添加 PCIE 网卡后导致网卡编号变化","date":"2023-07-13T02:29:39.000Z","updated":"2023-07-13T02:29:39.000Z","comments":true,"path":"p/54f9.html","permalink":"https://blog.onehat.cn/p/54f9.html","excerpt":"记录 PVE8.0 装好系统后添加网卡导致的网卡变化。","text":"记录 PVE8.0 装好系统后添加网卡导致的网卡变化。 123456789101112131415161718192021222324252627282930313233343536╭─root@pve /sys/class/net╰─# cd /sys/class/net╭─root@pve /sys/class/net╰─# lsbonding_masters enp10s0 enp6s0 enp7s0 enp8s0 enp9s0 lo vmbr0╭─root@pve /sys/class/net╰─# cat /sys/class/net/enp10s0/address00:e2:69:61:2d:81╭─root@pve /sys/class/net╰─# cat /sys/class/net/enp6s0/address1c:86:0b:21:28:af╭─root@pve /sys/class/net╰─# cat /sys/class/net/enp7s0/address1c:86:0b:21:28:b0╭─root@pve /sys/class/net╰─# cat /sys/class/net/enp8s0/address1c:86:0b:21:28:b1╭─root@pve /sys/class/net╰─# cat /sys/class/net/enp9s0/address1c:86:0b:21:28:b2╭─root@pve /sys/class/net╰─# cat /etc/network/interfacesauto loiface lo inet loopbackiface enp10s0 inet manualauto vmbr0iface vmbr0 inet static address 192.168.31.240/24 gateway 192.168.31.1 bridge-ports enp10s0 bridge-stp off bridge-fd 0╭─root@pve /sys/class/net╰─# systemctl restart networking.service -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/54f9.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Debian","slug":"Debian","permalink":"https://blog.onehat.cn/tags/Debian/"}]},{"title":"PVE8 修改软件仓库源和 LXC 源为国内源","slug":"PVE8 修改软件仓库源和 LXC 源为国内源","date":"2023-03-10T02:29:39.000Z","updated":"2023-03-10T02:29:39.000Z","comments":true,"path":"p/7422.html","permalink":"https://blog.onehat.cn/p/7422.html","excerpt":"记录 PVE8 换源。","text":"记录 PVE8 换源。 apt 软件源替换前建议先更新下证书,否则可能由于证书不可用导致 https 无法使用,进而无法下载所有软件 1sudo apt install apt-transport-https ca-certificates 首先替换通用软件源,Debian 的软件源配置文件是 /etc/apt/sources.list 备份后输入以下命令直接填充 123# mirrors.utsc.edu.cn# Downlaod and Install debian 12 sourcelistcurl -fsSL https://mirrors.ustc.edu.cn/repogen/conf/debian-https-4-bookworm -o /etc/apt/sources.list pve 软件源pve 镜像默认的 pve 软件源配置文件是 /etc/apt/sources.list.d/pve-no-subscription.list 备份后将其中内容替换为以下即可: 123nano /etc/apt/sources.list.d/pve-no-subscription.list#修改成以下内容deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription 完成之后运行以下指令把软件源的密钥安装一下 12#Downlaod and install gpg keywget https://mirrors.ustc.edu.cn/proxmox/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg 编辑 PVE ceph 源 配置文件是 /etc/apt/sources.list.d/ceph.list 123nano /etc/apt/sources.list.d/ceph.list# 改成如下内容deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription 然后就可以愉快的更新软件源了 1apt update CT Templates (LXC 容器) 源将 /usr/share/perl5/PVE/APLInfo.pm 文件中默认的源地址 http://download.proxmox.com 替换为 https://mirrors.tuna.tsinghua.edu.cn/proxmox 即可 12cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_backsed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm 针对 /usr/share/perl5/PVE/APLInfo.pm 文件的修改,重启后生效 1systemctl restart pvedaemon.service 之后在 pve 网页端下载 CT Templates 速度就很快了。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/7422.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Debian","slug":"Debian","permalink":"https://blog.onehat.cn/tags/Debian/"}]},{"title":"个人建站数据备忘","slug":"个人建站数据备忘","date":"2022-10-24T11:49:21.000Z","updated":"2022-10-24T11:49:21.000Z","comments":true,"path":"p/d8f8.html","permalink":"https://blog.onehat.cn/p/d8f8.html","excerpt":"记录建站相关使用的一些数据和备忘事项。","text":"记录建站相关使用的一些数据和备忘事项。 数据标准 站点 事项 数值 备忘 博客 headimg 头图大小 840x280 像素 博客 书籍封面图片大小 - 单页 340x423 像素 表格内 博客、笔记 书籍封面图片大小 - 双页 680x423 像素 表格内 笔记 首行 icon 256x256 像素 favicon 网站小图标设置 网站 设置方法 mkdocs mkdocs 官方文档create an img subdirectory in the docs directory and copy your custom favicon.ico file to that directory. MkDocs will automatically detect and use that file as your favicon icon. hexo favicon.ico放在 source文件夹 homepage settings.yaml里添加配置项 favicon,如:favicon: favicon.ico -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/d8f8.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"备忘录","slug":"备忘录","permalink":"https://blog.onehat.cn/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Hexo","slug":"Hexo","permalink":"https://blog.onehat.cn/tags/Hexo/"}]},{"title":"转载--VisualSVN 破解(VS2019)","slug":"转载--VisualSVN 破解(VS2019)","date":"2022-10-14T12:22:39.000Z","updated":"2022-10-14T12:22:39.000Z","comments":true,"path":"p/8180.html","permalink":"https://blog.onehat.cn/p/8180.html","excerpt":"使用反编译工具来破解 VisualSVN。 原文地址:https://blog.csdn.net/lilixiaojun/article/details/119421212","text":"使用反编译工具来破解 VisualSVN。 原文地址:https://blog.csdn.net/lilixiaojun/article/details/119421212 第一步准备工具 dnSpy(下载地址:http://www.pc6.com/softview/SoftView_481260.html) 第二步查找 VisualSun 安装目录,以下地址为我的安装目录,供参考 说明:我记得以前的 VisualSvn 安装文件是单独的一个目录,如:Program Files 文件夹下某目录,现在的目录应该是 vs2017 的缘故。另外 AppData 是隐藏文件夹,所以要打开 总之 找到如下 红框中的 dll 就行了 第三步用 dnSpy 打开该 dll(一定要在该目录下直接打开,不要复制出去修改,否则反编译修改编译不通过,依赖的 dll 都在该目录下;怕改错就把该 dll 备份一下) 找到如下方法;把 30 天改为 3650 天,当然你也可以为 8888,9999,6666 总之想要多少天就改为多少天~(但是不能太大,否则会失效) 右键“编辑类” 改完之后点 右下角 编译 再点保存","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"获取信息源","slug":"获取信息源","permalink":"https://blog.onehat.cn/categories/%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF%E6%BA%90/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Windows","slug":"Windows","permalink":"https://blog.onehat.cn/tags/Windows/"},{"name":"转载","slug":"转载","permalink":"https://blog.onehat.cn/tags/%E8%BD%AC%E8%BD%BD/"},{"name":"破解","slug":"破解","permalink":"https://blog.onehat.cn/tags/%E7%A0%B4%E8%A7%A3/"}]},{"title":"转载--群晖 Docker 安装 Clash","slug":"转载--群晖 Docker 安装 Clash","date":"2022-03-09T13:29:39.000Z","updated":"2022-03-09T13:29:39.000Z","comments":true,"path":"p/f0da.html","permalink":"https://blog.onehat.cn/p/f0da.html","excerpt":"群晖 Docker 安装 Clash。 原文地址:群晖 docker 安装并运行 Clash+UI | reizhi (roov.org)","text":"群晖 Docker 安装 Clash。 原文地址:群晖 docker 安装并运行 Clash+UI | reizhi (roov.org) 前一篇文章中我们提到了在群晖的 docker 中安装 RcloneBrowser,而为了更好的为其提供网络环境,这篇文章我们将介绍如何在群晖 docker 中安装并运行 Clash 以及 UI 界面。有关下载镜像和创建容器的步骤可以参考前文,这里便不再重复说明了。 1.准备 Clash 配置文件本篇文章并不会涉及如何获取适当的 Clash 配置文件,这部分请自行想办法解决。 在准备好 Clash 配置文件后,使用任意文本编辑器打开,查找并确认以下设置:(不要带上#及后面的部分) port: 7890 #http/https 监听端口 socks-port: 7891 #socks5 监听端口 allow-lan: true #允许外部连接 external-controller: 9090 #UI 监听端口 如果配置文件中不存在对应的项目,请在文件头部进行添加。其中第一,第二及第四项的端口号可以在 1024-65535 之间任意设置但不得重复,第三项必须设置为 true。 示例配置文件如下: 保存后将该文件复制到群晖的共享文件夹中,如 /docker/clash/sub.yaml。 2.创建 Clash 容器进入 docker 套件并下载映像 dreamacro/clash,随后双击映像创建容器,并点击高级设置。在卷页面中,为 /ui 创建文件夹挂载点,为 /root/.config/clash/config.yaml 创建文件挂载,指向前一步中的配置文件。 在端口设置页面中,为前一步中的 port, socks-port, external-controller 三个端口创建对应的映射端口。如有需要类型可以选择 TCP 和 UDP。 3.创建 UI 容器在 docker 中下载映像 haishanh/yacd 并创建容器,这里只需要为 80 端口创建映射端口即可。 4.登录使用在确保以上两个容器都启动运行后,在浏览器中打开 http://群晖的 ip 地址:步骤 3 中的本地端口(本例中是 http://reizhix:5080),便可以看到如下的登陆界面。 其中,Hostname 填写群晖的 ip 地址(切勿使用默认的 127.0.0.1),Port 填写步骤 2 中 9090 所对应的映射端口(本例中是 5090),点击 Confirm 即可进入 Clash UI 的主界面。 此时 Clash 会监听步骤 2 中的 5890 和 5891 端口并向局域网提供服务。由于本教程中没有配置认证,请勿将相关端口映射到外网。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"获取信息源","slug":"获取信息源","permalink":"https://blog.onehat.cn/categories/%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF%E6%BA%90/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"群晖","slug":"群晖","permalink":"https://blog.onehat.cn/tags/%E7%BE%A4%E6%99%96/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"转载","slug":"转载","permalink":"https://blog.onehat.cn/tags/%E8%BD%AC%E8%BD%BD/"}]},{"title":"个人 Linux 基础配置","slug":"个人 Linux 基础配置","date":"2021-09-30T02:29:39.000Z","updated":"2021-09-30T02:29:39.000Z","comments":true,"path":"p/291a.html","permalink":"https://blog.onehat.cn/p/291a.html","excerpt":"记录个人使用 Linux 的配置。","text":"记录个人使用 Linux 的配置。 梗图:linux 阵营图 修改主机名1hostnamectl set-hostname hostname git、github1234567891011121314151617181920212223242526###安装gitapt install git###设置用户信息git config --global user.name "123"git config --global user.email "123@gmail.com"###生成ssh密钥(生成的id_rsa.pub添加的Github)ssh-keygen -t rsa -C "123@gmail.com"#git设置代理git config --global http.proxy 'http://127.0.0.1:7890'git config --global https.proxy 'http://127.0.0.1:7890'#git查看代理git config --global --get http.proxygit config --global --get https.proxy#git取消代理git config --global --unset http.proxygit config --global --unset https.proxy#Github连通性测试ssh -T git@github.com#git修改443端口$ vim ~/.ssh/config```# Add section below to itHost github.com Hostname ssh.github.com Port 443``` zsh、ohmyzsh安装123456789101112###安装zshapt install zsh curl###替换bash为zshchsh -s /bin/zsh###安装ohmyzshsh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"###安装插件###1.语法高亮显示git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting ###2.自动补全git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions 开启插件下载完了以后打开 .zshrc 文件 放入 plugins 里面就可以。 123456789###每个插件注意空格分隔 或者换行plugins=(git zsh-syntax-highlighting)//或者这样plugins=( git zsh-syntax-highlighting zsh-autosuggestions) 更新配置文件 source ~/.zshrc CPU 省电模式1234567891011#可用的模式cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors#设置到性能模式cpupower -c all frequency-set -g performance#查看当前所处模式cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor#设置到省电模式cpupower -c all frequency-set -g powersave -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/291a.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"备忘录","slug":"备忘录","permalink":"https://blog.onehat.cn/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"}]},{"title":"Xamarin.Android 的 Debug 记录","slug":"Xamarin.Android 的 Debug 记录","date":"2020-03-28T04:29:39.000Z","updated":"2020-03-28T04:29:39.000Z","comments":true,"path":"p/2fc4.html","permalink":"https://blog.onehat.cn/p/2fc4.html","excerpt":"记录 Xamarin.Android 的 Debug 错误。","text":"记录 Xamarin.Android 的 Debug 错误。 1.Resources目录下 styles.xml报错错误No resource found that matches the given name: attr 'windowActionModeOverlay'. 解决删除以下缓存文件夹 1C:\\Users\\<my user>\\AppData\\Local\\Xamarin 2.“java.exe”已退出,代码为 1错误12341>MSB6006: “java.exe”已退出,代码为 1。1>已完成生成项目“xxxxx.xxxx.Android.csproj”的操作 - 失败。1>生成失败。1>Deployment failed to Xiaomi MI 4LTE. 解决几乎把 stackoverflow 的帖子翻遍了,排查了各种环境配置,都没有用。过了一个多礼拜,就是今天,忽然想起去年升级 win10 1909 后手动开启了一项 Beta 性功能:开启系统级 utf8 支持关闭此功能,重启,打开 VS,清空解决方案,生成,然后就 OK 了!!!所以说,开发机器还是稳一手,别手痒,启用新功能的代价可能是指数级增加 Debug 难度附图: 参考 android - No resource found - Theme.AppCompat.Light.DarkActionBar - Stack Overflow -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/2fc4.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Android","slug":"Android","permalink":"https://blog.onehat.cn/tags/Android/"},{"name":"Xamarin","slug":"Xamarin","permalink":"https://blog.onehat.cn/tags/Xamarin/"}]},{"title":"Deepin 跳过硬盘安装限制","slug":"Deepin 跳过硬盘安装限制","date":"2020-03-15T02:29:39.000Z","updated":"2020-03-15T02:29:39.000Z","comments":true,"path":"p/13ad.html","permalink":"https://blog.onehat.cn/p/13ad.html","excerpt":"前几天把闲置的 cb2 从 GalliumOS 换到了 deepin。","text":"前几天把闲置的 cb2 从 GalliumOS 换到了 deepin。 但是 deepin15.7 安装时对硬盘有限制,最小大小为 16G。修改其安装器的配置文件 /etc/deepin-installer.conf配置项 partition_minimum_disk_space_required = 16中的数字为适合大小即可。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/13ad.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Chromebook","slug":"Chromebook","permalink":"https://blog.onehat.cn/tags/Chromebook/"}]},{"title":"常见数据库的默认端口","slug":"常见数据库的默认端口","date":"2019-06-23T02:29:39.000Z","updated":"2019-06-23T02:29:39.000Z","comments":true,"path":"p/2bb5.html","permalink":"https://blog.onehat.cn/p/2bb5.html","excerpt":"常见数据库端口,来自 jetbrains。","text":"常见数据库端口,来自 jetbrains。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/2bb5.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Database","slug":"Database","permalink":"https://blog.onehat.cn/tags/Database/"}]},{"title":"学习摘要:设计模式","slug":"学习摘要:设计模式","date":"2019-05-14T02:29:39.000Z","updated":"2019-05-14T02:29:39.000Z","comments":true,"path":"p/5d0c.html","permalink":"https://blog.onehat.cn/p/5d0c.html","excerpt":"记录设计模式学习摘要。","text":"记录设计模式学习摘要。 一、创建型模式 创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。每一个创建型模式都在视图回答 3 个问题:3W-> 创建什么(What)、由谁创建(Who)和何时创建(When)。 1.单例模式 singleton1.1 要点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建模式。 单例模式有 3 个要点: 某个类只能有一个实例 它必须自行创建这个实例 它必须自行向整个系统提供这个实例 1.2 结构图 Singleton(单例): 在单例类的内部实现只生成一个实例,同时它提供一个静态的 GetInstance()方法,让客户可以访问它的唯一实例; 为了防止在外部对单例类实例化,它的构造函数被设为 private; 在单例类的内部定义了一个 Singleton类型的静态对象,作为提供外部共享的唯一实例。 情景模拟 1假设M公司成都分公司的IT开发部门承接了一个服务器负载均衡器(Load Balance)软件的开发,该软件运行在一台负载均衡服务器上面,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高系统的整体处理能力,缩短响应时间。由于集群中的服务器需要动态增减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,即只能有一个负载均衡器实例来管理服务器和分发请求,否则会带来服务器状态的不一致以及请求的分配冲突等问题。如何确保负载均衡器的唯一性成为了这个软件成功地关键。 1.3 饥汉式与懒汉式单例饥汉式单例在 C#中,我们可以利用静态构造函数来实现。 C#的语法中有一个函数能够确保只调用一次,那就是静态构造函数。由于 C#是在调用静态构造函数时初始化静态变量,.NET 运行时(CLR)能够确保只调用一次静态构造函数,这样我们就能够保证只初始化一次 instance。 12345678910111213public class LoadBalancer { // 私有静态变量,存储唯一实例 private static readonly LoadBalancer instance = new LoadBalancer(); ...... // 公共静态成员方法,返回唯一实例 public static LoadBalancer GetLoadBalancer() { return instance; } } 饿汉式是在 .NET 中实现 Singleton 的首选方法。但是,由于在 C#中调用静态构造函数的时机不是由程序员掌控的,而是当.NET 运行时发现第一次使用该类型的时候自动调用该类型的静态构造函数(也就是说在用到 LoadBalancer时就会被创建,而不是用到 LoadBalancer.GetLoadBalancer()时),这样会过早地创建实例,从而降低内存的使用效率。此外,静态构造函数由 .NET Framework 负责执行初始化,我们对对实例化机制的控制权也相对较少。 懒汉式单例除了饿汉式之外,还有一种懒汉式。最开始我们实现的方式就是一种懒汉式单例,也就是说,在第一个调用 LoadBalancer.GetLoadBalancer()时才会实例化对象,这种技术又被称之为延迟加载(Lazy Load)。同样,我们的目标还是为了避免多个线程同时调用 GetLoadBalancer方法,在 C#中,我们可以使用关键字 lock/Moniter.Enter+Exit等来实现,这里采用关键字语法糖 lock来改写代码段: 123456789101112131415161718192021public class LoadBalancer { // 私有静态变量,存储唯一实例 private static LoadBalancer instance = null; private static readonly object syncLocker = new object(); ...... // 公共静态成员方法,返回唯一实例 public static LoadBalancer GetLoadBalancer() { if (instance == null) { lock (syncLocker) { instance = new LoadBalancer(); } } return instance; } } 问题貌似得以解决,但事实并非如此。如果使用以上代码来创建单例对象,还是会存在单例对象不一致。假设线程 A 先进入 lock 代码块内,执行实例化代码。此时线程 B 排队吃瓜等待,必须等待线程 A 执行完毕后才能进入 lock 代码块。但当 A 执行完毕时,线程 B 并不知道实例已经被创建,将继续创建新的实例,从而导致多个单例对象。因此,开发人员需要进一步改进,于是就有了双重检查锁定 (Double-Check Locking),其改写代码如下: 123456789101112131415161718192021222324252627public class LoadBalancer { // 私有静态变量,存储唯一实例 private static LoadBalancer instance = null; private static readonly object syncLocker = new object(); ...... // 公共静态成员方法,返回唯一实例 public static LoadBalancer GetLoadBalancer() { // 第一重判断 if (instance == null) { // 锁定代码块 lock (syncLocker) { // 第二重判断 if (instance == null) { instance = new LoadBalancer(); } } } return instance; } } 一种更好的单例实现饿汉式单例不能延迟加载,懒汉式单例安全控制繁琐,而且性能受影响。静态内部类单例则将这两者 有点合二为一。使用这种方式,我们需要在单例类中增加一个静态内部类,在该内部类中创建单例对象,再将该单例对象通过 GetInstance()方法返回给外部使用,于是开发人员又改写了代码: 12345678910111213141516171819public class LoadBalancer { ...... // 公共静态成员方法,返回唯一实例 public static LoadBalancer GetLoadBalancer() { return Nested.instance; } // 使用内部类+静态构造函数实现延迟初始化 class Nested { static Nested() { } internal static readonly LoadBalancer instance = new LoadBalancer(); } ...... } 该实现方法在内部定义了一个私有类型 Nested。当**第一次用到这个嵌套类型的时候,会调用静态构造函数创建 LoadBalancer的实例 instance**。如果我们不调用属性 LoadBalancer.GetLoadBalancer(),那么就不会触发.NET 运行时 (CLR)调用 Nested,也就不会创建实例,因此也就保证了按需创建实例(或延迟初始化)。可见,此方法既可以实现延迟加载,又可以保证线程安全,不影响系统性能。但其缺点是与具体编程语言本身的特性相关,有一些面向对象的编程语言并不支持此种方式。 1.4 单例模式总结主要优点 提供了对唯一实例的受控访问。单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。 允许可变数目的示例。基于单例模式,开发人员可以进行扩展,使用与控制单例对象相似的方法来获得指定个数的实例对象,既节省系统资源,又解决了单例对象共享过多有损性能的问题。(Note:自行提供指定书目的实例对象的类可称之为多例类)例如,数据库连接池,线程池,各种池。 主要缺点 单例模式中没有抽象层,因此单例类的扩展有很大的困难。 单例类的职责过重,在一定程度上违背了单一职责的原则。因为单例类既提供了业务方法,又提供了创建对象的方法(工厂方法),将对象的创建和对象本身的功能耦合在一起。不够,很多时候我们都需要取得平衡。 很多高级面向对象编程语言如 C#和 Java 等都提供了垃圾回收机制,如果实例化的共享对象长时间不被利用,系统则会认为它是垃圾,于是会自动销毁并回收资源,下次利用时又得重新实例化,这将导致共享的单例对象状态的丢失。 适用场景 系统只需要一个实例对象。例如:系统要求提供一个唯一的序列号生成器或者资源管理器,又或者需要考虑资源消耗太大而只允许创建一个对象。 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。比如,在 Flappy Bird游戏中,小鸟这个游戏对象在整个游戏中应该只存在一个实例,所有对于这个小鸟的操作(向上飞、向下掉等)都应该只会针对唯一的一个实例进行。 2.简单工厂模式 Simple Factory 工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式。本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于 GoF 23种设计模式,但在软件开发中却也应用地比较频繁。此外,工厂方法模式还有一位“大哥”—抽象工厂模式,会在后面进行介绍。 简单工厂(Simple Factory)模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法模式,它属于创建型模式。 2.1 要点简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需的对象,而无须知道其创建细节。 2.2 结构图 简单工厂模式包含 3 个角色: Factory - 工厂角色:该模式的核心,负责实现创建所有产品实例的内部逻辑,提供一个静态的工厂方法 GetProduct(),返回抽象产品类型 Product 的实例。 Product - 抽象产品角色:所有产品类的父类,封装了各种产品对象的共有方法,它的引入将提高系统的灵活性,使得在工厂类中只需要定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。 ConcreteProduct - 具体产品角色:简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。 在简单工厂模式中,客户端通过工厂类来创建一个产品类的实例,而无须直接使用 new 关键字来创建对象。(可以看出,它是工厂模式家族中最简单的一员) 情景模拟1M公司想要基于C#语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图标,例如柱状图、饼状图或折线图等。M公司图表库设计开发人员希望为应用系统开发人员提供一套灵活易用的图表库,而且可以较为方便地对图表库进行扩展,以便于在将来增加一些新类型的图表。 2.3 重构图表库的实现为了将 Chart 类的职责分离,同时将 Chart 对象的创建和使用分离,M 公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构图如下所示: 代码实现(1)抽象产品角色:IChartable接口 1234public interface IChartable{ void Display();} (2)具体产品角色:各种图表类型 1234567891011121314151617181920212223242526272829303132333435363738public class HistogramChart : IChartable{ public HistogramChart() { Console.WriteLine("创建柱状图..."); } public void Display() { Console.WriteLine("显示柱状图..."); }}public class LineChart : IChartable{ public LineChart() { Console.WriteLine("创建折线图..."); } public void Display() { Console.WriteLine("显示折线图..."); }}public class PieChart : IChartable{ public PieChart() { Console.WriteLine("创建饼状图..."); } public void Display() { Console.WriteLine("显示饼状图..."); }} (3)工厂角色:ChartFactory 12345678910111213141516171819202122232425public class ChartFactory{ public static IChartable GetChart(string type) { IChartable chart = null; if (type.Equals("histogram", StringComparison.OrdinalIgnoreCase)) { chart = new HistogramChart(); Console.WriteLine("初始化设置柱状图..."); } else if (type.Equals("pie", StringComparison.OrdinalIgnoreCase)) { chart = new PieChart(); Console.WriteLine("初始化设置饼状图..."); } else if (type.Equals("line", StringComparison.OrdinalIgnoreCase)) { chart = new PieChart(); Console.WriteLine("初始化设置折线图..."); } return chart; }} (4)客户端调用: 1234567891011121314public static void Main(){ IChartable chart = ChartFactory.GetChart("histogram"); if (chart != null) { chart.Display(); } chart = ChartFactory.GetChart("pie"); if (chart != null) { chart.Display(); }} 在客户端代码中,使用工厂类的静态方法来创建具体产品对象,如果需要更换产品,只需要修改静态工厂方法中的参数即可。例如:将柱状图改为饼状图,只需要将代码: 1IChartable chart = ChartFactory.GetChart("histogram"); 改为: 1IChartable chart = ChartFactory.GetChart("pie"); 改进的方案M 公司开发人员发现在创建具体 Chart对象时,每次更换一个 Chart对象都需要修改客户端中静态工厂方法的参数,客户端代码需要重新编译,这对于客户端而言,是违反了开闭原则的。于是,开发人员希望有一种方法能够在不修改客户端代码地前提下更换具体产品对象。 因此,他们考虑使用配置文件(XML)来实现: 123456<?xml version="1.0" encoding="utf-8" ?><configuration> <appSettings> <add key="charttype" value="histogram"/> </appSettings></configuration> 客户端因此改为: 1234567891011121314public static void Main() { string type = AppConfigHelper.GetChartType(); // 读取配置文件中的charttype if (string.IsNullOrEmpty(type)) { return; } IChartable chart = ChartFactory.GetChart(type); if (chart != null) { chart.Display(); } } 2.4 简单工厂模式总结主要优点 实现了对象创建和使用的分离:客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品。 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的的参数即可。 通过引入配置文件,可以在不修改任何客户端代码地情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。 主要缺点 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受影响。 使用简单工厂模式势必会增加系统中类的个数(引入新的工厂类),增加了系统的复杂度和理解难度。 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能会造成工厂逻辑过于复杂,不利于系统的扩展和维护。 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。 适用场景 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。 客户端只需要知道传入工厂类的参数,对于如何创建对象并不关心。 3.工厂模式 Factory Method 在简单工厂模式中只提供一个工厂类,该工厂类需要知道每一个产品对象的创建细节,并决定合适实例化哪一个产品类。其最大的缺点就是当有新产品加入时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了开闭原则。此外,在简单工厂模式中,所有的产品都由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度较高,严重影响了系统的灵活性和扩展性。 在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。 工厂方法(Factory Method)模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式,也可称为多态工厂模式,它是一种创建型模式。 3.1 结构图工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法并创建具体的产品对象。 从图中可以看出,在工厂方法模式结构图中包含以下 4 个角色: Product(抽象产品):定义产品的接口,是工厂方法模式所创建的对象的超类,也就是产品对象的公共父类。 ConcreteProduct(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。 Factory(抽象工厂):抽象工厂类,声明了工厂方法,用于返回一个产品。 ConcreteFactory(具体工厂):抽象工厂的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。 情景模拟1M公司欲开发一个系统运行日志记录器(Logger),该记录器可以通过多种途径保存系统的运行日志,例如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,M公司的开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的摄制过程比较复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。如何封装记录器的初始化过程并保证多种记录器切换的灵活性是M公司开发人员面临的一个难题。 3.2 工厂方法的实现基本结构图 其中,Logger接口充当抽象产品角色,而 FileLogger和 DatabaseLogger则充当具体产品角色。LoggerFactory接口充当抽象工厂角色,而 FileLoggerFactory和 DatabaseLoggerFactory则充当具体工厂角色。 重构代码抽象产品:ILogger接口 1234public interface ILogger { void WriteLog(); } 具体产品:FileLogger和 DatabaseLogger类 123456789101112131415public class FileLogger : ILogger { public void WriteLog() { Console.WriteLine("文件日志记录..."); } } public class DatabaseLogger : ILogger { public void WriteLog() { Console.WriteLine("数据库日志记录..."); } } 抽象工厂:ILoggerFactory接口 1234public interface ILoggerFactory { ILogger CreateLogger(); } 具体工厂:FileLoggerFactory和 DatabaseLoggerFactory类 12345678910111213141516171819202122public class FileLoggerFactory : ILoggerFactory { public ILogger CreateLogger() { // 创建文件日志记录器 ILogger logger = new FileLogger(); // 创建文件,代码省略 return logger; } } public class DatabaseLoggerFactory : ILoggerFactory { public ILogger CreateLogger() { // 连接数据库,代码省略 // 创建数据库日志记录器对象 ILogger logger = new DatabaseLogger(); // 初始化数据库日志记录器,代码省略 return logger; } } 客户端调用 1234567891011public static void Main() { ILoggerFactory factory = new FileLoggerFactory(); // 可通过引入配置文件实现 if (factory == null) { return; } ILogger logger = factory.CreateLogger(); logger.WriteLog(); } 3.3 借助反射的重构版本逃离修改客户端的折磨 为了让系统具有更好的灵活性和可扩展性,M 公司程序猿决定对日志记录器客户端代码进行重构,使得可以在不修改任何客户端代码的基础之上更换或是增加新的日志记录方式。 在客户端代码中将不再使用 new 关键字来创建工厂对象,而是将具体工厂类的类名存在配置文件(例如 XML 文件)中,通过读取配置文件来获取类名,再借助.NET 反射机制来动态地创建对象实例。 撸起袖子开始重构 123456<?xml version="1.0" encoding="utf-8" ?><configuration> <appSettings> <add key="LoggerFactory" value="Manulife.ChengDu.DesignPattern.FactoryMethod.v2.DatabaseLoggerFactory, Manulife.ChengDu.DesignPattern.FactoryMethod" /> </appSettings></configuration> 封装一个简单的 AppConfigHelper类 12345678910111213141516171819202122232425public class AppConfigHelper { public static string GetLoggerFactoryName() { string factoryName = null; try { factoryName = System.Configuration.ConfigurationManager.AppSettings["LoggerFactory"]; } catch (Exception ex) { Console.WriteLine(ex.Message); } return factoryName; } public static object GetLoggerFactoryInstance() { string assemblyName = AppConfigHelper.GetLoggerFactoryName(); Type type = Type.GetType(assemblyName); var instance = Activator.CreateInstance(type); return instance; } } 重构客户端代码 1234567891011public static void Main() { ILoggerFactory factory = (ILoggerFactory)AppConfigHelper.GetLoggerFactoryInstance(); if (factory == null) { return; } ILogger logger = factory.CreateLogger(); logger.WriteLog(); } 3.4 工厂方法的隐藏有时候,为了进一步简化客户端的使用,还可以对客户端隐藏工厂方法,此时,在工厂类中将直接调用产品类的业务方法,客户端无须调用工厂方法创建产品,直接通过工厂即可使用所创建的对象中的业务方法。 修改抽象工厂 1234567891011public abstract class LoggerFactory { // 在工厂类中直接调用日志记录器的业务方法WriteLog() public void WriteLog() { ILogger logger = this.CreateLogger(); logger.WriteLog(); } public abstract ILogger CreateLogger(); } 修改具体工厂 1234567891011public class DatabaseLoggerFactory : LoggerFactory { public override ILogger CreateLogger() { // 连接数据库,代码省略 // 创建数据库日志记录器对象 ILogger logger = new DatabaseLogger(); // 初始化数据库日志记录器,代码省略 return logger; } } 简化的客户端调用 12345678910public static void Main() { LoggerFactory factory = (LoggerFactory)AppConfigHelper.GetLoggerFactoryInstance(); if (factory == null) { return; } factory.WriteLog(); } 3.5 工厂方法模式总结主要优点 工厂方法用于创建客户所需要的产品,还向客户隐藏了哪种具体产品类将被实例化这一细节。因此,用户只需要关心所需产品对应的工厂,无须关心创建细节。 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,也无须修改客户端,还无须修改其他的具体工厂和具体产品,而只要加入一个具体工厂和具体产品就可以了。因此,系统的可扩展性得到了保证,符合开闭原则。 主要缺点 在添加新产品时,需要编写新的具体产品类,还要提供与之对应的具体工厂类,系统中类的个数将成对增加,一定程度上增加了系统的复杂度。 由于考虑到系统的可扩展性,需要引入抽象层,且在实现时可能需要用到反射等技术,增加了系统的实现难度。 适用场景 客户端不知道其所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的的工厂即可,具体的产品对象由具体工厂创建,可将具体工厂的类名存储到配置文件或数据库中。 抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统易于扩展。 -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/5d0c.html 原创作品,转载请保留出处。","categories":[{"name":"学院","slug":"学院","permalink":"https://blog.onehat.cn/categories/%E5%AD%A6%E9%99%A2/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"学习摘要","slug":"学习摘要","permalink":"https://blog.onehat.cn/tags/%E5%AD%A6%E4%B9%A0%E6%91%98%E8%A6%81/"}]},{"title":"个人数码数据备忘","slug":"个人数码数据备忘","date":"2018-12-14T02:29:39.000Z","updated":"2024-03-09T10:23:01.000Z","comments":true,"path":"p/3997.html","permalink":"https://blog.onehat.cn/p/3997.html","excerpt":"本文记录个人使用 NAS、PC、Homelab 等数码产品的一些碎片化主观体验、数据测试记录、备忘事项等。","text":"本文记录个人使用 NAS、PC、Homelab 等数码产品的一些碎片化主观体验、数据测试记录、备忘事项等。 Docker 迅雷下载测速千兆带宽基本可以跑慢 磁力:magnet:?xt=urn:btih:CBDB39122FCFC2F7ACFBAFBC590A58AED8DFDDED ESXi 虚拟磁盘测速实验环境 主机:ESXi 8.0 存储磁盘:HC320 存储协议:ISCSI 1G 网络精简置备 厚置备置零 2.5G 网络厚置备置零 PVE 虚拟磁盘测速scsi 虚拟磁盘 物理硬盘为梵想 S790 PCIE4.0 2TB PVE 虚拟 CPU 跑分12100 CPU 跑分 12900ES 4 虚拟核心跑分 12900ES 6 虚拟核心跑分 主板 BIOS 微码对比铭瑄终结者 B660Mv3.7 v4.2 微星 H610M -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/3997.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"备忘录","slug":"备忘录","permalink":"https://blog.onehat.cn/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"HomeLab","slug":"HomeLab","permalink":"https://blog.onehat.cn/tags/HomeLab/"},{"name":"ESXi","slug":"ESXi","permalink":"https://blog.onehat.cn/tags/ESXi/"}]},{"title":"安装 Linux 的 cb2 配置","slug":"安装 Linux 的 cb2 配置","date":"2018-12-14T02:29:39.000Z","updated":"2018-12-14T02:29:39.000Z","comments":true,"path":"p/107.html","permalink":"https://blog.onehat.cn/p/107.html","excerpt":"闲鱼上收来一台东芝 Chromebook2,尝试安装配置了 GalliumOS。","text":"闲鱼上收来一台东芝 Chromebook2,尝试安装配置了 GalliumOS。 系统信息 OS:GalliumOS2.1【基于 Ubuntu16.04】 Theme: GTK 主题 macbuntu-os-ithemes-lts-v7 Icon 主题 papirus-icon-theme 常用软件 名称 说明 Ibus-rime 输入法 Wps-office 办公三件套 Libreoffice-draw 全平台办公软件,主要用于打开 visio 文件 Evince;Master PDF editor 全平台 PDF 的查看和编辑,后者远比 foxit reader for linux 强大 Nixnote2 印象笔记的第三方客户端 Telegram 全平台 IM Chrome/Chromium;Firefox 全平台浏览器 网易云音乐 for linux 音乐软件 SMPlayer 名字有爱的全平台播放器 Spotify 全平台在线音乐客户端 Gpick 取色器 GIMP 全平台图片编辑器 Ristretto 图片查看器 Geary 邮件客户端 Zeal 全平台 api 文档管理 Vscode 全平台文本编辑器 GVIM 编辑器之神 Rescuetime 全平台时间管理工具 thunar-gtkhash xfce 下文件管理器 thunar 的 hash 值校验插件 DockBarX[xfce-dockbarx-plugin] 任务栏增强工具 Caffeine 开启激活后暂时停用锁屏,适用于看视频时 Zsh[omz] 终极 shell Tmux 打造最强终端:xfce4-terminal+zsh+ohmyzsh+tmux Acpi 终端查看电池信息 Sdcv 终端查单词 Pandoc 配合 typora 将 md 文档转为富文本 Conky 桌面小插件 Neofetch 终端输出系统信息 Unar 全能命令行解压,支持任意编码文件名 Git 版本控制 Wget,Axel 命令行下载工具 不可或缺的 chrome 应用 奇妙清单(to-list,记事,定时提醒) 小番茄(效率工具——番茄工作法) Google keep 记事(便签,便于和手机同步) -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/107.html 原创作品,转载请保留出处。","categories":[{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"}],"tags":[{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Chromebook","slug":"Chromebook","permalink":"https://blog.onehat.cn/tags/Chromebook/"}]},{"title":"Hello World","slug":"Hello World","date":"2018-04-01T04:29:39.000Z","updated":"2018-04-01T04:29:39.000Z","comments":true,"path":"p/3eeb.html","permalink":"https://blog.onehat.cn/p/3eeb.html","excerpt":"Hello,我的博客建立了,新的起点,从今天开始!","text":"Hello,我的博客建立了,新的起点,从今天开始! -EOF 查看最新版,请访问本文链接:https://blog.onehat.cn/p/3eeb.html 原创作品,转载请保留出处。","categories":[{"name":"里甲","slug":"里甲","permalink":"https://blog.onehat.cn/categories/%E9%87%8C%E7%94%B2/"}],"tags":[{"name":"随笔","slug":"随笔","permalink":"https://blog.onehat.cn/tags/%E9%9A%8F%E7%AC%94/"}]}],"categories":[{"name":"神秘主义","slug":"神秘主义","permalink":"https://blog.onehat.cn/categories/%E7%A5%9E%E7%A7%98%E4%B8%BB%E4%B9%89/"},{"name":"工作坊","slug":"工作坊","permalink":"https://blog.onehat.cn/categories/%E5%B7%A5%E4%BD%9C%E5%9D%8A/"},{"name":"剧院广场","slug":"剧院广场","permalink":"https://blog.onehat.cn/categories/%E5%89%A7%E9%99%A2%E5%B9%BF%E5%9C%BA/"},{"name":"娱乐中心","slug":"娱乐中心","permalink":"https://blog.onehat.cn/categories/%E5%A8%B1%E4%B9%90%E4%B8%AD%E5%BF%83/"},{"name":"里甲","slug":"里甲","permalink":"https://blog.onehat.cn/categories/%E9%87%8C%E7%94%B2/"},{"name":"获取信息源","slug":"获取信息源","permalink":"https://blog.onehat.cn/categories/%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF%E6%BA%90/"},{"name":"备忘录","slug":"备忘录","permalink":"https://blog.onehat.cn/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"},{"name":"学院","slug":"学院","permalink":"https://blog.onehat.cn/categories/%E5%AD%A6%E9%99%A2/"}],"tags":[{"name":"记梦","slug":"记梦","permalink":"https://blog.onehat.cn/tags/%E8%AE%B0%E6%A2%A6/"},{"name":"技术","slug":"技术","permalink":"https://blog.onehat.cn/tags/%E6%8A%80%E6%9C%AF/"},{"name":"PVE","slug":"PVE","permalink":"https://blog.onehat.cn/tags/PVE/"},{"name":"Linux","slug":"Linux","permalink":"https://blog.onehat.cn/tags/Linux/"},{"name":"Windows Server","slug":"Windows-Server","permalink":"https://blog.onehat.cn/tags/Windows-Server/"},{"name":"CSS","slug":"CSS","permalink":"https://blog.onehat.cn/tags/CSS/"},{"name":"Zabbix","slug":"Zabbix","permalink":"https://blog.onehat.cn/tags/Zabbix/"},{"name":"现代诗","slug":"现代诗","permalink":"https://blog.onehat.cn/tags/%E7%8E%B0%E4%BB%A3%E8%AF%97/"},{"name":"成长","slug":"成长","permalink":"https://blog.onehat.cn/tags/%E6%88%90%E9%95%BF/"},{"name":"Docker","slug":"Docker","permalink":"https://blog.onehat.cn/tags/Docker/"},{"name":"NAS","slug":"NAS","permalink":"https://blog.onehat.cn/tags/NAS/"},{"name":"MHTML","slug":"MHTML","permalink":"https://blog.onehat.cn/tags/MHTML/"},{"name":"Chrome","slug":"Chrome","permalink":"https://blog.onehat.cn/tags/Chrome/"},{"name":"Github","slug":"Github","permalink":"https://blog.onehat.cn/tags/Github/"},{"name":"网络","slug":"网络","permalink":"https://blog.onehat.cn/tags/%E7%BD%91%E7%BB%9C/"},{"name":"游戏","slug":"游戏","permalink":"https://blog.onehat.cn/tags/%E6%B8%B8%E6%88%8F/"},{"name":"文明","slug":"文明","permalink":"https://blog.onehat.cn/tags/%E6%96%87%E6%98%8E/"},{"name":"游戏测试","slug":"游戏测试","permalink":"https://blog.onehat.cn/tags/%E6%B8%B8%E6%88%8F%E6%B5%8B%E8%AF%95/"},{"name":"iStoreOS","slug":"iStoreOS","permalink":"https://blog.onehat.cn/tags/iStoreOS/"},{"name":"SMB","slug":"SMB","permalink":"https://blog.onehat.cn/tags/SMB/"},{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://blog.onehat.cn/tags/Ubuntu/"},{"name":"Cloudflare","slug":"Cloudflare","permalink":"https://blog.onehat.cn/tags/Cloudflare/"},{"name":"MSSQL","slug":"MSSQL","permalink":"https://blog.onehat.cn/tags/MSSQL/"},{"name":".NET","slug":"NET","permalink":"https://blog.onehat.cn/tags/NET/"},{"name":"转载","slug":"转载","permalink":"https://blog.onehat.cn/tags/%E8%BD%AC%E8%BD%BD/"},{"name":"Unraid","slug":"Unraid","permalink":"https://blog.onehat.cn/tags/Unraid/"},{"name":"Debian","slug":"Debian","permalink":"https://blog.onehat.cn/tags/Debian/"},{"name":"Windows","slug":"Windows","permalink":"https://blog.onehat.cn/tags/Windows/"},{"name":"MySQL","slug":"MySQL","permalink":"https://blog.onehat.cn/tags/MySQL/"},{"name":"软件","slug":"软件","permalink":"https://blog.onehat.cn/tags/%E8%BD%AF%E4%BB%B6/"},{"name":"Everything","slug":"Everything","permalink":"https://blog.onehat.cn/tags/Everything/"},{"name":"数据库","slug":"数据库","permalink":"https://blog.onehat.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"},{"name":"Oracle","slug":"Oracle","permalink":"https://blog.onehat.cn/tags/Oracle/"},{"name":"HomeLab","slug":"HomeLab","permalink":"https://blog.onehat.cn/tags/HomeLab/"},{"name":"群晖","slug":"群晖","permalink":"https://blog.onehat.cn/tags/%E7%BE%A4%E6%99%96/"},{"name":"ESXi","slug":"ESXi","permalink":"https://blog.onehat.cn/tags/ESXi/"},{"name":"AD 域","slug":"AD-域","permalink":"https://blog.onehat.cn/tags/AD-%E5%9F%9F/"},{"name":"Hexo","slug":"Hexo","permalink":"https://blog.onehat.cn/tags/Hexo/"},{"name":"破解","slug":"破解","permalink":"https://blog.onehat.cn/tags/%E7%A0%B4%E8%A7%A3/"},{"name":"Android","slug":"Android","permalink":"https://blog.onehat.cn/tags/Android/"},{"name":"Xamarin","slug":"Xamarin","permalink":"https://blog.onehat.cn/tags/Xamarin/"},{"name":"Chromebook","slug":"Chromebook","permalink":"https://blog.onehat.cn/tags/Chromebook/"},{"name":"Database","slug":"Database","permalink":"https://blog.onehat.cn/tags/Database/"},{"name":"学习摘要","slug":"学习摘要","permalink":"https://blog.onehat.cn/tags/%E5%AD%A6%E4%B9%A0%E6%91%98%E8%A6%81/"},{"name":"随笔","slug":"随笔","permalink":"https://blog.onehat.cn/tags/%E9%9A%8F%E7%AC%94/"}]}