Raspberry Pi + Rune Audio ::: Một trải nghiệm nghe nhạc mới

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 o_O

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:

tml3nr

Moderator
Em thử đưa scripts add nas tự động vào menu, chạy OK ạ:

Mã:
pi@xenomaipi:~ $ menu
-- Menu Config v1.4b --
  1. OpenHome Start & Enable
  2. OpenHome Stop & Disable
  3. Asset UPnP Start & Enable
  4. Asset UPnP Stop & Disable
  5. Use Tidal Hifi acc 1
  6. Use Tidal Hifi acc 2
  7. Restart xenomaipi
  8. Shutdown xenomaipi
  9. Add NAS to fstab
  10. Exit menu
9
Please input your music location: //192.168.18.2/Data/Music
Your mount point?: /mnt/NAS
Your user name?: xxx
Your password?: 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.0941819 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  6511  2744  600
  16060  10663  906  366
  32120  11023  684  354
  61320  11111  751  351
129940  10888  659  354

  best bandwidth : 10888 kB/sec

  fstab setting  : //192.168.18.2/Data/Music /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/Data/Music /mnt/NAS cifs ro,noauto,x-systemd.automount,sec=ntlm,vers=1.0,rsize=129940,cache=none,iocharset=utf8,username=xxx,password=yyy


-- Menu Config v1.4b --
  1. OpenHome Start & Enable
  2. OpenHome Stop & Disable
  3. Asset UPnP Start & Enable
  4. Asset UPnP Stop & Disable
  5. Use Tidal Hifi acc 1
  6. Use Tidal Hifi acc 2
  7. Restart xenomaipi
  8. Shutdown xenomaipi
  9. Add NAS to fstab
  10. Exit menu
10
pi@xenomaipi:~ $
 

tml3nr

Moderator
Chào cả nhà.

Tham số mount NAS ảnh hưởng tới âm thanh nhiều lắm. Em thấy thông số theo cách set tự động này có vẻ như cần phải thay đổi vài chổ.

Trước mắt thì cách test smb version hay. Nhưng những cái khác cần xem kỹ hơn.

Hiện tại em thấy như sau:

1. Các tham số cơ bản cần và nên có:

Mã:
ro,noauto,x-systemd.automount,sec=ntlm,vers=x.x,cache=none,iocharset=utf8,username=xxx,password=yyy

2. Tham số rsize:

Cái này ảnh hưởng đến âm thanh rất nhiều. Trong script của smpd, tham số này quyết định bởi kết quả test IO. Nhưng kết quả này không có lợi cho âm thanh.

rsize hiện tại theo em nên lấy theo default là rsize=16384

wsize em chưa test xem có nên đưa vào hay không và giá trị bao nhiêu.

Mã:
pi@xenomaipi:~ $ modinfo cifs
filename:  /lib/modules/4.9.80-v7+/kernel/fs/cifs/cifs.ko
version:  2.09
description:  VFS to access servers complying with the SNIA CIFS Specification e.g. Samba and Windows
license:  GPL
author:  Steve French <[email protected]>
alias:  fs-cifs
srcversion:  D013E76AE039C5575636E43
depends:
intree:  Y
vermagic:  4.9.80-v7+ SMP mod_unload modversions ARMv7 p2v8
parm:  CIFSMaxBufSize:Network buffer size (not including header). Default: 16384 Range: 8192 to 130048 (uint)
parm:  cifs_min_rcv:Network buffers in pool. Default: 4 Range: 1 to 64 (uint)
parm:  cifs_min_small:Small network buffers in pool. Default: 30 Range: 2 to 256 (uint)
parm:  cifs_max_pending:Simultaneous requests to server. Default: 32767 Range: 2 to 32767. (uint)
parm:  enable_oplocks:Enable or disable oplocks. Default: y/Y/1 (bool)

3. Các tham số cần test kỹ hơn:

Mã:
_netdev,uid=1000,gid=1000 0 0

Tạm kết luận:

Vậy trước mắt theo em nên dùng một trong 2 cách sau. Em thấy âm thanh của cách 1 có vẻ hay hơn:

Cách 1:

Mã:
//x.x.x.x/share /mnt/NAS cifs _netdev,username=xxx,password=yyy,vers=x.x,uid=1000,gid=1000,sec=ntlm,iocharset=utf8 0 0

Cách 2:

