tml3nr
Moderator
Báo cáo với cả nhà là em đã chôm và mod được cách add nas tự động vào trong fstab bằng script rồi. Chạy ngon ạ. Sau này mình sẽ đưa vào menu luôn.
Script này check được version của smb và xác định rsize bằng cách test speed IO.
Em chôm của dev paparius@smpd . Many thanks to paparius
Em mod lại để cho dễ dùng với nhiều tình huống khác nhau.
Cần chuẩn bị các bước sau:
1. Install fio:
sudo apt-get fio
2. Thêm # NAS Setting vào cuối file /etc/fstab":
Script sau khi chạy sẽ xóa và chèn tham số mount nas vào bên dưới dòng này:
3. Tạo file fio.conf:
sudo nano /opt/scripts/fio.conf
4. Tạo file nasmount.sh:
sudo nano /opt/scripts/nasmount.sh
sudo chmod 775 /opt/scripts/nasmount.sh
Cách dùng:
Chạy lệnh với 4 biến: nas / mount point / user / password
Foder share không nên có khoảng trắng. Nếu share path có khoảng trắng thì dùng \040
Thí dụ: //x.x.x.x/nhac viet sẽ là //x.x.x.x/nhac\040viet
sudo reboot
Vậy là xong ạ.
Test run:
Reboot và kiểm tra lại:
Script này check được version của smb và xác định rsize bằng cách test speed IO.
Em chôm của dev paparius@smpd . Many thanks to paparius
Em mod lại để cho dễ dùng với nhiều tình huống khác nhau.
Cần chuẩn bị các bước sau:
1. Install fio:
sudo apt-get fio
2. Thêm # NAS Setting vào cuối file /etc/fstab":
Script sau khi chạy sẽ xóa và chèn tham số mount nas vào bên dưới dòng này:
Mã:
# NAS Setting
3. Tạo file fio.conf:
sudo nano /opt/scripts/fio.conf
Mã:
[global]
direct=1
size=9800k
numjobs=1
invalidate=1
ioengine=mmap
[Seq-Read]
rw=read
4. Tạo file nasmount.sh:
sudo nano /opt/scripts/nasmount.sh
Mã:
#!/bin/bash
#####################
# nasmount.sh v1.2
#####################
echo " Unmounted first..."
umount /var/lib/mpd/music/NAS
umount /mnt/NAS
umount /mnt/MPD
echo ""
echo " IO Testing..."
LOG=/opt/scripts/.nas_setting.log
# work dir
dst=/tmp/cifsdst
mkdir $dst
# detect protocol
mpnt=`echo $2 | tr -d " "`
user=`echo $3 | tr -d " "`
pass=`echo $4 | tr -d " "`
opt="cache=none,iocharset=utf8,username=$user,password=$pass"
echo " Updating fstab start!!" > $LOG
hst=`echo $1 | sed -E 's/^\/\/([^/]+).+/\1/g'`
echo " Checking ping reply to ${hst}" >> $LOG
/bin/ping -c 1 -W 1 ${hst} > /dev/null
if [ ! $? = 0 ]; then
echo " !!!${hst} has not reply via ipv4" >> $LOG
echo " Checking via ipv6" >> $LOG
/bin/ping6 -c 1 -W 1 ${hst} > /dev/null
if [ ! $? = 0 ]; then
echo " !!!${hst} has not reply via ipv6" >> $LOG
echo "!!!Aborting the process!!!" >> $LOG
echo "check succeeded" >> $LOG
exit 1
fi
fi
echo "" >> $LOG
echo " Checking cifs security mode and protocol version" >> $LOG
exopt=""
declare -a aver=("1.0" "2.0" "2.1" "3.0")
for e in ${aver[@]}; do
mount -t cifs $1 $dst -o $opt,sec=ntlm,vers=${e} >/dev/null 2>&1
if [ $? = 0 ]; then
exopt=sec\=ntlm,vers\=${e}
umount $dst
fi
mount -t cifs $1 $dst -o $opt,sec=ntlmssp,vers=${e} >/dev/null 2>&1
if [ $? = 0 ]; then
exopt=sec\=ntlmssp,vers\=${e}
umount $dst
fi
done
if [ "$exopt" = "" ]; then
echo " !!!Can not resolve the security mode or protocol version." >> $LOG
echo " Aborting the process!!!" >> $LOG
echo " check succeeded" >> $LOG
rmdir $dst
exit 1
fi
echo " security mode and protocol version: $exopt" >> $LOG
exopt=,$exopt
sync
# detect best rsize prepare
declare -a arsize=("7300" "16060" "32120" "61320" "129940")
fioconf=/opt/scripts/fio.conf
testfile=
bestrsize=
bestbw=0
bestctx=1000000
declare -a arsize2=()
declare -a abw=()
declare -a alatency=()
declare -a actx=()
declare -a amajf=()
declare -a aminf=()
mount -t cifs $1 $dst -o $opt,$exopt,wsize=4096 >/dev/null 2>&1
dd of=$dst/rsize_test_dummy bs=4k count=0 seek=2500
sync
umount $dst
echo "" >> $LOG
echo " Checking best rsize" >> $LOG
echo "" >> $LOG
echo " rsize BW CTX latency" >> $LOG
for e in ${arsize[@]}; do
mount -t cifs $1 $dst -o ro,$opt,$exopt,rsize=${e} >/dev/null 2>&1
# fio start
out=`fio --readonly -filename="$dst/rsize_test_dummy" --output-format=terse $fioconf | cut -d';' -f7,8,16,90,91,92`
#echo "RSIZE ${e}:$out" >> $LOG
# detect best rsize
bw=`echo $out|cut -d';' -f1`
latency=`echo $out|cut -d';' -f3|cut -d'.' -f1`
ctx=`echo $out|cut -d';' -f4`
majf=`echo $out|cut -d';' -f5`
minf=`echo $out|cut -d';' -f6`
arsize2+=( ${e} )
abw+=( $bw )
alatency+=( $latency )
actx+=( $ctx )
amajf+=( $majf )
aminf+=( $minf )
printf "%7d %8d %6d %8d\n" ${e} $bw $ctx $latency >> $LOG
if [ $bw -gt $bestbw ];then
bestbw=$bw
bestrsize=${e}
fi
sudo umount $dst
done
i=0
#echo "rsize bw lat ctx majf minf" >> $LOG
for e in ${arsize2[@]}; do
count=0
for ((ibw = 0; ibw < ${#abw[@]}; ibw++)){
if [ ${abw[i]} -lt ${abw[ibw]} ];then
let count++
fi
}
if [ $count -lt 3 ];then
count=0
for ((ilat = 0; ilat < ${#alatency[@]}; ilat++)){
if [ ${alatency[i]} -gt ${alatency[ilat]} ];then
let count++
fi
}
if [ $count -lt 3 ];then
count=0
for ((ictx = 0; ictx < ${#actx[@]}; ictx++)){
if [ ${actx[i]} -gt ${actx[ictx]} ];then
let count++
fi
}
if [ $count -lt 3 ];then
if [ "$bestbw" = "" ];then
bestctx=${actx[i]}
bestbw=${abw[i]}
bestrsize=",rsize=${e}"
elif [ ${actx[i]} -lt $bestctx ];then
bestctx=${actx[i]}
bestbw=${abw[i]}
bestrsize=",rsize=${e}"
fi
fi
fi
fi
#echo "${e} ${abw[i]} ${alatency[i]} ${actx[i]} ${amajf[i]} ${aminf[i]}" >> $LOG
let i++
done
# clean up
mount -t cifs $1 $dst -o $opt,$exopt,rsize=4096 >/dev/null 2>&1
rm "$dst/rsize_test_dummy"
umount $dst
rmdir $dst
# edit fstab
target=/etc/fstab
nas="$1 $2 cifs ro,noauto,x-systemd.automount$exopt$bestrsize,$opt"
echo "" >> $LOG
echo " best bandwidth : $bestbw kB/sec" >> $LOG
echo "" >> $LOG
echo " fstab setting : $nas" >> $LOG
sed -i.bak -e "/# NAS Setting/{n;d}" $target
sed -i -e "/# NAS Setting/a $nas" $target
sync
echo " Restarting OS and mounting NAS with new setting" >> $LOG
mount -a
mountpoint $mpnt
ret=$?
echo "" >> $LOG
echo "NAS setting succeeded" >> $LOG
sleep 2
echo ""
echo " Job report:"
cat $LOG
echo ""
echo "Check fstab:"
echo ""
cat /etc/fstab
exit $ret
sudo chmod 775 /opt/scripts/nasmount.sh
Cách dùng:
Chạy lệnh với 4 biến: nas / mount point / user / password
Foder share không nên có khoảng trắng. Nếu share path có khoảng trắng thì dùng \040
Thí dụ: //x.x.x.x/nhac viet sẽ là //x.x.x.x/nhac\040viet
Mã:
sudo /opt/scripts/nasmount.sh //x.x.x.x/share /mnt/NAS xxx yyy
sudo reboot
Vậy là xong ạ.
Test run:
Mã:
pi@xenomaipi:~ $ sudo /opt/scripts/nasmount.sh //192.168.18.2/share /mnt/NAS xxx yyy
Unmounted first...
umount: /var/lib/mpd/music/NAS: not mounted.
umount: /mnt/NAS: not mounted.
umount: /mnt/MPD: no mount point specified.
IO Testing...
0+0 records in
0+0 records out
0 bytes copied, 0.108174 s, 0.0 kB/s
/mnt/NAS is not a mountpoint
Job report:
Updating fstab start!!
Checking ping reply to 192.168.18.2
Checking cifs security mode and protocol version
security mode and protocol version: sec=ntlm,vers=1.0
Checking best rsize
rsize BW CTX latency
7300 6464 2474 608
16060 10560 886 370
32120 10961 836 351
61320 10961 746 355
129940 10925 729 356
best bandwidth : 10925 kB/sec
fstab setting : //192.168.18.2/share /mnt/NAS cifs ro,noauto,x-systemd.automount,sec=ntlm,vers=1.0,rsize=129940,cache=none,iocharset=utf8,username=xxx,password=yyy
Restarting OS and mounting NAS with new setting
NAS setting succeeded
Check fstab:
proc /proc proc defaults 0 0
PARTUUID=738a4d67-01 /boot vfat defaults 0 2
PARTUUID=738a4d67-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
# NAS Setting
//192.168.18.2/share /mnt/NAS cifs ro,noauto,x-systemd.automount,sec=ntlm,vers=1.0,rsize=129940,cache=none,iocharset=utf8,username=xxx,password=yyy
Reboot và kiểm tra lại:
Mã:
pi@xenomaipi:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 3.5G 1.8G 1.6G 55% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 6.5M 482M 2% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 64M 189M 26% /boot
tmpfs 98M 0 98M 0% /run/user/1000
//192.168.18.2/share 1.9T 1.7T 141G 93% /mnt/NAS
Chỉnh sửa lần cuối: