自从搭建了一个图床之后,我开始发现 vps 的硬盘空间开始慢慢不够用了。随着时间的增长,上传的图片也越来越多。贫穷总是会限制我的想象力,那么有哪些解决方案呢?
世界加钱可及
加钱升级配置
加钱,去服务商那里升级配置就好了,好多钱钱~
使用 block storage
有些服务商可能提供类似 block storage 这种存储服务(如 vultr、DigitalOcean),那就花钱钱买点,然后挂载上就好了。假如不提供这些服务的话,可以考虑试试 Google Cloud Storage,然后挂载到本地,价格也还是可以接受的~
使用 rclone 挂载网络硬盘
可是我是穷人唉,$1 都出不起,那该怎么办呢…… 可不可以把 Google Drive、OneDrive、Dropbox 什么的挂载上呢?Google Drive 有 15G,Dropbox 有 2G,OneDrive 有 5G,这加起来就是 22G,那就是 $2.2 呢!
淘宝花个几块钱扩容什么的,那就是血赚啊!
rclone 挂载 Google Drive 什么的很容易,有很多人写文件介绍过,比如说这篇,只不过有两点需要注意的:
使用 mount 挂载之后,这个程序会 “阻塞”,另开一个窗口df –h
就会发现有了
5T 滑稽?
但是咱也不能一直开着,跑个 screen 也不好,所以还是写个 systemd 单元文件吧
- [Unit]
- Description=Google Drive mounter
- After=network.target network-online.target nss-lookup.target
- [Service]
- Restart=on-failure
- Type=simple
- ExecStart=/usr/bin/rclone mount gdrive_goldstein:/ /mnt/gdrive/ --allow-non-empty --vfs-cache-mode writes --allow-other
- [Install]
- WantedBy=multi-user.target
非常需要注意这个--allow-other
参数,如果没有的话,从 nginx 的 webroot 下做过来的符号链接 www 用户无权访问,那就 403 了哦
iSCSI
这网络存储有的时候可能也有点不太够(5T 都不够吗?),那该怎么办呢?不如买个大硬盘的 vps,然后试试 iSCSI!(看来这 RHCE 是没白考啊ε=ε=ε=(~ ̄▽ ̄)~
iSCSI 是个啥呢?Internet 小型计算机系统接口,简单理解就是客户端可以通过网络让自己有 / dev/sd * 这样的 “真实” 的物理设备,然后随便格式化挂载什么的。
iSCSI 一般来说是局域网使用的,一般不会跨公网玩,因为这东西对延迟丢包有点敏感。当然了用是能用的,只不过配置起来有点麻烦,而且传输过程是不加密的。(′д`)… 彡… 彡
iSCSI 传输不是加密的这个消息不太好,但是有一些解决方案的,比如套个 IPSec 啦,比如走个 SSH 隧道啦。
本着灵活应用的道理,咱就来挂载个玩玩……
概念解析
target – 理解成服务器;initiator – 理解成客户端
准备 “硬盘”
对于服务端来说,提供服务的 “硬盘” 可以选择块设备(硬盘啊,U 盘啊什么的),也可以选择文件设备,甚至内存够大做 ramdisk 都是可以的~
为了方便扩展,我们这里就做一个逻辑卷,这样以后也可以看心情随时扩容的。
首先~ 登录到 server,需要进行一下分区,总之就是搞出来一个 sdb2 这种分区做逻辑卷。使
分区
用 fdisk 进行类似操作:
- root@server:~# fdisk /dev/sda
- Welcome to fdisk (util-linux 2.31.1).
- Changes will remain in memory only, until you decide to write them.
- Be careful before using the write command.
- Command (m for help): p
- Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
- Units: sectors of 1 * 512 = 512 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
- Disklabel type: gpt
- Disk identifier: DCBEF2AD-7269-4B63-BA34-AE2F15A6D9F7
- Device Start End Sectors Size Type
- /dev/sda1 2048 4095 2048 1M BIOS boot
- /dev/sda2 4096 20975615 20971520 10G Linux filesystem
- Command (m for help): n
- Partition number (3-128, default 3):
- First sector (20975616-41943006, default 20975616):
- Last sector, +sectors or +size{K,M,G,T,P} (20975616-41943006, default 41943006):
- Created a new partition 3 of type 'Linux filesystem' and of size 10 GiB.
- Command (m for help): w
- The partition table has been altered.
- Syncing disks.
输入partprobe
更新分区表,这里新分区为 sda3,大小 10G
创建逻辑卷
- root@server:~# pvcreate /dev/sda3
- Physical volume "/dev/sda3" successfully created.
默认的 Volume Group 大小是 4MiB,当然这个创建 vg 的时候可以改。
- root@server:~# vgcreate idata /dev/sda3
- Volume group "idata" successfully created
创建 Logic Volume 的时候,n 表示名字;大小方面,可以指定是多少个 PE,也可以直接写大小,使用 l 指定多少个 PE,256 个也就是 1G 了,L 指定大小,
- root@server:~# lvcreate -n iscsi_data -l 256 idata
- Logical volume "iscsi_data" created.
- # 直接指定3G
- root@server:~# lvcreate -n test -L 3G idata
- Logical volume "test" created.
查看一下 确定信息无误
- root@server:~# lvdisplay
- --- Logical volume ---
- LV Path /dev/idata/iscsi_data
- LV Name iscsi_data
- VG Name idata
- LV UUID ueP2uS-zEOG-6B1q-5GuD-9L5f-1ZyZ-86E4ee
- LV Write Access read/write
- LV Creation host, time server, 2019-06-23 06:19:06 +0000
- LV Status available
- # open 0
- LV Size 1.00 GiB
- Current LE 256
- Segments 1
- Allocation inherit
- Read ahead sectors auto
- - currently set to 256
- Block device 253:0
有些 vps 上来就是一个 /,这种情况下根本用不了 fdisk 给分出来空间的。那咋办呢?有这么几种思路,fileio,livecd 用 gparted,手动重装系统
配置 target
就假定服务端和客户端都是 Ubuntu 啦,16.04 之后应该操作都差不多的
- apt install targetcli-fb
输入targetcli
进入交互页面,输入 ls 可以看下大体情况
我们要做这么几件事情:创建 backstore,给 backstore 增加 LUNS,ACL,PORTAL
创建 backstore
创建 block 设备
- /backstores/block create name=client1_data dev=/dev/idata/iscsi_data
/dev/idata/iscsi_data
就是我们刚刚创建的逻辑卷,name 是名字
创建 iSCSI
- /iscsi create wwn=iqn.2019-06.com.bennythink:server
回车之后会发现自动帮我们创建好了 portal
创建 luns,这里的client1_data
就是我们第一步创建的 name
- /iscsi/iqn.2019-06.com.bennythink:server/tpg1/luns create /backstores/block/client1_data
创建 acl
- /iscsi/iqn.2019-06.com.bennythink:server/tpg1/acls create wwn=iqn.2019-06.com.bennythink:client1
这几步都做完了之后,ls 一下,大概的结构应该是这样的:
saveconfig
保存退出
配置客户端
客户端的配置相比之下就简单多了,只需要改下配置文件就好了
安装与修改配置
- apt install open-iscsi
- # 编辑/etc/iscsi/initiatorname.iscsi
- vim /etc/iscsi/initiatorname.iscsi
- # 把InitiatorName改成我们ACL中配置的那个,也就是iqn.2019-06.com.bennythink:client1
- InitiatorName=iqn.2019-06.com.bennythink:client1
- # 设置自动login
- vim /etc/iscsi/iscsid.conf
- # 原来是manual
- node.startup = automatic
启动服务
- systemctl restart iscsi
- systemctl restart iscsid
- systemctl enable iscsid
发现与登录节点
server 可以写服务端的域名,或者 IP 也可以
- root@client:~# iscsiadm --mode discoverydb --type sendtargets --portal server --discover
- 172.21.174.180:3260,1 iqn.2019-06.com.bennythink:server
- # 把上一步拿到的iqn写到这里
- root@client:~# iscsiadm --mode node --targetname iqn.2019-06.com.bennythink:server --portal server:3260 --login
- Logging in to [iface: default, target: iqn.2019-06.com.bennythink:server, portal: 172.21.174.180,3260] (multiple)
- Login to [iface: default, target: iqn.2019-06.com.bennythink:server, portal: 172.21.174.180,3260] successful.
此时就应该多出来一个/dev/sdb
了
分区、格式化与挂载
使用 fdisk 对 sdb 进行分区,这里想怎么分都行,我就直接都分一个主分区了
- root@client:~# fdisk /dev/sdb
- Welcome to fdisk (util-linux 2.31.1).
- Changes will remain in memory only, until you decide to write them.
- Be careful before using the write command.
- Device does not contain a recognized partition table.
- Created a new DOS disklabel with disk identifier 0x2afb442f.
- Command (m for help): n
- Partition type
- p primary (0 primary, 0 extended, 4 free)
- e extended (container for logical partitions)
- Select (default p):
- Using default response p.
- Partition number (1-4, default 1):
- First sector (8192-2097151, default 8192):
- Last sector, +sectors or +size{K,M,G,T,P} (8192-2097151, default 2097151):
- Created a new partition 1 of type 'Linux' and of size 1020 MiB.
- Command (m for help): w
- The partition table has been altered.
- Calling ioctl() to re-read partition table.
- Syncing disks.
进行格式化、挂载
- mkfs.ext4 /dev/sdb1
- mount /dev/sdb1 /mnt/data/
重启之后自动挂载
为了确保重启之后自动挂载,我们需要更改 fstab
- /dev/sdb1 /mnt/data ext4 defaults,_netdev 0 0
安全使用 iSCSI
由于 iSCSI 的传输数据的过程并不是加密的,所以如果跨公网使用,给人的感觉总是不好。为了解决这一问题,我们可以在客户端挂个 VPN 到服务端,可以用 SSH 隧道,可以用 IPSec 保护 iSCSI,也可以加密 sdb(比如用 LUKS、VeraCrypt 等呗)
咱这里就开个 SSH 隧道吧!要在配置客户端之前做好哦
修改服务端配置vim /etc/ssh/sshd_config
,修改如下配置
- PermitTunnel yes
然后重启 sshd
- systemctl restart sshd
然后输入如下命令,其中root@server
替换成自己的服务器
- sudo -E \
- ssh -F /dev/null \
- -o PermitLocalCommand=yes \
- -o LocalCommand="ifconfig tun0 172.18.0.2 pointopoint 172.18.0.1 netmask 255.255.255.0" \
- -o ServerAliveInterval=60 \
- -w 0:0 root@server \
- 'sudo ifconfig tun0 172.18.0.1 pointopoint 172.18.0.2 netmask 255.255.255.0; hostname; echo tun0 ready'
之后再开一个窗口,discover & login
- iscsiadm --mode discoverydb --type sendtargets --portal 172.18.0.1 --discover
- iscsiadm --mode node --targetname iqn.2019-06.com.bennythink:server --portal 172.18.0.1:3260 –login
当然理想方式是用 key,然后 systemd 管这个 SSH Tunnel 啦!
(′д`)… 彡… 彡还是用 wireguard 吧
iSCSI 空间不够了怎么办
还记得我们是使用的 Logical Volume 创建的吗!此时只需要lvextend -L 10G /dev/idata/iscsi_data
就可以把分区调整为 10G,然后客户端那边 fdisk 就能看见
其他类似技术
NFS、Samba
同理?
GlusterFS
萌新不懂,萌新瑟瑟发抖
总结
折腾一大圈,不还是得买大盘鸡吗? 还不是贫穷限制了我的想象力