关于freebsd:cannot-use-devda1-must-be-a-block-device-or-regular-file

FreeBSD在创立zpool时,呈现cannot use '/dev/da1': must be a block device or regular file谬误,通过gpart show查看发现da1硬盘是 MBR 格局,而非GPT。 解决的办法是将 MBR 格局的硬盘变更 GPT: => 63 1953525105 da1 MBR (932G) 63 1 - free - (512B) 64 409599936 1 ntfs [active] (195G) 409600000 1543925168 - free - (736G)解决命令如下: $ gpart destroy -F da1$ gpart create -s gpt da1接下来便能够应用zpool创立ZFS 存储池了.

May 15, 2023 · 1 min · jiezi

关于freebsd:FreeBSD使用deamon将frpc添加到开始启动项

FreeBSD最大的特点就是稳,让你难以置信的稳。提到FreeBSD,还须要感激带我意识它的刘仕臣老师。 frpc默认状况下会随着shell的退出而主动终止,而且咱们也心愿在服务器启动时可能主动启动frpc服务,以及在frpc产生谬误时,服务器可能主动重启该服务。 步骤如下: 下载frpc下载frpc并将相干的配置项写入frpc.ini中,而后咱们将frpc与frpc.ini一并上传到FreeBSD服务器。其实这个地位不重要,只须要保障frpc可执行以及frpc.ini可读即可。 比方我上传到了:/usr/local/opt/frp_0.48.0_freebsd_amd64 创立启动脚本切换到root用户,并创立/etc/rc.d/frpc文件:$ ee /etc/rc.d/frpc,而后粘入以下内容: #!/bin/sh # PROVIDE: frpc# REQUIRE: LOGIN# KEYWORD: frpc . /etc/rc.subr name="frpc"rcvar=frpc_enable load_rc_config $name : ${frpc_enable="NO"}: ${frpc_user="nobody"}: ${frpc_flags="-c /usr/local/opt/frp_0.48.0_freebsd_amd64/frpc.ini"}daemon_pidfile="var/run/frpc_daemon.pid" pidfile="/var/run/frpc.pid"command="/usr/local/opt/frp_0.48.0_freebsd_amd64/frpc"start_cmd="/usr/sbin/daemon -r -R 5 -u $frpc_user -P $daemon_pidfile -p $pidfile -t $name $command $frpc_flags"start_postcmd="${name}_poststart"stop_cmd="${name}_stop"frpc_poststart(){ echo "${name}_daemon running pid `cat ${daemon_pidfile}`." echo "${name} running pid `cat ${pidfile}`."}frpc_stop(){ if [ -f "$daemon_pidfile" ]; then pid=`cat $daemon_pidfile` echo "Stopping pid ${pid}." kill $pid else echo "${name} not running?" fi} run_rc_command "$1"保留后为其增加执行权限:$ chmod +x /etc/rc.d/frpc ...

May 13, 2023 · 1 min · jiezi

关于freebsd:Freebsd配置服务开机自启动

freebsd因为没应用systemd,所以会采纳配置/etc/rc.d/文件的形式配置服务启动 服务模仿脚本开机自启动脚本执行的时候不能阻塞,freebsd服务启动的时候是串行执行的,一条命令卡住,所有后续服务不能执行 新建脚本/root/test-boot.sh,留神最初面要加上&免得阻塞 #!/bin/shsh -c "while true;do date >> /root/test-boot.log; sleep 1; done" &上面执行脚本 $ chmod a+x test-boot.sh$ ./test-boot.sh查看成果 $ tail -f /root/test-boot.log配置开机启动如下配置是照抄freebsd官网文档Starting Services 次要的不同是把原文中的配置文件从utility参数全副替换为test_boot,即utility服务替换为test_boot服务,该服务会在DAEMON pseudo-service之后启动 留神不要携带后缀.sh /etc/rc.d/test_boot #!/bin/sh## PROVIDE: test_boot# REQUIRE: DAEMON# KEYWORD: shutdown. /etc/rc.subr# 配置服务名称是test_bootname=test_boot# 配置服务是否开机自启动参数rcvar=test_boot_enable# 配置启动命令地位command="/root/test-boot.sh"load_rc_config $name## DO NOT CHANGE THESE DEFAULT VALUES HERE# SET THEM IN THE /etc/rc.conf FILE#test_boot_enable=${test_boot_enable-"NO"}pidfile=${test_boot_pidfile-"/var/run/test_boot.pid"}run_rc_command "$1"更多配置项或者应用能够参考/etc/rc.d/sshd文件 减少执行权限 $ chmod a+x /etc/rc.d/test_boot编辑/etc/rc.conf,新增一行数据容许开机自启动 test_boot_enable="YES"最初重启查看/root/test-boot.log文件验证 拓展浏览配置freebsd软件包源为国内中科大源 创立配置文件/usr/local/etc/pkg/repos/FreeBSD.conf FreeBSD: { url: "pkg+http://mirrors.ustc.edu.cn/freebsd-pkg/${ABI}/quarterly",}更新索引 $ pkg update -f装置vim ...

