分类: Software

  • NAS DIY: HP ML310e Gen8 V2 + TrueNas v13

    Hardware:

    HP ML310e Gen8 V2

    Update system software with SPP gen8.1

    Update iLO4 to v2.8.1

    CPU:

    E3-1220L V3 @1.10GHz

    RAM:

    32G ECC DDR3 @1.35V / 1066MHz

    System Disk:

    32G T-Flash Card + 32G USB Disk

    Hrad disk drivers

    6 LFF SATA

    Software:

    TruenNAS – Core – 13.0 – U2

    Power Consumption

    28W ( Without hard driver )

    TCO: RMB 1326.8

    HP ML310e Gen8 V2 X1 638

    Samsung 8G 2RX8 PC3-12800E X4 397

    Intel E3-1220L V3 X1 130

    SanDisk 32GB USB3.1 CZ430 X1 35.9

    SanDisk Ultra 64GB Micro SD X1 35.9

    Toolfree MRA190 5.25=>3.5 X2 90

  • Update iLO4 to the latest version

    To have HTML5 console supported in ILO4, we must to update iLO4 to the new version on HP ML310e Gen8 V2

    Go to the HPE support center: support.hpe.com

    Search iLO4

    Select HPE Integrated Lights-Out 4 (iLO 4)

    Select Driver and Software

    Download ilO4 2.81 of Online ROM Flash Component for Windows x64 – HPE Integrated Lights-Out 4 —— cp051874.exe

    Execute the cp051874.exe under windows, extract the firmware bin file, instead of install

    Launch a browser, such as firefox, and login into the iLO4 of ML310e Gen8 V2

    Go to Administration / Firmware, select the download bin file, and updating

  • HP ML310e gen8 V2 system update

    The latest SPP for HP ML310e gen8 V2 is SPP Gen 8.1 (SPPGen81.4.iso)

    iLO4 will be updated to v2.55 by this SPP

  • Deploy draw.io app website on local LAN

    Create a new ESXi host with 2G RAM/ 20G disk, Debian 10

    # Install java JRE

    sudo apt install openjdk-11-jre
    java –version

    # Install apache ant

    wget https://downloads.apache.org/ant/binaries/apache-ant-1.10.12-bin.tar.xz
    tar xvfJ apache-ant-1.10.12-bin.tar.xz
    sudo mv apache-ant-1.10.12/ /usr/local/ant
    sudo bash -c ” cat >>/etc/profile ” << EOF
    ANT_HOME=”/usr/local/ant”
    PATH=”$PATH:/usr/local/ant/bin”
    export ANT_HOME
    export PATH
    EOF
    source /etc/profile
    ant –version

    # Install Tomcat

    sudo apt-get install tomcat9 tomcat9-admin

    http://127.0.0.1:8080/
    http://${SERVER_IP}:8080/
    ls -l /var/lib/tomcat9/webapps/ROOT/

    # Build drawio, war package

    wget https://github.com/jgraph/drawio/archive/refs/tags/v17.1.3.tar.gz
    tar xvfz v17.1.3.tar.gz
    cd drawio-17.1.3
    ( cd etc/build && ant war )

    # Install drwaio

    sudo cp build/draw.war /var/lib/tomcat9/webapps

    http://127.0.0.1:8080/draw
    http://${SERVER_IP}:8080/draw

    # Change draw as the root of tomcat

    cd /var/lib/tomcat9/webapps
    sudo rm -rf ROOT
    sudo mv draw.war ROOT.war

    http://127.0.0.1:8080
    http://${SERVER_IP}:8080

    # Change tomcat to the http default port: 80

    sudo grep 8080 /etc/tomcat9/*
    sudo sed -i “s/8080/80/g” /etc/tomcat9/server.xml

    http://127.0.0.1
    http://${SERVER_IP}

  • logname

    A utility of coreutils, which Print the name of the current user

    Posix API: getlogin

  • 无法创建 VMFS 数据存储 music – 无法更改主机配置

    Detach the disk from vmware console

    Enable vmware SSH

    ssh login

    esxcli storage core path list

    ls -ltrh /vmfs/devices/disks/

    partedUtil getptbl “/vmfs/devices/disk/t10.ATA_____WDC_WD40EFRX2D68WT0N0_________________________WD2DWCC4ENXFK993”

    partedUtil setptbl “/vmfs/devices/disk/t10.ATA_____WDC_WD40EFRX2D68WT0N0_________________________WD2DWCC4ENXFK993” msdos

  • Web audio codec guide

    https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Audio_codecs

    Type

    audio/ogg

    codecs= FLAC

    codecs= Opus

    codecs= Vorbis

    audio/mp4

    codecs= AAC

    codecs= FLAC

    codecs= mp3

    codecs= Opus

    codecs= ALAC

    audio/wave

    audio/wav

    audio/x-wav

    audio/x-pn-wav

    audio/mp3

    audio/mpeg

    audio/webm

    codecs= Opus

    codecs= Vorbis

    audio/3gpp

    audio/3gpp2

    audio/aac

    audio/flac

    audio/x-flac

    Ogg/opus is great for music over internet:

    High quality, Simple software implementation, and Free.

    but not support by iPad/iPhone

    Mp4/AAC LC is the best selection for music over internet for Apple mobile product.

    In LAN, we can select Loseloss codec:

    Android: Ogg/FLAC

    iPad/iPhone: Mp4/ALAC

  • Creating udev rule for USB DAC

    Target:

    Create a new udev rule which will:

    Stop the Jack Daemon if DAC power off

    Start the Jack Daemon if DAC power on

    Identify USB DAC Card:

    Power on USB DAC

    Check the name of USB DAC

    ls -l /proc/asound/
    lrwxrwxrwx 1 root root 5 11月 22 17:55 AUDIO -> card2
    dr-xr-xr-x 3 root root 0 11月 16 18:43 card0
    dr-xr-xr-x 4 root root 0 11月 16 18:43 card1
    dr-xr-xr-x 4 root root 0 11月 22 17:55 card2
    -r–r–r– 1 root root 0 11月 16 16:36 cards
    -r–r–r– 1 root root 0 11月 16 18:43 devices
    lrwxrwxrwx 1 root root 5 11月 16 18:43 Generic -> card0
    -r–r–r– 1 root root 0 11月 16 18:43 hwdep
    -r–r–r– 1 root root 0 11月 16 18:43 modules
    dr-xr-xr-x 2 root root 0 11月 16 18:43 oss
    -r–r–r– 1 root root 0 11月 16 18:43 pcm

    card2 is the name of DAC Card

    ls  /sys/class/sound
    card0  card2      controlC1  hwC0D0  pcmC0D3p  pcmC1D0p  pcmC2D0p
    card1  controlC0  controlC2  hwC1D0  pcmC1D0c  pcmC2D0c  timer
    
    
    

    Get the Attr List of card2

    udevadm info /sys/class/sound/card2
    P: /devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0/sound/card2
    L: 0
    E: DEVPATH=/devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0/sound/card2
    E: SUBSYSTEM=sound
    E: USEC_INITIALIZED=523137960408
    E: ID_PATH=pci-0000:00:12.0-usb-0:4:1.0
    E: ID_PATH_TAG=pci-0000_00_12_0-usb-0_4_1_0
    E: ID_FOR_SEAT=sound-pci-0000_00_12_0-usb-0_4_1_0
    E: SOUND_INITIALIZED=1
    E: ID_VENDOR_FROM_DATABASE=Actions Semiconductor Co., Ltd
    E: ID_VENDOR=ACTIONS
    E: ID_VENDOR_ENC=ACTIONS
    E: ID_VENDOR_ID=10d6
    E: ID_MODEL=USB_AUDIO
    E: ID_MODEL_ENC=USB\x20AUDIO
    E: ID_MODEL_ID=dd01
    E: ID_REVISION=0100
    E: ID_SERIAL=ACTIONS_USB_AUDIO_4512482ADF0FEEEE
    E: ID_SERIAL_SHORT=4512482ADF0FEEEE
    E: ID_TYPE=audio
    E: ID_BUS=usb
    E: ID_USB_INTERFACES=:010100:010200:030000:
    E: ID_USB_INTERFACE_NUM=00
    E: ID_USB_DRIVER=snd-usb-audio
    E: ID_ID=usb-ACTIONS_USB_AUDIO_4512482ADF0FEEEE-00
    E: SYSTEMD_WANTS=sound.target
    E: TAGS=:systemd:seat:
    
    udevadm info --path=/sys/class/sound/card2 --attribute-walk
    
    looking at device '/devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0/sound/card2':
        KERNEL=="card2"
        SUBSYSTEM=="sound"
        DRIVER==""
        ATTR{number}=="2"
        ATTR{id}=="AUDIO"
    
      looking at parent device '/devices/pci0000:00/0000:00:12.0/usb2/2-4/2-4:1.0':
        KERNELS=="2-4:1.0"
        SUBSYSTEMS=="usb"
        DRIVERS=="snd-usb-audio"
        ATTRS{supports_autosuspend}=="1"
        ATTRS{bInterfaceProtocol}=="00"
        ATTRS{authorized}=="1"
        ATTRS{bNumEndpoints}=="00"
        ATTRS{bInterfaceClass}=="01"
        ATTRS{bInterfaceNumber}=="00"
        ATTRS{bInterfaceSubClass}=="01"
        ATTRS{bAlternateSetting}==" 0"
    
      looking at parent device '/devices/pci0000:00/0000:00:12.0/usb2/2-4':
        KERNELS=="2-4"
        SUBSYSTEMS=="usb"
        DRIVERS=="usb"
        ATTRS{devpath}=="4"
        ATTRS{bDeviceProtocol}=="00"
        ATTRS{bmAttributes}=="c0"
        ATTRS{quirks}=="0x0"
        ATTRS{tx_lanes}=="1"
        ATTRS{product}=="USB AUDIO"
        ATTRS{busnum}=="2"
        ATTRS{bcdDevice}=="0100"
        ATTRS{bNumConfigurations}=="1"
        ATTRS{manufacturer}=="ACTIONS"
        ATTRS{bNumInterfaces}==" 4"
        ATTRS{bDeviceClass}=="00"
        ATTRS{configuration}==""
        ATTRS{maxchild}=="0"
        ATTRS{devnum}=="20"
        ATTRS{serial}=="4512482ADF0FEEEE"
        ATTRS{bMaxPower}=="300mA"
        ATTRS{idVendor}=="10d6"
        ATTRS{bDeviceSubClass}=="00"
        ATTRS{urbnum}=="25748"
        ATTRS{idProduct}=="dd01"
        ATTRS{version}==" 1.00"
        ATTRS{removable}=="unknown"
        ATTRS{authorized}=="1"
        ATTRS{bMaxPacketSize0}=="64"
        ATTRS{speed}=="12"
        ATTRS{rx_lanes}=="1"
        ATTRS{lATTRS{avoid_reset_quirk}=="0"
        ATTRS{bConfigurationValue}=="1"
    
      looking at parent device '/devices/pci0000:00/0000:00:12.0/usb2':
        KERNELS=="usb2"
        SUBSYSTEMS=="usb"DRIVERS=="usb"
        ATTRS{configuration}==""
        ATTRS{idProduct}=="0001"
        ATTRS{version}==" 1.10"
        ATTRS{tx_lanes}=="1"
        ATTRS{bNumInterfaces}==" 1"
        ATTRS{bDeviceClass}=="09"
        ATTRS{removable}=="unknown"
        ATTRS{authorized_default}=="1"
        ATTRS{bDeviceSubClass}=="00"
        ATTRS{interface_authorized_default}=="1"
        ATTRS{busnum}=="2"
        ATTRS{bDeviceProtocol}=="00"
        ATTRS{bMaxPower}=="0mA"
        ATTRS{quirks}=="0x0"
        ATTRS{speed}=="12"
        ATTRS{bcdDevice}=="0419"
        ATTRS{maxchild}=="5"
        ATTRS{idVendor}=="1d6b"
        ATTRS{devpath}=="0"
        ATTRS{manufacturer}=="Linux 4.19.0-9-amd64 ohci_hcd"
        ATTRS{avoid_reset_quirk}=="0"
        ATTRS{bMaxPacketSize0}=="64"
        ATTRS{rx_lanes}=="1"
        ATTRS{bmAttributes}=="e0"
        ATTRS{urbnum}=="511"
        ATTRS{bNumConfigurations}=="1"
        ATTRS{product}=="OHCI PCI host controller"
        ATTRS{serial}=="0000:00:12.0"
        ATTRS{bConfigurationValue}=="1"
        ATTRS{ltm_capable}=="no"
        ATTRS{devnum}=="1"
        ATTRS{authorized}=="1"
    
        
    
    # Get kernel prop
    udevadm monitor --kernel --property --subsystem-match=usb
    monitor will print the received events for:
    KERNEL - the kernel uevent
    
    KERNEL[1083.319560] add      /devices/pci0000:00/0000:00:12.0/usb2/2-4 (usb)
    ACTION=add
    DEVPATH=/devices/pci0000:00/0000:00:12.0/usb2/2-4
    SUBSYSTEM=usb
    DEVNAME=/dev/bus/usb/002/002
    DEVTYPE=usb_device
    PRODUCT=10d6/dd01/100
    TYPE=0/0/0
    BUSNUM=002
    DEVNUM=002
    SEQNUM=2112
    MAJOR=189
    MINOR=129

    Write your udev rule based on selected attrs

    cat /opt/local/libexec/udev/rules.d/99-AD-86d.rules

    ACTION=="add",SUBSYSTEM=="sound",ATTR{id}=="AUDIO",RUN+="/opt/local/bin/add_ad_86d.sh"
    ACTION=="remove",SUBSYSTEM=="usb",ATTRS{idVendor}=="10d6",ATTRS{idProduct}=="dd01",RUN+="/opt/local/bin/remove_ad_86d.sh"
  • Split Music Image in Debian

    Share my script used to split music image file into indivdual track of wav or flac

    OS: Debian/ununtu

    Install necessary tool:

    sudo apt-get clean

    sudo apt-get update

    sudo apt-get install -y shntool dos2unix enca flac ffmpeg

    Convert

    # output track in wav format

    sudo split.sh CDImage.wav wav

    # output track in flac format

    sudo split.sh CDImage.wav flac

    Split.sh

    #/bin/bash
    
    if [ $# -ne 2 ] && [ $# -ne 1 ]
    then
    
    echo "Usage:   sudo split.sh FILE [DECODE]"
    echo "Example: sudo split.sh CDImage wav"
    echo "         sudo split.sh CDImage flac"
    echo "         sudo split.sh CDImage.wav"
    echo "         sudo split.sh CDImage.wav flac"
    echo "         sudo split.sh CDImage"
    echo "Note:"
    echo "         The Input Audio File =   FILE.wav or FILE.flac or FILE.ape"
    echo "         DECODE               =   wav or flac (Output Audio Format)"
    echo "         The Input CUE File   =   FILE.cue"
    exit
    
    fi
    
    
    BFILE=$1
    
    if [ -f ${BFILE} ];then
      AUDIO_FILE=${BFILE}
      EXT=${BFILE##*.}
      case $EXT in
        "wav"|"WAV")
           FORMAT="wav"
           ;;
        "flac"|"FLAC")
           FORMAT="flac"
           ;;
        "ape"|"APE")
           FORMAT="ape"
           ;;
        esac
    else if [ -f $BFILE.wav ];then
           AUDIO_FILE=$BFILE.wav
           FORMAT="wav"
         else if [ -f $BFILE.flac ];then
                 AUDIO_FILE=$BFILE.flac
                 FORMAT="flac"
              else if [ -f $BFILE.ape ];then
                     AUDIO_FILE=$BFILE.ape
                     FORMAT="ape"
                   else
                     echo "Not found audio file: $1.wav or $1.flac or $1.ape "
                     echo "Exit"
                     exit
                   fi
              fi  
         fi
    fi
    
    
    if [ $# -ne 1 ];then
    DECODE=$2
    fi
    
    if [ "A${DECODE}B" = "AB" ];then
      DECODE="wav"
    fi
    
    
    if [ "A${FORMAT}B" = "AB" ];then
      FORMAT="${DECODE}"
    fi
    
    if [ "A${DECODE}B" = "AapeB" ];then
      DECODE="wav"
    fi
    
    
    echo "Audio  File   = ${AUDIO_FILE}"
    echo "Input  Format = ${FORMAT} " 
    echo "Output Format = ${DECODE} "
    
    
    if [ "$FORMAT" = "ape" ]
    then
    echo -e "First, convert ape format to ${DECODE} format, waite a minute..."
    DECODE_FILE=$BFILE.${DECODE}
    #avconv -i "$AUDIO_FILE" "$DECODE_FILE"
    ffmpeg -i "$AUDIO_FILE" "$DECODE_FILE"
    AUDIO_FILE=$DECODE_FILE
    CONVERT="true"
    FORMAT="${DECODE}"
    fi
    
    
    #if [ ! "$DECODE" = "$FORMAT" ];then
    #echo -e "First, convert ${FORMAT} format to ${DECODE} format, waite a 
    #minute..."
    #DECODE_FILE=$BFILE.${DECODE}
    #avconv -i "$AUDIO_FILE" "$DECODE_FILE"
    #ffmpeg -i "$AUDIO_FILE" "$DECODE_FILE"
    #AUDIO_FILE=$DECODE_FILE
    #CONVERT="true"
    #fi
    
    
    CUE_FILE=$BFILE.cue
    CUE_FILE_LINUX=$BFILE-linux.cue
    
    if [ ! -f ${CUE_FILE} ];then
      MY_DIR="`dirname ${BFILE}`"
      MY_NAME="`basename ${BFILE}`"
      MY_BASE="${MY_NAME%.*}"
      CUE_FILE=${MY_DIR}/${MY_BASE}.cue
      if [ ! -f ${CUE_FILE} ];then
       echo "unable to find cue file of:"
       echo "  $BFILE.cue or ${CUE_FILE} "
       exit
      fi
    fi
    
    CODE="`enca ${CUE_FILE} |grep ";"|sed "s/.*; //"`"
    echo "CODE=${CODE}"
    
    echo iconv -f "${CODE}" -t utf8 "$CUE_FILE" -o "$CUE_FILE_LINUX"
    
    iconv -f "${CODE}" -t utf8 "$CUE_FILE" -o "$CUE_FILE_LINUX"
    
    
    dos2unix "$CUE_FILE_LINUX"
    
    
    echo shntool split -t "%n-%t" -f "$CUE_FILE_LINUX" -o $DECODE "$AUDIO_FILE"
    shntool split -t "%n-%t" -f "$CUE_FILE_LINUX" -o $DECODE "$AUDIO_FILE"
    
    
    if [ "$CONVERT" = "true" ]
    then
    if [ ! "AB" = "A${DECODE_FILE}B" ];then
      if [ -f ${DECODE_FILE} ];then
       echo -e "Remove temporary flac file: $DECODE_FILE"
       rm -f "$DECODE_FILE"
      fi
    fi
    
    fi