X7ROOT File Manager
Current Path:
/usr/sbin
usr
/
sbin
/
📁
..
📄
NetworkManager
(3.41 MB)
📄
accessdb
(12.59 KB)
📄
accton
(13.69 KB)
📄
adcli
(179.27 KB)
📄
addgnupghome
(3 KB)
📄
addpart
(24.86 KB)
📄
adduser
(148.17 KB)
📄
agetty
(62.38 KB)
📄
alternatives
(36.66 KB)
📄
anacron
(40.99 KB)
📄
apachectl
(4.52 KB)
📄
applygnupgdefaults
(2.17 KB)
📄
arp
(64.71 KB)
📄
arpd
(109.52 KB)
📄
arping
(28.74 KB)
📄
atd
(32.63 KB)
📄
atopacctd
(25.29 KB)
📄
atrun
(67 B)
📄
auditctl
(45.04 KB)
📄
auditd
(151.73 KB)
📄
augenrules
(4.04 KB)
📄
aureport
(122.35 KB)
📄
ausearch
(130.36 KB)
📄
authconfig
(21.54 KB)
📄
autrace
(16.54 KB)
📄
avcstat
(16.4 KB)
📄
badblocks
(32.59 KB)
📄
biosdecode
(21.45 KB)
📄
biosdevname
(46.16 KB)
📄
blkdeactivate
(15.97 KB)
📄
blkdiscard
(29.05 KB)
📄
blkid
(98.66 KB)
📄
blkmapd
(53.47 KB)
📄
blkzone
(49.74 KB)
📄
blockdev
(41.3 KB)
📄
bpftool
(2.74 MB)
📄
bridge
(158.25 KB)
📄
build-locale-archive
(841.02 KB)
📄
cache_check
(1.43 MB)
📄
cache_dump
(1.43 MB)
📄
cache_metadata_size
(1.43 MB)
📄
cache_repair
(1.43 MB)
📄
cache_restore
(1.43 MB)
📄
cache_writeback
(1.43 MB)
📄
capsh
(32.44 KB)
📄
cfdisk
(98.4 KB)
📄
chcpu
(28.84 KB)
📄
chgpasswd
(69.69 KB)
📄
chkconfig
(45.11 KB)
📄
chpasswd
(61.42 KB)
📄
chronyd
(375.66 KB)
📄
chroot
(41.52 KB)
📄
clock
(65.22 KB)
📄
clockdiff
(20.43 KB)
📄
consoletype
(11.85 KB)
📄
convertquota
(78.68 KB)
📄
cracklib-check
(13.05 KB)
📄
cracklib-format
(251 B)
📄
cracklib-packer
(13.05 KB)
📄
cracklib-unpacker
(9.03 KB)
📄
create-cracklib-dict
(990 B)
📄
crond
(73.94 KB)
📄
cryptsetup
(147.42 KB)
📄
csf
(245.1 KB)
📄
ctrlaltdel
(24.79 KB)
📄
ctstat
(25.33 KB)
📄
dcb
(155.04 KB)
📄
ddns-confgen
(20.46 KB)
📄
debugfs
(231.63 KB)
📄
delpart
(24.86 KB)
📄
depmod
(159.95 KB)
📄
devlink
(215.87 KB)
📄
dhclient
(453.68 KB)
📄
dhclient-script
(32.86 KB)
📄
dmeventd
(45.08 KB)
📄
dmfilemapd
(24.55 KB)
📄
dmidecode
(141.8 KB)
📄
dmsetup
(158.64 KB)
📄
dmstats
(158.64 KB)
📄
dnssec-checkds
(936 B)
📄
dnssec-coverage
(938 B)
📄
dnssec-dsfromkey
(60.84 KB)
📄
dnssec-importkey
(60.84 KB)
📄
dnssec-keyfromlabel
(64.76 KB)
📄
dnssec-keygen
(72.84 KB)
📄
dnssec-keymgr
(934 B)
📄
dnssec-revoke
(56.74 KB)
📄
dnssec-settime
(60.84 KB)
📄
dnssec-signzone
(117.2 KB)
📄
dnssec-verify
(52.84 KB)
📄
dosfsck
(65.13 KB)
📄
dosfslabel
(61.1 KB)
📄
dovecot
(137.48 KB)
📄
dovecot_cpshutdown
(3.27 KB)
📄
dpkg-fsys-usrunmess
(12.11 KB)
📄
dump-acct
(29.15 KB)
📄
dump-utmp
(25.02 KB)
📄
dumpe2fs
(32.52 KB)
📄
e2freefrag
(16.42 KB)
📄
e2fsck
(328.52 KB)
📄
e2image
(36.61 KB)
📄
e2label
(110.63 KB)
📄
e2mmpstatus
(32.52 KB)
📄
e2undo
(20.38 KB)
📄
e4crypt
(24.55 KB)
📄
e4defrag
(28.49 KB)
📄
ebtables
(220.8 KB)
📄
ebtables-restore
(220.8 KB)
📄
ebtables-save
(220.8 KB)
📄
edquota
(91.24 KB)
📄
era_check
(1.43 MB)
📄
era_dump
(1.43 MB)
📄
era_invalidate
(1.43 MB)
📄
era_restore
(1.43 MB)
📄
ether-wake
(73.99 KB)
📄
ethtool
(557.79 KB)
📄
exicyclog
(11.1 KB)
📄
exigrep
(10.52 KB)
📄
exim
(1.49 MB)
📄
exim_checkaccess
(4.83 KB)
📄
exim_dbmbuild
(23.23 KB)
📄
exim_dumpdb
(38.02 KB)
📄
exim_fixdb
(47.56 KB)
📄
exim_lock
(26.59 KB)
📄
exim_tidydb
(42.35 KB)
📄
eximstats
(148.26 KB)
📄
exinext
(7.14 KB)
📄
exiqgrep
(5.66 KB)
📄
exiqsumm
(5.32 KB)
📄
exiwhat
(4.42 KB)
📄
exportfs
(82.38 KB)
📄
faillock
(20.52 KB)
📄
fatlabel
(61.1 KB)
📄
fcgistarter
(17.11 KB)
📄
fdformat
(33.17 KB)
📄
fdisk
(130.92 KB)
📄
filefrag
(16.47 KB)
📄
findfs
(12.37 KB)
📄
firewalld
(6.92 KB)
📄
fix-info-dir
(7.84 KB)
📄
fixfiles
(10.48 KB)
📄
fsadm
(24 KB)
📄
fsck
(53.47 KB)
📄
fsck.cramfs
(41.4 KB)
📄
fsck.ext2
(328.52 KB)
📄
fsck.ext3
(328.52 KB)
📄
fsck.ext4
(328.52 KB)
📄
fsck.fat
(65.13 KB)
📄
fsck.minix
(98.74 KB)
📄
fsck.msdos
(65.13 KB)
📄
fsck.vfat
(65.13 KB)
📄
fsck.xfs
(1.92 KB)
📄
fsfreeze
(16.38 KB)
📄
fstrim
(49.6 KB)
📄
fuse2fs
(70.39 KB)
📄
fuser
(38.14 KB)
📄
g13-syshelp
(189.71 KB)
📄
genhomedircon
(29.27 KB)
📄
genhostid
(11.85 KB)
📄
genl
(121.41 KB)
📄
genrandom
(12.38 KB)
📄
getcap
(12.34 KB)
📄
getenforce
(7.84 KB)
📄
getpcaps
(12.27 KB)
📄
getsebool
(11.88 KB)
📄
groupadd
(95.34 KB)
📄
groupdel
(91.09 KB)
📄
groupmems
(61.48 KB)
📄
groupmod
(99.37 KB)
📄
grpck
(61.48 KB)
📄
grpconv
(57.26 KB)
📄
grpunconv
(57.25 KB)
📄
grub2-bios-setup
(1.16 MB)
📄
grub2-get-kernel-settings
(2.68 KB)
📄
grub2-install
(1.44 MB)
📄
grub2-macbless
(1.14 MB)
📄
grub2-mkconfig
(8.68 KB)
📄
grub2-ofpathname
(242.26 KB)
📄
grub2-probe
(1.16 MB)
📄
grub2-reboot
(3.99 KB)
📄
grub2-rpm-sort
(279.16 KB)
📄
grub2-set-bootflag
(16.34 KB)
📄
grub2-set-default
(3.45 KB)
📄
grub2-set-password
(3.05 KB)
📄
grub2-setpassword
(3.05 KB)
📄
grub2-sparc64-setup
(1.16 MB)
📄
grub2-switch-to-blscfg
(8.6 KB)
📄
grubby
(260 B)
📄
gss-server
(24.62 KB)
📄
gssproxy
(132.08 KB)
📄
halt
(218.45 KB)
📄
hardlink
(17.09 KB)
📄
hdparm
(131.91 KB)
📄
htcacheclean
(44.36 KB)
📄
httpd
(990.57 KB)
📄
hwclock
(65.22 KB)
📄
iconvconfig
(33.05 KB)
📄
ifconfig
(80.86 KB)
📄
ifdown
(2.07 KB)
📄
ifenslave
(24.95 KB)
📄
ifstat
(117.67 KB)
📄
iftop
(75.42 KB)
📄
ifup
(5.33 KB)
📄
imunify-notifier
(9.82 MB)
📄
init
(1.53 MB)
📄
insmod
(159.95 KB)
📄
install-info
(50.23 KB)
📄
installkernel
(323 B)
📄
intel_sdsi
(15.62 KB)
📄
iotop
(511 B)
📄
ip
(693.3 KB)
📄
ip6tables
(220.8 KB)
📄
ip6tables-apply
(6.89 KB)
📄
ip6tables-restore
(220.8 KB)
📄
ip6tables-restore-translate
(220.8 KB)
📄
ip6tables-save
(220.8 KB)
📄
ip6tables-translate
(220.8 KB)
📄
ipmaddr
(21 KB)
📄
iprconfig
(408.03 KB)
📄
iprdbg
(137.57 KB)
📄
iprdump
(129.3 KB)
📄
iprinit
(125.28 KB)
📄
iprsos
(2.18 KB)
📄
iprupdate
(129.3 KB)
📄
ipset
(9.01 KB)
📄
iptables
(220.8 KB)
📄
iptables-apply
(6.89 KB)
📄
iptables-restore
(220.8 KB)
📄
iptables-restore-translate
(220.8 KB)
📄
iptables-save
(220.8 KB)
📄
iptables-translate
(220.8 KB)
📄
iptstate
(92.05 KB)
📄
iptunnel
(25 KB)
📄
irqbalance
(62.28 KB)
📄
irqbalance-ui
(41.29 KB)
📄
isc-hmac-fixup
(11.85 KB)
📄
iscsi-iname
(16.42 KB)
📄
iscsiadm
(406.38 KB)
📄
iscsid
(419.23 KB)
📄
iscsistart
(374.54 KB)
📄
iscsiuio
(183.51 KB)
📄
kexec
(194.98 KB)
📄
key.dns_resolver
(24.52 KB)
📄
kpartx
(49.05 KB)
📄
kpatch
(16.59 KB)
📄
lchage
(16.41 KB)
📄
ldattach
(32.99 KB)
📄
ldconfig
(986.02 KB)
📄
ledctl
(101.16 KB)
📄
ledmon
(101.11 KB)
📄
lfd
(382.45 KB)
📄
lgroupadd
(11.88 KB)
📄
lgroupdel
(11.88 KB)
📄
lgroupmod
(19.88 KB)
📄
lid
(16.27 KB)
📄
lnewusers
(19.87 KB)
📄
lnstat
(25.33 KB)
📄
load_policy
(12.28 KB)
📄
logrotate
(93.03 KB)
📄
logsave
(16.41 KB)
📄
losetup
(90.59 KB)
📄
lpasswd
(20.35 KB)
📄
lshw
(966.2 KB)
📄
lsmod
(159.95 KB)
📄
lspci
(94.85 KB)
📄
luseradd
(19.88 KB)
📄
luserdel
(15.88 KB)
📄
lusermod
(19.88 KB)
📄
lvchange
(2.61 MB)
📄
lvconvert
(2.61 MB)
📄
lvcreate
(2.61 MB)
📄
lvdisplay
(2.61 MB)
📄
lvextend
(2.61 MB)
📄
lvm
(2.61 MB)
📄
lvm_import_vdo
(23.14 KB)
📄
lvmconfig
(2.61 MB)
📄
lvmdevices
(2.61 MB)
📄
lvmdiskscan
(2.61 MB)
📄
lvmdump
(10.12 KB)
📄
lvmpolld
(200.69 KB)
📄
lvmsadc
(2.61 MB)
📄
lvmsar
(2.61 MB)
📄
lvreduce
(2.61 MB)
📄
lvremove
(2.61 MB)
📄
lvrename
(2.61 MB)
📄
lvresize
(2.61 MB)
📄
lvs
(2.61 MB)
📄
lvscan
(2.61 MB)
📄
lwresd
(840.86 KB)
📄
makedumpfile
(425.19 KB)
📄
mariadbd
(24.3 MB)
📄
matchpathcon
(12.37 KB)
📄
mcelog
(206.3 KB)
📄
mdadm
(620.63 KB)
📄
mdmon
(375.48 KB)
📄
mii-diag
(25.4 KB)
📄
mii-tool
(21.03 KB)
📄
mkdict
(251 B)
📄
mkdosfs
(39.07 KB)
📄
mkdumprd
(12.68 KB)
📄
mke2fs
(138.45 KB)
📄
mkfadumprd
(2.23 KB)
📄
mkfs
(16.47 KB)
📄
mkfs.cramfs
(41.26 KB)
📄
mkfs.ext2
(138.45 KB)
📄
mkfs.ext3
(138.45 KB)
📄
mkfs.ext4
(138.45 KB)
📄
mkfs.fat
(39.07 KB)
📄
mkfs.minix
(86.55 KB)
📄
mkfs.msdos
(39.07 KB)
📄
mkfs.vfat
(39.07 KB)
📄
mkfs.xfs
(475.98 KB)
📄
mkhomedir_helper
(24.43 KB)
📄
mklost+found
(11.86 KB)
📄
mksquashfs
(186.83 KB)
📄
mkswap
(86.47 KB)
📄
modinfo
(159.95 KB)
📄
modprobe
(159.95 KB)
📄
modsec-sdbm-util
(25.83 KB)
📄
mount.nfs
(197.24 KB)
📄
mount.nfs4
(197.24 KB)
📄
mountstats
(42.22 KB)
📄
mpathconf
(16.17 KB)
📄
mpathpersist
(29.34 KB)
📄
mtr
(110.92 KB)
📄
mtr-packet
(58.3 KB)
📄
multipath
(32.61 KB)
📄
multipathd
(134.76 KB)
📄
mysqld
(24.3 MB)
📄
named
(840.86 KB)
📄
named-checkconf
(36.77 KB)
📄
named-checkzone
(36.63 KB)
📄
named-compilezone
(36.63 KB)
📄
named-journalprint
(11.85 KB)
📄
nameif
(16.98 KB)
📄
newusers
(107.23 KB)
📄
nfsconf
(37.48 KB)
📄
nfsconvert
(13.03 KB)
📄
nfsdcld
(65.87 KB)
📄
nfsdclddb
(10 KB)
📄
nfsdclnts
(9.02 KB)
📄
nfsdcltrack
(49.78 KB)
📄
nfsidmap
(45.36 KB)
📄
nfsiostat
(23.36 KB)
📄
nfsref
(65.8 KB)
📄
nfsstat
(35.52 KB)
📄
nft
(24.41 KB)
📄
nginx
(1.85 MB)
📄
nginx-debug
(1.98 MB)
📄
nologin
(11.87 KB)
📄
nrpe
(76.13 KB)
📄
nscd
(160.68 KB)
📄
nsec3hash
(12.29 KB)
📄
nstat
(113.57 KB)
📄
nvme
(721.45 KB)
📄
oddjobd
(77.63 KB)
📄
ownership
(12.4 KB)
📄
packer
(13.05 KB)
📄
pam_console_apply
(45.2 KB)
📄
pam_timestamp_check
(11.87 KB)
📄
paperconfig
(4.07 KB)
📄
parted
(85.6 KB)
📄
partprobe
(16.39 KB)
📄
partx
(94.5 KB)
📄
pdata_tools
(1.43 MB)
📄
pidof
(16.7 KB)
📄
ping
(66.13 KB)
📄
ping6
(66.13 KB)
📄
pivot_root
(12.38 KB)
📄
plipconfig
(12.71 KB)
📄
plymouth-set-default-theme
(6.05 KB)
📄
plymouthd
(141.97 KB)
📄
poweroff
(218.45 KB)
📄
pure-authd
(19.23 KB)
📄
pure-certd
(19.13 KB)
📄
pure-config.pl
(4.64 KB)
📄
pure-ftpd
(182.06 KB)
📄
pure-ftpwho
(26.82 KB)
📄
pure-mrtginfo
(11.16 KB)
📄
pure-quotacheck
(18.81 KB)
📄
pure-uploadscript
(19.07 KB)
📄
pvchange
(2.61 MB)
📄
pvck
(2.61 MB)
📄
pvcreate
(2.61 MB)
📄
pvdisplay
(2.61 MB)
📄
pvmove
(2.61 MB)
📄
pvremove
(2.61 MB)
📄
pvresize
(2.61 MB)
📄
pvs
(2.61 MB)
📄
pvscan
(2.61 MB)
📄
pwck
(57.27 KB)
📄
pwconv
(53.1 KB)
📄
pwhistory_helper
(20.43 KB)
📄
pwunconv
(53.13 KB)
📄
quot
(78.67 KB)
📄
quotacheck
(115.75 KB)
📄
quotaoff
(83.16 KB)
📄
quotaon
(83.16 KB)
📄
quotastats
(16.54 KB)
📄
raid-check
(3.7 KB)
📄
rcmysql
(0 B)
📄
rdisc
(24.55 KB)
📄
rdma
(187.38 KB)
📄
readprofile
(20.55 KB)
📄
realm
(144.26 KB)
📄
reboot
(218.45 KB)
📄
repquota
(83.24 KB)
📄
request-key
(24.38 KB)
📄
resize2fs
(64.91 KB)
📄
resizepart
(41.56 KB)
📄
resolvconf
(195.74 KB)
📄
restorecon
(20.53 KB)
📄
restorecon_xattr
(16.41 KB)
📄
rfkill
(53.46 KB)
📄
rmmod
(159.95 KB)
📄
rndc
(36.53 KB)
📄
rndc-confgen
(20.45 KB)
📄
rotatelogs
(30.51 KB)
📄
route
(67.63 KB)
📄
rpc.gssd
(106.55 KB)
📄
rpc.idmapd
(61.73 KB)
📄
rpc.mountd
(158.92 KB)
📄
rpc.nfsd
(49.91 KB)
📄
rpc.statd
(103.29 KB)
📄
rpcbind
(61.55 KB)
📄
rpcctl
(9.41 KB)
📄
rpcdebug
(19.38 KB)
📄
rpcinfo
(32.64 KB)
📄
rsyslogd
(724.73 KB)
📄
rtacct
(46.94 KB)
📄
rtcwake
(49.31 KB)
📄
rtmon
(117.27 KB)
📄
rtstat
(25.33 KB)
📄
runlevel
(218.45 KB)
📄
runq
(1.49 MB)
📄
runuser
(48.99 KB)
📄
sa
(46.62 KB)
📄
sasldblistusers2
(20.77 KB)
📄
saslpasswd2
(16.42 KB)
📄
sefcontext_compile
(65.35 KB)
📄
selabel_digest
(12.28 KB)
📄
selabel_lookup
(12.27 KB)
📄
selabel_lookup_best_match
(11.89 KB)
📄
selabel_partial_match
(11.88 KB)
📄
selinux_check_access
(12.36 KB)
📄
selinuxconlist
(11.88 KB)
📄
selinuxdefcon
(11.88 KB)
📄
selinuxenabled
(7.84 KB)
📄
selinuxexeccon
(11.86 KB)
📄
semodule
(29.27 KB)
📄
sendmail
(16.91 KB)
📄
service
(3.64 KB)
📄
sestatus
(20.41 KB)
📄
setcap
(16.27 KB)
📄
setenforce
(12.27 KB)
📄
setfiles
(20.53 KB)
📄
setpci
(28.56 KB)
📄
setquota
(91.38 KB)
📄
setsebool
(16.38 KB)
📄
sfdisk
(118.5 KB)
📄
showmount
(21.06 KB)
📄
shutdown
(218.45 KB)
📄
sim_server
(11.87 KB)
📄
slattach
(43.76 KB)
📄
sm-notify
(78.14 KB)
📄
smartctl
(907.08 KB)
📄
smartd
(733.2 KB)
📄
snmpd
(32.45 KB)
📄
snmptrapd
(32.6 KB)
📄
sos
(627 B)
📄
sos-collector
(139 B)
📄
sosreport
(132 B)
📄
ss
(191.3 KB)
📄
sshd
(869.77 KB)
📄
sss_cache
(61.09 KB)
📄
sssd
(73.01 KB)
📄
start-statd
(838 B)
📄
start-stop-daemon
(45.98 KB)
📄
suexec
(25.3 KB)
📄
sulogin
(49.24 KB)
📄
suphp
(6.56 MB)
📄
swaplabel
(16.5 KB)
📄
swapoff
(20.74 KB)
📄
swapon
(49.4 KB)
📄
switch_root
(16.49 KB)
📄
sysctl
(28.88 KB)
📄
syspurpose
(415 B)
📄
tcpdump
(1.01 MB)
📄
tcpslice
(32.63 KB)
📄
tcsd
(309.72 KB)
📄
telinit
(218.45 KB)
📄
thin_check
(1.43 MB)
📄
thin_delta
(1.43 MB)
📄
thin_dump
(1.43 MB)
📄
thin_ls
(1.43 MB)
📄
thin_metadata_pack
(907.47 KB)
📄
thin_metadata_size
(1.43 MB)
📄
thin_metadata_unpack
(895.45 KB)
📄
thin_repair
(1.43 MB)
📄
thin_restore
(1.43 MB)
📄
thin_rmap
(1.43 MB)
📄
thin_trim
(1.43 MB)
📄
timedatex
(33.43 KB)
📄
tipc
(163.07 KB)
📄
tmpwatch
(35.47 KB)
📄
tracepath
(20.44 KB)
📄
tracepath6
(20.44 KB)
📄
tsig-keygen
(20.46 KB)
📄
tune2fs
(110.63 KB)
📄
tuned
(3.88 KB)
📄
tuned-adm
(6.5 KB)
📄
udevadm
(424.59 KB)
📄
umount.nfs
(197.24 KB)
📄
umount.nfs4
(197.24 KB)
📄
unbound-anchor
(57.34 KB)
📄
unix_chkpwd
(36.86 KB)
📄
unix_update
(36.87 KB)
📄
unsquashfs
(99.57 KB)
📄
update-alternatives
(36.66 KB)
📄
update-pciids
(1.71 KB)
📄
update-smart-drivedb
(14.44 KB)
📄
useradd
(148.17 KB)
📄
userdel
(107.29 KB)
📄
usermod
(144.07 KB)
📄
usernetctl
(12.4 KB)
📄
uuserver
(15.88 KB)
📄
vdpa
(118.04 KB)
📄
vgcfgbackup
(2.61 MB)
📄
vgcfgrestore
(2.61 MB)
📄
vgchange
(2.61 MB)
📄
vgck
(2.61 MB)
📄
vgconvert
(2.61 MB)
📄
vgcreate
(2.61 MB)
📄
vgdisplay
(2.61 MB)
📄
vgexport
(2.61 MB)
📄
vgextend
(2.61 MB)
📄
vgimport
(2.61 MB)
📄
vgimportclone
(2.61 MB)
📄
vgimportdevices
(2.61 MB)
📄
vgmerge
(2.61 MB)
📄
vgmknodes
(2.61 MB)
📄
vgreduce
(2.61 MB)
📄
vgremove
(2.61 MB)
📄
vgrename
(2.61 MB)
📄
vgs
(2.61 MB)
📄
vgscan
(2.61 MB)
📄
vgsplit
(2.61 MB)
📄
vigr
(68.05 KB)
📄
vipw
(68.05 KB)
📄
virt-what
(14.22 KB)
📄
visudo
(239.22 KB)
📄
vmcore-dmesg
(28.58 KB)
📄
vpddecode
(16.47 KB)
📄
weak-modules
(33.6 KB)
📄
whmapi0
(3.18 MB)
📄
whmapi1
(3.18 MB)
📄
whmlogin
(2.33 KB)
📄
wipefs
(41.11 KB)
📄
xfs_admin
(1.38 KB)
📄
xfs_bmap
(695 B)
📄
xfs_copy
(434.59 KB)
📄
xfs_db
(760.47 KB)
📄
xfs_estimate
(12.39 KB)
📄
xfs_freeze
(800 B)
📄
xfs_fsr
(53.41 KB)
📄
xfs_growfs
(422.48 KB)
📄
xfs_info
(1.26 KB)
📄
xfs_io
(188.28 KB)
📄
xfs_logprint
(454.7 KB)
📄
xfs_mdrestore
(410.09 KB)
📄
xfs_metadump
(782 B)
📄
xfs_mkfile
(1.02 KB)
📄
xfs_ncheck
(685 B)
📄
xfs_quota
(93.98 KB)
📄
xfs_repair
(715.24 KB)
📄
xfs_rtcp
(16.38 KB)
📄
xfs_spaceman
(45.42 KB)
📄
xfsdump
(308.02 KB)
📄
xfsinvutil
(66.91 KB)
📄
xfsrestore
(369.39 KB)
📄
xqmstats
(16.45 KB)
📄
xtables-monitor
(220.8 KB)
📄
xtables-nft-multi
(220.8 KB)
📄
zdump
(20.57 KB)
📄
zic
(52.83 KB)
📄
zramctl
(99.09 KB)
Editing: lvm_import_vdo
#!/bin/bash # # Copyright (C) 2021-2023 Red Hat, Inc. All rights reserved. # # This file is part of LVM2. # # This copyrighted material is made available to anyone wishing to use, # modify, copy, or redistribute it subject to the terms and conditions # of the GNU General Public License v.2. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # Author: Zdenek Kabelac <zkabelac at redhat.com> # # Script for importing VDO volumes to lvm2 managed VDO LVs # # Needed utilities: # lvm, dmsetup, # vdo, # grep, awk, sed, blockdev, readlink, stat, mkdir, truncate # # Conversion is using 'vdo convert' support from VDO manager to move # existing VDO header by 2M which makes space to place in PV header # and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. # set -euE -o pipefail TOOL=lvm_import_vdo IMPORT_NAME="VDO_${TOOL}_${RANDOM}$$" test ${#IMPORT_NAME} -lt 100 || error "Random name \"$IMPORT_NAME\" is too long!" TEMPDIR="${TMPDIR:-/tmp}/$IMPORT_NAME" _SAVEPATH=$PATH PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" # Set of trapped signals declare -a SIGNALS=("HUP" "INT" "QUIT" "ABRT" "TERM" "EXIT") # user may override lvm location by setting LVM_BINARY LVM=${LVM_BINARY:-lvm} VDO=${VDO_BINARY:-vdo} BLOCKDEV="blockdev" LOSETUP="losetup" READLINK="readlink" READLINK_E="-e" STAT="stat" MKDIR="mkdir" TRUNCATE="truncate" DMSETUP="dmsetup" DM_DEV_DIR="${DM_DEV_DIR:-/dev}" DM_UUID_PREFIX="${DM_UUID_PREFIX:-}" DM_VG_NAME= DM_LV_NAME= DEFAULT_VDO_CONFIG="/etc/vdoconf.yml" # Default location of vdo's manager config file VDO_CONFIG=${VDO_CONFIG:-} # can be overridden with --vdo-config VDO_CONFIG_RESTORE= VDOCONF= test -n "$VDO_CONFIG" && VDOCONF="-f $VDO_CONFIG" DEVICE= VGNAME= LVNAME= DEVMAJOR=0 DEVMINOR=0 PROMPTING= USE_VDO_DM_SNAPSHOT="--yes" VDO_DM_SNAPSHOT_NAME= VDO_DM_SNAPSHOT_DEVICE= VDO_SNAPSHOT_LOOP= VDO_INCONSISTENT= DRY=0 VERB= FORCE= YES= ABORT_AFTER_VDO_CONVERT=0 VDO_ALLOCATION_PARAMS= # default name for converted VG and its VDO LV DEFAULT_NAME="vdovg/vdolvol" NAME="" # predefine empty vdo_ackThreads= vdo_bioRotationInterval= vdo_bioThreads= vdo_blockMapCacheSize= vdo_blockMapPeriod= vdo_compression= vdo_cpuThreads= vdo_deduplication= vdo_hashZoneThreads= vdo_indexMemory= vdo_indexSparse= vdo_logicalBlockSize= vdo_logicalThreads= vdo_maxDiscardSize= vdo_physicalThreads= vdo_slabSize= vdo_writePolicy= # help message tool_usage() { echo "${TOOL}: Utility to convert VDO volume to VDO LV." echo echo " ${TOOL} [options] <vdo_device_path>" echo echo " Options:" echo " -f | --force Bypass sanity checks" echo " -h | --help Show this help message" echo " -n | --name Specifies VG/LV name for converted VDO volume" echo " -v | --verbose Be verbose" echo " -y | --yes Answer \"yes\" at any prompts" echo " --dry-run Print verbosely commands without running them" echo " --no-snapshot Do not use snapshot for converted VDO device" echo " --uuid-prefix Prefix for DM snapshot uuid" echo " --vdo-config Configuration file for VDO manager" exit } verbose() { test -z "$VERB" || echo "$TOOL:" "$@" } # Support multi-line error messages error() { for i in "$@" ; do echo "$TOOL: $i" >&2 done return 1 } warn() { echo "$TOOL: WARNING: $i" >&2 } dry() { if [ "$DRY" -ne 0 ]; then verbose "Dry execution" "$@" return 0 fi verbose "Executing" "$@" "$@" } cleanup() { RC=$? # Return code + 128 of the last command eg INT=2 + 128 -> 130 trap '' "${SIGNALS[@]}" # mute trap for all signals to not interrupt cleanup() on any next signal [ -z "$PROMPTING" ] || echo "No" [ -e "$VDO_CONFIG_RESTORE" ] && { dry cp -a "$VDO_CONFIG_RESTORE" "${VDO_CONFIG:-"$DEFAULT_VDO_CONFIG"}" || true ; } if [ -n "$VDO_DM_SNAPSHOT_NAME" ]; then dry "$LVM" vgchange -an --devices "$VDO_DM_SNAPSHOT_DEVICE" "$VGNAME" &>/dev/null || true for i in {1..20} ; do [ "$(dry "$DMSETUP" info --noheading -co open "$VDO_DM_SNAPSHOT_NAME")" = "0" ] && break sleep .1 done dry "$DMSETUP" remove "$VDO_DM_SNAPSHOT_NAME" &>/dev/null || true fi [ -n "$VDO_SNAPSHOT_LOOP" ] && { dry "$LOSETUP" -d "$VDO_SNAPSHOT_LOOP" || true ; } [ -z "$VDO_INCONSISTENT" ] || echo "$TOOL: VDO volume import process exited unexpectedly!" >&2 rm -rf "$TEMPDIR" || true exit "$RC" } # Create snapshot target like for persistent snapshot with 16KiB chunksize snapshot_target_line_() { echo "0 $("$BLOCKDEV" --getsize "$1") snapshot${3:-} $1 $2 P 32" } snapshot_create_() { VDO_DM_SNAPSHOT_NAME="${IMPORT_NAME}_snap" local file="$TEMPDIR/$VDO_DM_SNAPSHOT_NAME" # TODO: maybe use ramdisk via 'brd' device ?) "$TRUNCATE" -s 20M "$file" VDO_SNAPSHOT_LOOP=$("$LOSETUP" -f --show "$file") "$DMSETUP" create "$VDO_DM_SNAPSHOT_NAME" -u "${DM_UUID_PREFIX}${VDO_DM_SNAPSHOT_NAME}-priv" --table "$(snapshot_target_line_ "$1" "$VDO_SNAPSHOT_LOOP")" VDO_DM_SNAPSHOT_DEVICE="$DM_DEV_DIR/mapper/$VDO_DM_SNAPSHOT_NAME" verbose "Snapshot of VDO device $1 created: $VDO_DM_SNAPSHOT_DEVICE." } snapshot_merge_() { local status local initial_status initial_status=( $("$DMSETUP" status "$VDO_DM_SNAPSHOT_NAME") ) "$DMSETUP" reload "$VDO_DM_SNAPSHOT_NAME" --table "$(snapshot_target_line_ "$1" "$VDO_SNAPSHOT_LOOP" -merge)" "$DMSETUP" suspend "$VDO_DM_SNAPSHOT_NAME" || { error "ABORTING: Failed to initialize snapshot merge! Origin volume is unchanged." } verbose "Merging converted VDO volume \"$VDO_DM_SNAPSHOT_NAME\"." VDO_INCONSISTENT=1 # Running merging "$DMSETUP" resume "$VDO_DM_SNAPSHOT_NAME" #du -h "$TEMPDIR/$VDO_DM_SNAPSHOT_NAME" # Loop for a while, till the snapshot is merged. # Should be nearly instantaneous. # FIXME: Recovery when something prevents merging is hard for i in $(seq 1 20) ; do status=( $("$DMSETUP" status "$VDO_DM_SNAPSHOT_NAME") ) # Check if merging is finished [ "${status[3]%/*}" = "${status[4]}" ] && break # Wait a bit and retry sleep .2 done if [ "${status[3]%/*}" != "${status[4]}" ]; then # FIXME: Now what shall we do ??? Help.... # Keep snapshot in DM table for possible analysis... VDO_DM_SNAPSHOT_NAME= VDO_SNAPSHOT_LOOP= echo "$TOOL: Initial snapshot status ${initial_status[*]}" echo "$TOOL: Failing merge snapshot status ${status[*]}" error "ABORTING: Snapshot failed to merge! (Administrator required...)" fi VDO_INCONSISTENT= VDO_CONFIG_RESTORE= verbose "Converted VDO volume is merged to \"$1\"." "$DMSETUP" remove "$VDO_DM_SNAPSHOT_NAME" || { sleep 1 # sleep and retry once more "$DMSETUP" remove "$VDO_DM_SNAPSHOT_NAME" || { error "ABORTING: Cannot remove snapshot $VDO_DM_SNAPSHOT_NAME! (check volume autoactivation...)" } } VDO_DM_SNAPSHOT_NAME= "$LOSETUP" -d "$VDO_SNAPSHOT_LOOP" VDO_SNAPSHOT_LOOP= } get_enabled_value_() { case "$1" in enabled) echo "1" ;; *) echo "0" ;; esac } get_kb_size_with_unit_() { case "$1" in *[kK]) echo $(( ${1%[kK]} )) ;; *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; esac } # Figure out largest possible extent size usable for VG # $1 physical size # $2 logical size get_largest_extent_size_() { local max=4 local i local d for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do d=$(( $1 / i )) [ $(( d * i )) -eq "$1" ] || break d=$(( $2 / i )) [ $(( d * i )) -eq "$2" ] || break max=$i done echo "$max" } # detect LV on the given device # deference device name if it is symbolic link detect_lv_() { local DEVICE=$1 local SYSVOLUME local MAJORMINOR DEVICE=${1/#"${DM_DEV_DIR}/"/} DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE" || true) [ -n "$DEVICE" ] || error "Readlink cannot access device \"$1\"." RDEVICE=$DEVICE case "$RDEVICE" in # hardcoded /dev since udev does not create these entries elsewhere /dev/dm-[0-9]*) read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." DEVMAJOR=${MAJORMINOR%%:*} DEVMINOR=${MAJORMINOR##*:} ;; *) RSTAT=$("$STAT" --format "DEVMAJOR=\$((0x%t)) DEVMINOR=\$((0x%T))" "$RDEVICE" || true) [ -n "$RSTAT" ] || error "Cannot get major:minor for \"$DEVICE\"." eval "$RSTAT" ;; esac [ "$DEVMAJOR" != "$(grep device-mapper /proc/devices | cut -f1 -d' ')" ] && return DEV="$("$DMSETUP" info -c -j "$DEVMAJOR" -m "$DEVMINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" case "$DEV" in Device*) ;; # no devices *) eval "$DEV" ;; esac } # parse yaml config files into 'prefix_yaml_part_names=("value")' strings parse_yaml_() { local yaml_file=$1 local prefix=$2 local s local w local fs s='[[:space:]]*' w='[a-zA-Z0-9_.-]*' fs="$(echo @|tr @ '\034')" ( sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ -e 's/\$/\\\$/g' \ -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | awk -F"$fs" '{ indent = length($1)/2; if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} vname[indent] = $2; for (i in vname) {if (i > indent) {delete vname[i]}} if (length($3) > 0) { vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")} printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1], $3); } }' | sed -e 's/_=/+=/g' | awk 'BEGIN { FS="="; OFS="=" } /(-|\.).*=/ { gsub("-|\\.", "_", $1) } { print }' ) < "$yaml_file" } # # Convert VDO volume on LV to VDOPool within this VG # # This conversion requires the size of VDO virtual volume has to be expressed in the VG's extent size. # Currently this enforces a user to reduce the VG extent size to the smaller size (up to 4KiB). # # TODO: We may eventually relax this condition just like we are doing rounding for convert_non_lv_() # Let's if there would be any singly user requiring this feature. # It may allow to better use larger VDO volume size (in TiB ranges). # convert_lv_() { local vdo_logicalSize=$1 local extent_size local pvfree pvfree=$("$LVM" lvs -o size --units b --nosuffix --noheadings "$DM_VG_NAME/$DM_LV_NAME") pvfree=$(( pvfree / 1024 )) # to KiB # select largest possible extent size that can exactly express both sizes extent_size=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize") # validate existing VG extent_size can express virtual VDO size vg_extent_size=$("$LVM" vgs -o vg_extent_size --units b --nosuffix --noheadings "$VGNAME") vg_extent_size=$(( vg_extent_size / 1024 )) [ "$vg_extent_size" -le "$extent_size" ] || { error "Please vgchange extent_size to at most $extent_size KiB or extend and align virtual size of VDO device on $vg_extent_size KiB before retrying conversion." } verbose "Renaming existing LV to be used as _vdata volume for VDO pool LV." dry "$LVM" lvrename $YES $VERB "$VGNAME/$DM_LV_NAME" "$VGNAME/${LVNAME}_vpool" || { error "Rename of LV \"$VGNAME/$DM_LV_NAME\" failed, while VDO header has been already moved!" } verbose "Converting to VDO pool." dry "$LVM" lvconvert $YES $VERB $FORCE --config "$VDO_ALLOCATION_PARAMS" -Zn -V "${vdo_logicalSize}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool" verbose "Removing now unused VDO entry from VDO configuration." dry "$VDO" remove $VDOCONF $VERB --force --name "$VDONAME" } # # Convert VDO volume on a device to VG with VDOPool LV # # Convert device with the use of snapshot on top of original VDO volume (can be optionally disabled) # Once the whole conversion is finished, snapshot is merged (During the short period time of merging # user must ensure there will be no power-off!) # # For best use the latest version of vdoprepareforlvm tool is required. convert_non_lv_() { local vdo_logicalSize=$1 local vdo_logicalSizeRounded local extent_size local output local pvfree if [ -n "$USE_VDO_DM_SNAPSHOT" ]; then dry snapshot_create_ "$DEVICE" sed "s|$DEVICE|$VDO_DM_SNAPSHOT_DEVICE|" "$TEMPDIR/vdoconf.yml" > "$TEMPDIR/vdo_snap.yml" # In case of error in the middle of conversion restore original config file VDO_CONFIG_RESTORE="$TEMPDIR/vdoconf.yml" # Let VDO manager operate on snapshot volume dry cp -a "$TEMPDIR/vdo_snap.yml" "${VDO_CONFIG:-"$DEFAULT_VDO_CONFIG"}" else # If error in the following section, report possible problems ahead VDO_INCONSISTENT=1 fi # In case we operate with snapshot, all lvm2 operation will also run on top of snapshot local device=${VDO_DM_SNAPSHOT_DEVICE:-$DEVICE} # Check if there is not already an existing PV header, this would have fail on pvcreate after conversion "$LVM" pvs --devices "$device" "$device" 2>/dev/null && { error "Cannot convert volume \"$DEVICE\" with existing PV header." } verbose "Moving VDO header on \"$device\"." output=$(dry "$VDO" convert $VDOCONF $VERB --force --name "$VDONAME" 2>&1) || { local rc=$? echo "$output" error "Failed to convert VDO volume \"$DEVICE\" (exit code $rc)." } echo "$output" if [ "$ABORT_AFTER_VDO_CONVERT" != "0" ]; then warn "Aborting VDO conversion after moving VDO header, volume is useless!" return 0 fi # Parse result from VDO preparation/conversion tool # New version of the tool provides output with alignment and offset local vdo_length=0 local vdo_aligned=0 local vdo_offset=0 local vdo_non_converted=0 while IFS= read -r line ; do # trim leading spaces case "$(echo $line)" in "Non converted"*) vdo_non_converted=1 ;; "Length"*) vdo_length=${line##* = } ;; "Conversion completed"*) vdo_aligned=${line##*aligned on } vdo_aligned=${vdo_aligned%%[!0-9]*} vdo_offset=${line##*offset } # backward compatibility with report from older version vdo_offset=${vdo_offset##*by } vdo_offset=${vdo_offset%%[!0-9]*} ;; esac done <<< "$output" dry "$LVM" pvcreate $YES $VERB $FORCE --devices "$device" --dataalignment "$vdo_offset"b "$device" # Obtain free space in this new PV # after 'vdo convert' call there is ~(1-2)M free space at the front of the device pvfree=$("$BLOCKDEV" --getsize64 "$DEVICE") pvfree=$(( ( pvfree - vdo_offset ) / 1024 )) # to KiB if [ -n "$vdo_aligned" ] && [ "$vdo_aligned" != "0" ]; then extent_size=$(( vdo_aligned / 1024 )) else extent_size=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize") fi # Round virtual size to the LOWER size expressed in extent units. # lvm is parsing VDO metadata and can read real full size and use it instead of this smaller value. # To precisely byte-synchronize the size of VDO LV, user can lvresize such VDO LV later. vdo_logicalSizeRounded=$(( ( vdo_logicalSize / extent_size ) * extent_size )) verbose "Creating volume group \"$VGNAME\" with the extent size $extent_size KiB." dry "$LVM" vgcreate $YES $VERB --devices "$device" -s "${extent_size}k" "$VGNAME" "$device" verbose "Creating VDO pool data LV from all extents in the volume group \"$VGNAME\"." dry "$LVM" lvcreate -Zn -Wn -an $YES $VERB --devices "$device" -l100%VG -n "${LVNAME}_vpool" "$VGNAME" "$device" verbose "Converting to VDO pool." dry "$LVM" lvconvert ${USE_VDO_DM_SNAPSHOT:-"$YES"} $VERB $FORCE --devices "$device" --config "$VDO_ALLOCATION_PARAMS" -Zn -V "${vdo_logicalSizeRounded}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool" if [ "$vdo_logicalSizeRounded" -lt "$vdo_logicalSize" ]; then # need to extend virtual size to be covering all the converted area # let lvm2 to round to the proper virtual size of VDO LV dry "$LVM" lvextend $YES $VERB --devices "$device" -L "$vdo_logicalSize"k "$VGNAME/$LVNAME" fi VDO_INCONSISTENT= [ -z "$USE_VDO_DM_SNAPSHOT" ] && return # no-snapshot case finished dry "$LVM" vgchange -an $VERB $FORCE --devices "$device" "$VGNAME" # Prevent unwanted auto activation when VG is merged dry "$LVM" vgchange --setautoactivation n $VERB $FORCE --devices "$device" "$VGNAME" if [ -z "$YES" ]; then PROMPTING=yes warn "Do not interrupt merging process once it starts (VDO data may become irrecoverable)!" echo -n "$TOOL: Do you want to merge converted VDO device \"$DEVICE\" to VDO LV \"$VGNAME/$LVNAME\"? [y|N]: " read -r -n 1 -s ANSWER case "${ANSWER:0:1}" in y|Y ) echo "Yes" ;; * ) echo "No" ; PROMPTING=""; return 1 ;; esac PROMPTING="" YES="-y" # From now, now prompting fi dry snapshot_merge_ "$DEVICE" # For systems using devicesfile add 'merged' PV into system.devices. # Bypassing use of --valuesonly to keep compatibility with older lvm. local usedev=$("$LVM" lvmconfig --typeconfig full devices/use_devicesfile || true) [ "${usedev#*=}" = "1" ] && dry "$LVM" lvmdevices --adddev "$DEVICE" # Restore auto activation for a VG dry "$LVM" vgchange --setautoactivation y $VERB $FORCE "$VGNAME" dry "$LVM" lvchange -ay $VERB $FORCE "$VGNAME/$LVNAME" } # Convert existing VDO volume into lvm2 volume convert2lvm_() { local VDONAME local TRVDONAME local FOUND="" local MAJOR=0 local MINOR=0 VGNAME=${NAME%/*} LVNAME=${NAME#*/} DM_UUID="" detect_lv_ "$DEVICE" case "$DM_UUID" in LVM-*) eval "$("$DMSETUP" splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")" if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ]; then VGNAME=$DM_VG_NAME verbose "Using existing volume group name \"$VGNAME\"." [ -n "$LVNAME" ] || LVNAME=$DM_LV_NAME elif [ "$VGNAME" != "$DM_VG_NAME" ]; then error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for VDO device \"$DEVICE\"." fi ;; *) # Check if we need to generate unused $VGNANE if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ]; then VGNAME=${DEFAULT_NAME%/*} # Find largest matching VG name to our 'default' vgname LASTVGNAME=$(LC_ALL=C "$LVM" vgs -oname -O-name --noheadings -S name=~"${VGNAME}" | grep -m 1 -E "${VGNAME}[0-9]? ?" || true) if [ -n "$LASTVGNAME" ]; then LASTVGNAME=${LASTVGNAME#*"${VGNAME}"} # If the number is becoming too high, try some random number [ -n "$LASTVGNAME" ] && [ "$LASTVGNAME" -gt 99999999 ] && LASTVGNAME=$RANDOM # Generate new unused VG name VGNAME="${VGNAME}$(( LASTVGNAME + 1 ))" verbose "Selected unused volume group name \"$VGNAME\"." fi fi # New VG is created, LV name should be always unused. [ -n "$LVNAME" ] || LVNAME=${DEFAULT_NAME#*/} "$LVM" vgs "$VGNAME" >/dev/null 2>&1 && error "Cannot use already existing volume group name \"$VGNAME\"." ;; esac verbose "Checked whether device \"$DEVICE\" is already logical volume." "$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create \"$TEMPDIR\"." # TODO: might use directly /etc/vdoconf.yml (avoiding need of 'vdo' manager) verbose "Getting YAML VDO configuration." "$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml" [ -s "$TEMPDIR/vdoconf.yml" ] || error "Cannot work without VDO configuration." # Check list of devices in VDO configure file for their major:minor # and match with given $DEVICE devmajor:devminor for i in $(awk '/.*device:/ {print $2}' "$TEMPDIR/vdoconf.yml") ; do local DEV DEV=$("$READLINK" $READLINK_E "$i") || continue RSTAT=$("$STAT" --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$DEV" 2>/dev/null) || continue eval "$RSTAT" if [ "$MAJOR" = "$DEVMAJOR" ] && [ "$MINOR" = "$DEVMINOR" ]; then [ -z "$FOUND" ] || error "VDO configuration contains duplicate entries $FOUND and $i." FOUND=$i fi done [ -n "$FOUND" ] || error "Can't find matching device in VDO configuration file." verbose "Found matching device $FOUND $MAJOR:$MINOR." VDONAME=$(awk -v DNAME="$FOUND" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") TRVDONAME=$(echo "$VDONAME" | tr '-' '_') # When VDO volume is 'active', check it's not mounted/being used DM_OPEN="$("$DMSETUP" info -c -o open "$VDONAME" --noheadings --nameprefixes 2>/dev/null || true)" case "$DM_OPEN" in Device*) ;; # no devices *) eval "$DM_OPEN" [ "${DM_OPEN:-0}" -eq 0 ] || error "Cannot convert in use VDO volume \"$VDONAME\"!" ;; esac #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") verbose "Converted VDO device has logical/physical size $vdo_logicalSize/$vdo_physicalSize KiB." VDO_ALLOCATION_PARAMS=$(cat <<EOF allocation { vdo_use_compression = $(get_enabled_value_ "$vdo_compression") vdo_use_deduplication = $(get_enabled_value_ "$vdo_deduplication") vdo_use_metadata_hints=1 vdo_minimum_io_size = $vdo_logicalBlockSize vdo_block_map_cache_size_mb = $(( $(get_kb_size_with_unit_ "$vdo_blockMapCacheSize") / 1024 )) vdo_block_map_period = $vdo_blockMapPeriod vdo_use_sparse_index = $(get_enabled_value_ "$vdo_indexSparse") vdo_index_memory_size_mb = $(awk "BEGIN {print $vdo_indexMemory * 1024}") vdo_slab_size_mb = $(( $(get_kb_size_with_unit_ "$vdo_slabSize") / 1024 )) vdo_ack_threads = $vdo_ackThreads vdo_bio_threads = $vdo_bioThreads vdo_bio_rotation = $vdo_bioRotationInterval vdo_cpu_threads = $vdo_cpuThreads vdo_hash_zone_threads = $vdo_hashZoneThreads vdo_logical_threads = $vdo_logicalThreads vdo_physical_threads = $vdo_physicalThreads vdo_write_policy = $vdo_writePolicy vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") / 4 )) vdo_pool_header_size = 0 } EOF ) verbose "VDO conversion parameters: $VDO_ALLOCATION_PARAMS" verbose "Stopping VDO volume." dry "$VDO" stop $VDOCONF --name "$VDONAME" $VERB # If user has not provided '--yes', prompt before conversion if [ -z "$YES" ] && [ -z "$USE_VDO_DM_SNAPSHOT" ]; then PROMPTING=yes echo -n "$TOOL: Convert VDO device \"$DEVICE\" to VDO LV \"$VGNAME/$LVNAME\"? [y|N]: " read -r -n 1 -s ANSWER case "${ANSWER:0:1}" in y|Y ) echo "Yes" ;; * ) echo "No" ; PROMPTING=""; return 1 ;; esac PROMPTING="" YES="-y" # From now, no prompting fi # Make a backup of the existing VDO yaml configuration file [ -e "$VDO_CONFIG" ] && dry cp -a "$VDO_CONFIG" "${VDO_CONFIG}.backup" DEVICE=$FOUND case "$DM_UUID" in LVM-*) convert_lv_ "$vdo_logicalSize" ;; *) convert_non_lv_ "$vdo_logicalSize" ;; esac } ############################# # start point of this script # - parsing parameters ############################# trap "cleanup" "${SIGNALS[@]}" [ "$#" -eq 0 ] && tool_usage while [ "$#" -ne 0 ] do case "$1" in "") ;; "-f"|"--force" ) FORCE="-f" ;; "-h"|"--help" ) tool_usage ;; "-n"|"--name" ) shift; NAME=$1 ;; "-v"|"--verbose") VERB="--verbose" ;; "-y"|"--yes" ) YES="-y" ;; "--abort-after-vdo-convert"|"--abortaftervdoconvert" ) ABORT_AFTER_VDO_CONVERT=1; USE_VDO_DM_SNAPSHOT= ;; # For testing only "--dry-run"|"--dryrun" ) DRY="1" ; VERB="-v" ;; "--no-snapshot"|"--nosnapshot" ) USE_VDO_DM_SNAPSHOT= ;; "--uuid-prefix"|"--uuidprefix" ) shift; DM_UUID_PREFIX=$1 ;; # For testing only "--vdo-config"|"--vdoconfig" ) shift; VDO_CONFIG=$1 ; VDOCONF="-f $VDO_CONFIG" ;; -* ) error "Wrong argument \"$1\". (see: $TOOL --help)" ;; *) DEVICE=$1 ;; # device name does not start with '-' esac shift done [ -n "$DEVICE" ] || error "Device name is not specified. (see: $TOOL --help)" convert2lvm_
Upload File
Create Folder