Mã:
//x.x.x.x/share /mnt/NAS cifs ro,noauto,x-systemd.automount,sec=ntlm,vers=1.0,rsize=16384,cache=none,iocharset=utf8,username=xxx,password=yyy

More info:

rsize=arg:

Default network read size (usually 16K). The client currently can not use rsize larger than CIFSMaxBufSize. CIFSMaxBufSize defaults to 16K and may be changed (from 8K to the maximum kmalloc size allowed by your kernel) at module install time for cifs.ko. Setting CIFSMaxBufSize to a very large value will cause cifs to use more memory and may reduce performance in some cases. To use rsize greater than 127K (the original cifs protocol maximum) also requires that the server support a new Unix Capability flag (for very large read) which some newer servers (e.g. Samba 3.0.26 or later) do. rsize can be set from a minimum of 2048 to a maximum of 130048 (127K or CIFSMaxBufSize, whichever is smaller)

wsize=arg:

Default network write size (default 57344) maximum wsize currently allowed by CIFS is 57344 (fourteen 4096 byte pages)

_netdev:

The filesystem resides on a device that requires network access (used to prevent the system from attempting to mount these filesystems until the network has been enabled on the system).

uid=value and gid=value:

Set the owner and group of all files. (Default: the UID and GID of the current process.)

Tham số 0 0:

Mã:
/etc/fstab

# <device>  <dir> <type> <options> <dump> <fsck>
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /  ext4  noatime  0  1
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap  defaults  0  0
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4  noatime  0  2

<dump> is checked by the dump utility. This field is usually set to 0, which disables the check.

<fsck> sets the order for filesystem checks at boot time; see fsck. For the root device it should be 1. For other partitions it should be 2, or 0 to disable checking.


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 o_O

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:

tml3nr

Moderator
Em xin báo cáo tình hình xenomaipi.

- Hiện tại anh @TuanQuynhAudio đang nghiên kiú thêm về build kernel và cơ chế output sound RT.

- Em chạy lăng quăng để tìm hướng đi cho việc play Tidal trực tiếp.

- Mong muốn lớn nhất của em là chạy được Tidal trực tiếp. Nếu như không cải thiện được âm thanh của openhome chính hãng, có thể mình phải quay về upmpdcli Tidal. Nhưng gần đây Tidal đổi api / token liên tục nên openhome upmpdcli không chạy được nữa. Trừ khi anh TQ ra tay :cool:

- Còn một cách nữa là setup bubbleupnp server lên pi làm proxy streaming Tidal, đẩy sang upnp renderer trên pi luôn. Cách này cần java.

- Anh TQ thiên về hướng dùng 1 OS cho tất cả các pi từ pi2 cho đến pi4.

- Em thấy là âm thanh của dòng jessie và stretch có vẻ hợp tiếng với pi2 / pi3 hơn. Em thiên về tách ra 2 OS. Một OS cho pi2 / pi3 và OS kia cho pi3 B+ / pi4.

Đường còn dài. Nhưng em kỳ vọng vào âm thanh của xenomai. Nó hay hơn rất nhiều so với PREEMPT_RT.

Kính báo với cả nhà ạ o_O
 
Chỉnh sửa lần cuối:

tml3nr

Moderator
Em xin báo cáo tình hình xenomaipi.

- Hiện tại anh @TuanQuynhAudio đang nghiên kiú thêm về build kernel và cơ chế output sound RT.

- Em chạy lăng quăng để tìm hướng đi cho việc play Tidal trực tiếp.

- Mong muốn lớn nhất của em là chạy được Tidal trực tiếp. Nếu như không cải thiện được âm thanh của openhome chính hãng. Có thể mình phải quay về upmpdcli. Nhưng hiện giờ Tidal đổi api nên openhome upmpdcli không chạy được nữa. Trừ khi anh TQ ra tay :cool:

- Còn một cách nữa là setup bubbleupnp server lên pi làm proxy streaming Tidal, đẩy sang upnp renderer trên pi luôn. Cách này cần java.

- Anh TQ thiên về hướng dùng 1 OS cho tất cả các pi từ pi2 cho đến pi4.

- Em thấy là âm thanh của dòng jessie và stretch có vẻ hợp tiếng với pi2 / pi3 hơn. Em thiên về tách ra 2 OS. Một OS cho pi2 / pi3 và OS kia cho pi3 B+ / pi4.

Đường còn dài. Nhưng em kỳ vọng vào âm thanh của xenomai. Nó hay hơn rất nhiều so với PREEMPT_RT.