March 7, 2023 · 1 min · jiezi

关于freebsd:FreeBSD-ext2-文件系统磁盘块和-inode-的申请

前言磁盘块与文件 inode entry 的申请和开释的解决机制总体上是统一的,所以就放到一起进行分享。在之前的文章中介绍了ext2文件系统磁盘的的总体布局,为了不便阐明,这里就假如磁盘只有一个块组。 块组布局 块组描述符: 与超级块作用相似,记录该块组的根本属性信息数据块位图/inode位图: 以 bit 作为基本操作对象,示意一个数据块或者 inode entry 的状态。置 0 示意闲暇,置 1 示意占用inode表: 集中寄存 inode entry数据块: 存储文件的数据与元数据发问1: 超级块保留的是磁盘整体的信息,为什么每个块组中都蕴含一份? 这样做就是为了保留多个备份,有利于磁盘被损坏时的数据恢复。有的磁盘文件系统并没有采纳此种设计,就比方 ufs,它是在某些特定磁盘块寄存超级块数据的备份 (印象中是有3份)。发问2: 每块区域的大小是如何确定的? 个别是采纳估算法来确定的。用户能够依据本身的理论应用状况,预设每个文件均匀占用的磁盘块数。因为文件肯定会惟一对应一个 inode 数据结构,这样就能够计算出 inode entry 的大抵个数。再进一步,能够计算失去 inode 位图和 inode 表的大小。超级块和块组描述符个别会占用残缺的一个或者几个磁盘块,确定之后就能够计算失去数据块位图和数据块两个区域的大小。每个区域的大小尽量设置为磁盘块大小的整数倍。如果存储空间比拟拮据,倡议保障磁盘块大小是数据结构大小的整数倍(可能会造成一些空间节约),益处是升高代码实现的复杂度。 次要函数剖析咱们次要关注 freebsd/usr/src/sys/fs/ext2fs 下的 ext2_alloc.c 和 ext2_balloc.c 两个文件。int ext2_alloc(...) :从磁盘申请一个闲暇数据块 /* * Allocate a block in the filesystem. * * A preference may be optionally specified. If a preference is given * the following hierarchy is used to allocate a block: * 1) allocate the requested block. * 2) allocate a rotationally optimal block in the same cylinder. * 3) allocate a block in the same cylinder group. * 4) quadradically rehash into other cylinder groups, until an * available block is located. * If no block preference is given the following hierarchy is used * to allocate a block: * 1) allocate a block in the cylinder group that contains the * inode for the file. * 2) quadradically rehash into other cylinder groups, until an * available block is located. */intext2_alloc(struct inode *ip, daddr_t lbn, e4fs_daddr_t bpref, int size, struct ucred *cred, e4fs_daddr_t *bnp){ struct m_ext2fs *fs; struct ext2mount *ump; e4fs_daddr_t bno; int cg; *bnp = 0; fs = ip->i_e2fs; ump = ip->i_ump; mtx_assert(EXT2_MTX(ump), MA_OWNED);#ifdef INVARIANTS if ((u_int)size > fs->e2fs_bsize || blkoff(fs, size) != 0) { vn_printf(ip->i_devvp, "bsize = %lu, size = %d, fs = %s\n", (long unsigned int)fs->e2fs_bsize, size, fs->e2fs_fsmnt); panic("ext2_alloc: bad size"); } if (cred == NOCRED) panic("ext2_alloc: missing credential");#endif /* INVARIANTS */ if (size == fs->e2fs_bsize && fs->e2fs_fbcount == 0) goto nospace; if (cred->cr_uid != 0 && fs->e2fs_fbcount < fs->e2fs_rbcount) goto nospace; if (bpref >= fs->e2fs_bcount) bpref = 0; if (bpref == 0) cg = ino_to_cg(fs, ip->i_number); else cg = dtog(fs, bpref); bno = (daddr_t)ext2_hashalloc(ip, cg, bpref, fs->e2fs_bsize, ext2_alloccg); if (bno > 0) { /* set next_alloc fields as done in block_getblk */ ip->i_next_alloc_block = lbn; ip->i_next_alloc_goal = bno; ip->i_blocks += btodb(fs->e2fs_bsize); ip->i_flag |= IN_CHANGE | IN_UPDATE; *bnp = bno; return (0); }nospace: EXT2_UNLOCK(ump); ext2_fserr(fs, cred->cr_uid, "filesystem full"); uprintf("\n%s: write failed, filesystem is full\n", fs->e2fs_fsmnt); return (ENOSPC);}参数剖析: ...

January 27, 2023 · 10 min · jiezi

关于freebsd:FreeBSD启用ZFS快照功能

FreeBSD的 ZFS 果然不让人悲观,在保障数据安全的前提下,效率也十分的高。4块硬盘组成的raidz较NVME固态硬盘的速率略低,但不显著。 而快照则是ZFS更外围的性能,ZFS能够达到秒级创立快照,这个速度重大的超出了本人的认知。 创立数据集(档案零碎)zfs并不是能够间接对所有的文件夹设置快照的,要想对某个文件夹设置快照,则须要先建设档案零碎(数据集),比方我以后存在存储池yzpool,则能够应用以下命令建设存储池: # zfs create yzpool/data# zfs create yzpool/data/hosts# zfs create yzpool/data/hosts/20pro留神:在建设数据集时,须要由父到子顺次建设。 此时咱们便建设了3个数据集,别离是data, data/hosts以及data/hosts/20pro。而后咱们便能够对这个20pro文件夹设置快照了。 创立快照此时进入data/hosts/20pro文件夹,并创立一个测试文件:echo "sfsdf" >> hello.text,而后执行 # zfs snapshot yzpool/data/hosts/20pro@22-11-19 便胜利的创立了第一个快照,快照创立的地位位于yzpool/data/hosts/20pro文件夹下的.zfs/snapshot子文件夹,能够应用ls命令来间接查看。 # ls -a -l .zfs/snapshot/ total 1dr-xr-xr-x+ 3 root wheel 3 Nov 20 01:50 .dr-xr-xr-x+ 3 root wheel 3 Nov 20 01:48 ..drwxr-xr-x 2 root wheel 3 Nov 20 01:49 22-11-19顺便看一下快照大小: # du .zfs/snapshot/7 .zfs/snapshot/22-11-197 .zfs/snapshot/创立复原快照接着咱们新增一个文件,并且批改原文件: root@nfs:/yzpool/data/hosts/20pro # echo "123" >> hello.text root@nfs:/yzpool/data/hosts/20pro # cat hello.text sfsdf123root@nfs:/yzpool/data/hosts/20pro # echo "456" >> text.textroot@nfs:/yzpool/data/hosts/20pro # cat text.text 456而后咱们再建设个快照: ...

November 19, 2022 · 2 min · jiezi

关于freebsd:FreeBSD系统安装NFSNetwork-File-System服务并启用基于-IP-认证的机制

Network File System (NFS)网络文件系统:能够把网络上的某个资源做为本地硬盘来应用的一种零碎。 该服务次要依赖于:nfsd、mountd以及rpcbind nfsd: 接管 NFS 客户端发动的申请mountd: 解决由nfsd接管的请潮州rpcbind: 容许客户端发现以后的 NFS 服务端口服务端配置编辑/etc/rc.conf并退出以下配置: rpcbind_enable="YES"nfs_server_enable="YES"mountd_flags="-r"mountd_enable="YES"接着编辑/etc/exports,配置文件服务内容: /yzpool/hosts/20pro -maproot=root 192.168.1.20上述配置实现了: 可将本地/yzpool/hosts/20pro映射给192.168.1.20客户端。且当192.168.1.20客户端中的root权限等同于本机的root权限。 而后咱们重启一下服务器,以及下面的服务全副失效。 如果编辑过/etc/exports文件,则须要执行:/etc/rc.d/mountd reload客户端配置客户端操作系统以debian11为例,该客户机的 IP 地址为在服务端设置的192.168.1.20 首先咱们装置nfs客户端利用: # sudo apt install nfs-common而后创立一个挂载点,比方我创立一个位于根门路下的yz做为持载点: # sudo mkdir /yz最初咱们实现挂载: # sudo mount -t nfs 192.168.1.2:/yzpool/hosts/20pro /yz如果咱们心愿在系统启动的时候同步进行挂载,则须要编辑/etc/fstab文件来实现。 192.168.1.2:/yzpool/hosts/20pro /yz nfs defaults 0 0而后重新启动服务器进行测试. 其它dir client1 (options) [client2(options)...]详解: ro / rw : a) ro: 只读 b) rw: 写入加读取sync / async : a) sync: 服务端应答完上次申请后,才会应答下次申请; b) async: 异应应答。wdelay / no_wdelay a) wdelay服务器预测是间断申请时,将提早提交上次的写申请(晋升写入效率,数据断电易失落)no_all_squash / all_squash a) no_all_squash: 不扭转客户端的参考文档https://vitux.com/debian-nfs-... ...

November 19, 2022 · 1 min · jiezi

关于freebsd:FreeBSD-ext2-文件系统基本数据结构分析下

寒假日常凌晨,Douyiya 被短促的脚步声吵醒了,室友 狒狒 因为要加入电子设计大赛,所以早早起床拾掇明天所要用到的材料。简略寒暄两句之后,他便急匆匆地走出了寝室。Douyiya 起身观望,又是再相熟不过的场景: 老马 通宵未归,阿狗 和 龙哥 还在睡梦中。想到 Nanami 和 Nanase 因为天气太过酷热而回家避暑,Douyiya 也只能微微叹了口气,“又是无聊的一天呀!” 随后就约着在计算机爱好者社团结识的敌人 Ling,一块去图书馆分享最近学习的感悟。 Douyiya 的汇报Ling 是一个谈话语速慢慢悠悠,但思维十分麻利,并且涉猎宽泛的技术大佬,所以 Douyiya 也十分喜爱向她求教问题。两人碰面之后互道了早安,随后便找了一个宁静的地位坐了下来。“最近浏览了 ext2 文件系统的源码,想跟你分享一下,顺便帮我看看有没有了解上的谬误。” Douyiya 笑眯眯地说到。“我之前读过这些代码,你间接开始讲吧。” Douyiya 点了拍板:咱们能够认为操作系统治理着一棵微小的 文件树,无论是目录文件,还是一般文件,都是树上的一个节点。如果用户指定的是文件的绝对路径,操作系统会从根节点逐级查找,直到定位指标文件;如果是相对路径,则从当前目录下开始查找。所以,目录文件必须要蕴含一些信息,用来示意出它的子文件到底有哪些。ext2 文件系统的设计如下: /* * Structure of a directory entry */#define EXT2FS_MAXNAMLEN 255struct ext2fs_direct { uint32_t e2d_ino; /* inode number of entry */ uint16_t e2d_reclen; /* length of this record */ uint16_t e2d_namlen; /* length of string in e2d_name */ char e2d_name[EXT2FS_MAXNAMLEN];/* name with length<=EXT2FS_MAXNAMLEN */};/* * The new version of the directory entry. Since EXT2 structures are * stored in intel byte order, and the name_len field could never be * bigger than 255 chars, it's safe to reclaim the extra byte for the * file_type field. */struct ext2fs_direct_2 { uint32_t e2d_ino; /* inode number of entry */ uint16_t e2d_reclen; /* length of this record */ uint8_t e2d_namlen; /* length of string in e2d_name */ uint8_t e2d_type; /* file type */ char e2d_name[EXT2FS_MAXNAMLEN]; /* name with * length<=EXT2FS_MAXNAMLEN */};e2d_ino: 文件对应的惟一 inode numbere2d_name: 寄存文件名的字符数组,最大不超过 255 bytese2d_namlen: 文件名的长度e2d_type: 文件类型,比方一般文件、设施文件、目录、链接文件等等e2d_reclen: 与文件名的长度无关,sizeof(uint64_t) + e2d_namelen ...

September 12, 2022 · 4 min · jiezi

关于freebsd:云服务器FreeBSD系统zfs-zpool扩容的一种方案

近期服务器因为磁盘空间满而产生了谬误,数据盘有了扩容的需要。以后的零碎采纳了稳如磐石的FreeBSD零碎,文件系统应用了更加平安、牢靠的ZFS。 扩容计划云硬盘满,咱们首先想到的是去服务商那扩容。但应用了zfs文件系统后,扩容的最并没有反馈到零碎中,也就是说尽管云服务端给咱们扩容到了100G,但咱们可能应用的依然为40G。 搜寻了相干的扩容关键字,但基本上所有的文章都在讲如何对实体的硬盘进行扩容(老的硬盘换了新的更大的硬盘),却没有一篇文章提及如何在云盘扩容后同步扩容zpool。 最终查阅了oracle的官网文档失去了答案: 计划一查看zpool状态,失去zpool名称以及退出到zpool的硬盘名称: root@xxx:/dev # zpool status pool: zroot state: ONLINE scan: none requestedconfig: NAME STATE READ WRITE CKSUM ①zroot ONLINE 0 0 0 ②vtbd1 ONLINE 0 0 0失去①zpool的名称为zroot ②以后挂载的硬盘为vtbd1. 而后执行扩容命令: root@PingTai:/dev # zpool online -e ①zroot ②vtbd1计划二查看zpool状态,失去zpool名称: root@xxx:/dev # zpool status pool: zroot state: ONLINE scan: none requestedconfig: NAME STATE READ WRITE CKSUM ①zroot ONLINE 0 0 0 vtbd1 ONLINE 0 0 0失去zpool的名称为zroot,将zpool的autoexpand属性设置为on: # zpool set autoexpand=on ①zroot而后当磁盘扩容后,重新启动服务器,扩容主动实现。 ...

April 19, 2021 · 1 min · jiezi