Kính báo với cả nhà ạ o_O
Trước mắt em test cách kết hợp với bubbleupnp server + upmpdcli upnp renderer trên cùng 1 pi OK các anh ạ. Tidal play trực tiếp ngon. Java Oracle chính hãng chạy nhẹ hơn Open java nhiều.

Bước kế là chuyển sang kernel xenomai.

Nếu được thì mình chôm luôn dàn webui của moode :D

bubble-1.png


bubble-3.png


bubble-2.jpg
 
Chỉnh sửa lần cuối:

dungsin_lqd

Well-Known Member
Trước mắt em test cách kết hợp với bubbleupnp server + upmpdcli upnp renderer trên cùng 1 pi OK các anh ạ. Tidal play trực tiếp ngon. Java Oracle chính hãng chạy nhẹ hơn Open java nhiều.

Bước kế là chuyển sang kernel xenomai.

Nếu được thì mình chôm luôn dàn webui của moode :D

bubble-1.png


bubble-3.png


bubble-2.jpg
Hướng chơi này chuyên nghiệp quá bác @tml3nr nhưng em nghĩ để nắm được hết ý tưởng cách làm cách cài là vấn đề cực khó đối với đa số.
 

tml3nr

Moderator
Hướng chơi này chuyên nghiệp quá bác @tml3nr nhưng em nghĩ để nắm được hết ý tưởng cách làm cách cài là vấn đề cực khó đối với đa số.
Mình làm sẵn hết chứ anh. Mọi người chỉ down về rồi bung ra thẻ chạy thôi. Em sẽ post luôn cách làm để cho ai thích thì tự làm lấy và gia giảm theo sở thích riêng.

Em cập nhật diễn tiến là để cả nhà theo dõi và em hóng thêm ý tưởng.

Sau khi test qua vài vòng em thấy chôm webui có sẵn không có lợi. Vậy bản phát hành tiếp theo có thể sẽ như sau:

- Dùng MPD + upmpdcli + bubbleupnp server để phát Tidal trực tiếp.

- Giao diện web dùng mympd

- Có thể có spotify connect / roonbridge / asset upnp / minim server...

Nếu có asset upnp hay minim server mình chỉ cần dùng 1 app lumin cho nhạc online Tidal và nhạc offline.

- Người dùng chỉ cần chạy putty. Qua menu sẽ làm được các việc sau:

+ Chọn profile set performance phù hợp với pi đang dùng.

+ Chọn sound: boss dac / digione / usb dac

+ Add nas

+ Chọn tắt mở các dịch vụ nào muốn sử dụng

......................................

PS: Hiện tại cách phát Tidal trực tiếp bằng upmpdcli rất khó chịu do api bị thay đổi liên tục. Anh TQ đang nghiên kiú tiếp. Nhưng dù có chạy được bây giờ thì sau này chắc cũng sẽ bị đổi nữa. Do đó hướng dùng bubbleupnp server làm proxy streaming rất tiện và ổn định lâu dài.

Thí dụ menu như sau:

Mã:
-- Menu Config --
1. Set RPi CPU Profiles
2. Set DAC
3. Add NAS
4. MPD, upmpdcli start / stop
5. BubbleUPnP server start / stop
6. Spotify Connect start / stop
7. Roon Bridge start / stop
8. Asset UPnP start / stop
9. Minim server start / stop
10. Show audio services status
11. Restart xenomaipi
12. Shutdown xenomaipi
13. Exit menu
.............................
 
Chỉnh sửa lần cuối:

do_long_khach

Well-Known Member
Mình làm sẵn hết chứ anh. Mọi người chỉ down về rồi bung ra thẻ chạy thôi. Em sẽ post luôn cách làm để cho ai thích thì tự làm lấy và gia giảm theo sở thích riêng.

Em cập nhật diễn tiến là để cả nhà theo dõi và em hóng thêm ý tưởng.

Sau khi test qua vài vòng em thấy chôm webui có sẵn không có lợi. Vậy bản phát hành tiếp theo có thể sẽ như sau:

- Dùng MPD + upmpdcli + bubbleupnp server để phát Tidal trực tiếp.

- Giao diện web dùng mympd

- Có thể có spotify connect / roonbridge / asset upnp / minim server...

Nếu có asset upnp hay minim server mình chỉ cần dùng 1 app lumin cho nhạc online Tidal và nhạc offline.

- Người dùng chỉ cần chạy putty. Qua menu sẽ làm được các việc sau:

+ Chọn profile set performance phù hợp với pi đang dùng.

+ Chọn sound: boss dac / digione / usb dac

+ Add nas

+ Chọn tắt mở các dịch vụ nào muốn sử dụng

......................................

PS: Hiện tại cách phát Tidal trực tiếp bằng upmpdcli rất khó chịu do api bị thay đổi liên tục. Anh TQ đang nghiên kiú tiếp. Nhưng dù có chạy được bây giờ thì sau này chắc cũng sẽ bị đổi nữa. Do đó hướng dùng bubbleupnp server làm proxy streaming rất tiện và ổn định lâu dài.

Thí dụ menu như sau:

Mã:
-- Menu Config --
1. Set RPi CPU Profiles
2. Set DAC
3. Add NAS
4. MPD, upmpdcli start / stop
5. BubbleUPnP server start / stop
6. Spotify Connect start / stop
7. Roon Bridge start / stop
8. Asset UPnP start / stop
9. Minim server start / stop
10. Show audio services status
11. Restart xenomaipi
12. Shutdown xenomaipi
13. Exit menu
.............................
Kể mà đưa thêm được vụ phát audio của Youtube nữa thì quá tuyệt bác ạ.
 
Chỉnh sửa lần cuối:

tml3nr

Moderator
Kể mà đưa thêm được vụ phát audio của Youtube nữa thì quá tuyệt bác ạ.
Vụ YT này anh Quạt theo kỹ hơn em. Nhờ ảnh cho ý kiến chỉ đạo thêm.

Khó nhất theo em vẫn là giải quyết việc search chạy trên pi.

Về mặt âm thanh làm sao để cho pi play trực tiếp file opus 160kbps là hay nhất.

Em vẫn thiên về các cách sau:

1. Search trên PC. Rồi đẩy link opus trực tiếp sang mpd bằng cantata. Pi sẽ lấy link opus từ internet:

http://www.hdvietnam.com/posts/10063100/

youtube-mpd-05.jpg

2. Trên PC, dùng foobar + foo_youtube + UPnP MediaRenderer Output đẩy sang upnp renderer của pi:

http://www.hdvietnam.com/posts/9499698/

https://vnav.vn/posts/2301918/

youtube-to-upnp-3.png
 
Chỉnh sửa lần cuối:

valst

Member

Hi các bác, em hiện tại không dùng qua đường coax nữa, tuy nhiên thấy thích quá. Bác nào chán 2 món này thì nhượng lại em để ngắm nghía phát xem... Tks các bác!
 

linh0983

Well-Known Member
Daphile có ver mới các bác a . :D
https://www.daphile.com/
Change log :

- 2020-07-20 version 20.07 (x86_64, x86_64-rt & i486) changes:
- LMS update to 8.0 branch (Jul 11th 2020, git commit: af8ebd6).
- Support for Ogg FLAC radio stations
- WDS support to enable Samba file server discovery on Windows 10
- SquashFS system image compression switched from XZ to Zstd
- Kernel update to 4.19.132 and 4.19.132-rt59
- Daphile built with GCC 9.3
- Major component updates:
- Perl from 5.28 to 5.30 series
- Python from 3.6 to 3.7 series
- Samba from 4.10 to 4.11 series
- Glibc from 2.29 to 2.30
- Bug fixes, minor modifications and component updates

CDwk4R.jpg


CDwGR3.jpg


Nghe youtube tuyệt vời a . ( automatic ) . :oops::D:mad:
 

linh0983

Well-Known Member
Còn nữa a . :eek:
https://ropieee.org/xl/

2.566 (2020/07/25)
  • NEW: [RoPieeeXL] hardware mixer support for UPnP/DLNA, Shairport-Sync, Librespot and Squeezelite
  • IMPROV: rearrange webpage navigation for XL services
  • IMPROV: Update the Alarm Clock Extension (The Appgineer)
  • IMPROV: [RoPieeeXL] update Shairport-Sync
  • IMPROV: [RoPieeeXL] update Upmpdcli
  • IMPROV: support for IPv6
  • IMPROV: bump Linux kernel for Pi 4
  • IMPROV: bump Linux kernel for Pi 2 and 3
  • IMPROV: don’t use Ipstack for geo ip location
  • FIX: Make sure an alarm from the Alarm Clock Extension survives a reboot
CDw9wu.jpg


Giao diện mới play UPnP rất ngon các bác . :D:(:cool:
 

Thanhvo31

Well-Known Member
@linh0983
Sao dạo này webDAV Nas của bác băng thông được có 100 -900 kB/s nhỉ.
Mình đang kéo lên Gsuite mà nó báo 1week hôm qua lên 5week :(.
Mình dùng 1 con Tinker board làm node sync mà chậm quá phải tắt đi.
 

Thanhvo31

Well-Known Member
Mình cài tool này vào PCmini chơi trực tiếp từ Google Drive ngon a . :eek:
https://dl.google.com/drive-file-stream/GoogleDriveFSSetup.exe

CDUv2j.jpg


JMC streamer UPnP mượt mà nhanh a . :eek:

CDUFdd.jpg


DT scan chú nas quá chậm sáng đến giờ chưa được 100k a . :rolleyes:

CK11XN.jpg


Album này hay mời các bác nghe . :oops:

CK1iUY.jpg


Mấy chú Pi mình làm điểm cuối phát nhạc nếu scan chú nas là tịt luôn . :(
Mình theo bác @quatmo dung rclone mount hết mấy ổ Gsuite, OneDrive Webdav lên NAS hôm nào đẹp trời cũng được 10MB/s up down.
 

linh0983

Well-Known Member
DT giờ này nó scan xong chú nas a (webdav) , scan chậm như rùa khi xong chọn album nhanh phết các bác ơi . Giờ đây có thể mang bất kỳ đâu để nghe từ DT hay streamer qua UPnP hihi . o_O

CKXicZ.jpg


DT xuất ra usb hoặc streamer qua UPnP chú Pi2 cài XL hay ghê các bác chi tiết ngọt ngào a . :oops:

CKXsrE.jpg


App này mình order lâu rồi hôm nay lục lại nghe qua UPnP tuyệt vời các bác . DT Sony nghe hay âm thanh rất tĩnh ấm áp a . ( mình khoái cái hẹn giờ ) . :rolleyes:
https://play.google.com/store/apps/details?id=com.neutroncode.mp
 

tml3nr

Moderator
Em xin báo cáo tình hình xenomaipi o_O

upmpdcli + plugin tidal hiện tại rất khó do Tidal đổi token. Tidal-Media-Downloader của yaronzz hiện tại đang fail cũng vì lý do này. Anh TQ vẫn chưa bỏ cuộc. Nếu giải quyết được token thì upmpdcli + plugin tidal vẫn là tốt nhất.

Vậy hiện tại chỉ còn cách dùng bubbleupnp server là OK.

Về mô hình em test trên xenomai mọi thứ OK: mpd + upmpdcli chạy để tạo upnp renderer, bubbleupnp server start openhome làm proxy streaming.

mympd chạy tốt. Kết hợp mympd với menu bằng putty là tạm ổn cho người dùng.

Stream Tidal:

mympd-tidal.png

Play MPD:

mympd-playback.jpg

View album:

mympd-view-album.png

Browse folder tốt:

mympd-browse.png

Nhưng.....

Đời khổ vì chữ nhưng :D

Đang vướng lỗi treo bất tử khi đang chạy các anh ạ. Anh TQ và em đang mò chung quanh priority và environment của các services xem có cách nào xử lý không hix

Dù chưa thành công. Nhưng qua đợt xà quần này em thấy có rất nhiều hướng để mình customize một os có sẵn, để thêm tính năng hay cải thiện âm thanh của nó.
 
Chỉnh sửa lần cuối:

linh0983

Well-Known Member
Có bao giờ mình dùng DT nghe nhạc a ? DT mình dùng chú Sony có cấu hình như vầy :

CKDRru.jpg


Với số album gần 8000 (scan chậm chỉ 1 lần khi xong duyệt nhanh) và chọn tùy chọn như hình trên stream qua UPnP cực ngon các bác a . ( check wifi mạng nhà hàng xóm nghe ngon mượt ) . :rolleyes:

CKDLc3.jpg


Tóm lại cài app này vào DT add WebDAV mình vào (user và pass các bác đang dùng) có thể nghe bất cứ đâu tiện lợi ạ ! ( usb , dt , upnp ) . Cài đặt phát theo mẫu nguồn luôn chọn . :rolleyes:
 
Chỉnh sửa lần cuối:
Bên trên