踩坑無數!NFS服務從入門到放棄再到真香的血淚史

前言

說起NFS,我估計很多搞運維的兄弟都有一肚子話要說。這玩意兒吧,看起來簡單,用起來坑多,但是真正搞明白了又覺得挺香的。

前幾天有個朋友問我,說他們公司要搭建一個文件共享系統,問我推薦什么方案。我第一反應就是NFS,畢竟這貨在Linux環境下用了這么多年,雖然毛病不少,但勝在穩定可靠。結果這哥們兒一臉懵逼地看著我:“NFS是啥?”

好吧,看來有必要寫篇文章好好聊聊NFS了。我從2020年開始接觸這東西,到現在也算是愛恨交加了。今天就把我這些年踩過的坑和積累的經驗分享給大家。

NFS到底是個什么鬼

NFS全稱Network File System,網絡文件系統。簡單來說,就是讓你可以像訪問本地文件一樣訪問遠程服務器上的文件。聽起來很牛逼對吧?實際上原理也不復雜。

NFS的工作原理其實就是客戶端和服務端的通信。服務端把某個目錄"導出"(export),客戶端就可以把這個遠程目錄"掛載"(mount)到本地的某個掛載點上。掛載完成后,你在客戶端操作這個目錄,實際上就是在操作服務端的文件。

不過這里有個坑,NFS默認使用的是UDP協議,在網絡不穩定的環境下容易出問題。現在一般都推薦用TCP,雖然性能稍微差一點,但穩定性好很多。

搭建NFS服務的那些事兒

服務端配置

在CentOS系統上安裝NFS還是比較簡單的:

yum install -y nfs-utils rpcbind

安裝完成后需要啟動相關服務:

systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server

這里要注意一個細節,rpcbind必須先啟動,因為NFS依賴RPC服務。我之前就因為這個順序問題折騰了半天。

接下來就是配置導出目錄了,編輯/etc/exports文件:

/data/share 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
/home/backup 192.168.1.100(ro,sync,root_squash)

這個配置文件的語法看起來有點奇怪,但其實很好理解。第一行表示把/data/share目錄共享給192.168.1.0/24網段的所有主機,權限是讀寫,同步寫入,不壓縮root權限。

說到權限配置,這里面的坑可不少。no_root_squash這個選項要慎用,它允許客戶端的root用戶在NFS服務器上也有root權限。如果你的網絡環境不夠安全,這就是個巨大的安全隱患。

配置完成后,重新加載配置:

exportfs -ra

可以用exportfs -v查看當前的導出狀態。

客戶端掛載

客戶端的配置相對簡單一些,同樣需要安裝nfs-utils:

yum install -y nfs-utils

然后就可以掛載了:

mount -t nfs 192.168.1.10:/data/share /mnt/nfs

不過我建議在掛載時指定一些參數:

mount -t nfs -o tcp,rsize=32768,wsize=32768,hard,intr 192.168.1.10:/data/share /mnt/nfs

這些參數的含義:

  • tcp:使用TCP協議
  • rsize/wsize:讀寫緩沖區大小
  • hard:硬掛載,網絡中斷時會一直重試
  • intr:允許中斷

如果要開機自動掛載,可以在/etc/fstab中添加:

#添加完成一定要記得mount -a,檢查下配置是否正確!!!!
192.168.1.10:/data/share /mnt/nfs nfs tcp,rsize=32768,wsize=32768,hard,intr 0 0

性能調優這個老大難問題

NFS的性能一直是個讓人頭疼的問題。我記得有一次,業務部門抱怨說文件傳輸太慢了,讓我優化一下。當時我就想,這能有多慢?結果一測試,好家伙,傳輸速度只有幾MB/s,這在千兆網絡環境下簡直不能忍。

網絡層面的優化

網絡配置對NFS性能影響很大。我發現很多人在配置時都忽略了網絡參數的調整。

在服務端,可以增加NFS守護進程的數量:

# 編輯 /etc/sysconfig/nfs
RPCNFSDCOUNT=16

默認情況下,NFS只啟動8個守護進程,在高并發場景下明顯不夠用。我一般會根據CPU核心數來設置,比如16核的服務器就設置16個進程。

另外,網絡緩沖區的大小也很關鍵:

# 在 /etc/sysctl.conf 中添加
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216

存儲層面的考慮

NFS的性能很大程度上取決于底層存儲。如果你的服務器用的是機械硬盤,那性能肯定好不到哪里去。我之前在一個項目中,把NFS服務器的存儲從SATA硬盤換成SSD,性能提升了好幾倍。

文件系統的選擇也很重要。ext4雖然穩定,但在大文件和高并發場景下性能一般。如果條件允許,我更推薦使用XFS文件系統,特別是在處理大文件時。

掛載參數的調整

客戶端的掛載參數對性能影響也不小。我一般會這樣配置:

mount -t nfs -o tcp,rsize=65536,wsize=65536,hard,intr,timeo=14,intr 192.168.1.10:/data/share /mnt/nfs

rsize和wsize設置得大一些可以減少網絡往返次數,但也不能設置得太大,否則可能會出現網絡包分片的問題。

安全配置不能馬虎

NFS的安全性一直是個爭議話題。說實話,NFS在設計之初就沒有太多考慮安全問題,所以在使用時需要格外小心。

網絡層面的安全

最基本的安全措施就是限制訪問網段。在/etc/exports中,一定要明確指定允許訪問的IP地址或網段,千萬不要使用通配符。

我見過有人這樣配置:

/data/share *(rw,sync,no_root_squash)

這簡直就是在裸奔!任何能訪問到你服務器的主機都可以掛載你的NFS共享,而且還有root權限。

正確的做法應該是:

/data/share 192.168.1.100(rw,sync,root_squash)
/data/share 192.168.1.101(rw,sync,root_squash)

防火墻配置

NFS使用的端口比較多,除了固定的111端口(rpcbind)和2049端口(nfs)外,還有一些隨機端口。為了方便防火墻配置,可以固定這些端口。

/etc/sysconfig/nfs中添加:

RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662

然后在防火墻中開放這些端口:

firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=875/tcp
firewall-cmd --permanent --add-port=32803/tcp
firewall-cmd --permanent --add-port=32769/udp
firewall-cmd --permanent --add-port=892/tcp
firewall-cmd --permanent --add-port=662/tcp
firewall-cmd --reload

用戶權限管理

NFS的用戶權限管理是個比較復雜的話題。默認情況下,NFS會根據UID和GID來判斷用戶權限,這就要求客戶端和服務端的用戶ID必須一致。

在實際使用中,我一般會創建專門的NFS用戶:

# 在服務端和客戶端都創建相同的用戶
useradd -u 1001 nfsuser

然后把共享目錄的所有者設置為這個用戶:

chown -R nfsuser:nfsuser /data/share

故障排查的血淚經驗

搞NFS這么多年,遇到的奇葩問題不計其數。有些問題看起來很簡單,但排查起來卻讓人抓狂。

掛載失敗的常見原因

最常見的問題就是掛載失敗。每次遇到這種問題,我都會按照這個順序排查:

  1. 檢查網絡連通性
ping 192.168.1.10
telnet 192.168.1.10 2049
  1. 檢查服務狀態
systemctl status rpcbind
systemctl status nfs-server
  1. 檢查導出狀態
exportfs -v
showmount -e 192.168.1.10

有一次我遇到一個很奇怪的問題,showmount可以看到導出的目錄,但就是掛載不上。折騰了半天才發現是SELinux的問題。

setsebool -P nfs_export_all_rw 1
setsebool -P nfs_export_all_ro 1

性能問題的排查

性能問題相對比較難排查,因為影響因素太多了。我一般會從這幾個方面入手:

網絡層面,用iperf測試網絡帶寬:

# 服務端
iperf -s# 客戶端
iperf -c 192.168.1.10

存儲層面,用dd測試磁盤性能:

dd if=/dev/zero of=/data/share/testfile bs=1M count=1024

NFS層面,用nfsstat查看統計信息:

nfsstat -c  # 客戶端統
nfsstat -s  # 服務端統計

有一次我就是通過nfsstat發現了問題,客戶端的retrans(重傳)次數特別高,說明網絡有問題。后來發現是交換機的某個端口有故障。

文件鎖的詭異問題

NFS的文件鎖機制真的是讓人又愛又恨。理論上很美好,實際使用中問題一大堆。

我印象最深的一次是,有個應用程序在NFS上創建了文件鎖,結果服務器突然斷電了。重啟后,這個鎖就一直釋放不掉,導致應用程序無法正常工作。

當時試了各種方法,最后只能這樣解決:

# 停止相關服務
systemctl stop nfs-server
systemctl stop rpc-statd# 清理鎖文件
rm -rf /var/lib/nfs/sm/*
rm -rf /var/lib/nfs/sm.bak/*# 重啟服務
systemctl start rpc-statd
systemctl start nfs-server

不過這種方法比較暴力,會影響所有客戶端。在生產環境中要慎用!!!!!!!!!!!

實際應用場景的經驗分享

這么多年下來,我在不同的場景中都用過NFS,每種場景都有自己的特點和坑點。

Web服務器集群的文件共享

最常見的應用就是Web服務器集群了。多臺Web服務器需要共享靜態文件,比如圖片、CSS、JS等。

在這種場景下,我一般會這樣配置:

# 服務端導出配置
/var/www/html/static 192.168.1.0/24(ro,sync,root_squash,no_subtree_check)

注意這里用的是只讀權限,因為靜態文件一般不需要在Web服務器上修改。如果需要上傳文件,我會單獨配置一個可寫的目錄。

客戶端掛載時,我會使用這樣的參數:

mount -t nfs -o tcp,ro,rsize=32768,wsize=32768,hard,intr,noatime 192.168.1.10:/var/www/html/static /var/www/html/static

noatime參數很重要,它可以避免每次讀取文件時更新訪問時間,能顯著提升性能。

數據庫備份的存儲

另一個常見場景就是數據庫備份。我們有多臺數據庫服務器,需要把備份文件統一存儲到一個地方。

這種場景下,安全性比性能更重要:

# 服務端配置
/data/backup 192.168.1.100(rw,sync,root_squash,no_subtree_check)
/data/backup 192.168.1.101(rw,sync,root_squash,no_subtree_check)

客戶端掛載時,我會設置比較保守的參數:

mount -t nfs -o tcp,rw,rsize=8192,wsize=8192,hard,intr,timeo=30 192.168.1.10:/data/backup /backup

緩沖區設置得小一些,超時時間長一些,確保數據的完整性。

開發環境的代碼共享

在開發環境中,經常需要多個開發者共享代碼。這時候NFS就很方便了,大家都可以直接在自己的機器上編輯代碼。

不過這種場景下要注意權限問題。我一般會創建一個開發組:

groupadd -g 2000 developers

然后把所有開發者都加到這個組里,共享目錄的權限設置為組可寫:

chgrp -R developers /data/code
chmod -R g+w /data/code

NFS的替代方案思考

雖然我用NFS用了這么多年,但不得不承認,它確實有不少局限性。在某些場景下,其他方案可能更合適。

SSHFS的優勢

SSHFS基于SSH協議,安全性比NFS好很多。配置也特別簡單:

sshfs user@192.168.1.10:/data/share /mnt/sshfs

我在一些對安全性要求比較高的項目中會選擇SSHFS。雖然性能比NFS差一些,但勝在安全可靠。

分布式文件系統的崛起

現在越來越多的公司開始使用分布式文件系統,比如GlusterFS、CephFS等。這些系統在可用性和擴展性方面比NFS強很多。

我之前參與過一個項目,就是把原來的NFS系統遷移到GlusterFS。雖然遷移過程比較復雜,但遷移完成后,系統的可用性確實提升了不少。

對象存儲的興起

在云計算時代,對象存儲也是個不錯的選擇。比如AWS的S3、阿里云的OSS等。雖然訪問方式和傳統文件系統不太一樣,但在某些場景下更適合。

一些實用的小技巧

這些年積累了不少NFS使用的小技巧,分享給大家:

自動掛載的配置

手動掛載NFS比較麻煩,可以配置自動掛載。安裝autofs:

yum install -y autofs

編輯/etc/auto.master

/mnt/auto /etc/auto.nfs --timeout=60

創建/etc/auto.nfs

share -tcp,rw 192.168.1.10:/data/share

這樣,當你訪問/mnt/auto/share時,系統會自動掛載NFS。

監控腳本的編寫

NFS服務的穩定性監控很重要,我寫了個簡單的監控腳本:

#!/bin/bash
NFS_SERVER="192.168.1.10"
NFS_PATH="/data/share"
MOUNT_POINT="/mnt/nfs"if ! mountpoint -q $MOUNT_POINT; thenecho "NFS not mounted, trying to mount..."mount -t nfs $NFS_SERVER:$NFS_PATH $MOUNT_POINT
fiif ! timeout 5 ls $MOUNT_POINT > /dev/null 2>&1; thenecho "NFS access failed, remounting..."umount -f $MOUNT_POINTmount -t nfs $NFS_SERVER:$NFS_PATH $MOUNT_POINT
fi

把這個腳本加到crontab里,每分鐘執行一次,可以自動處理一些常見的NFS問題。

性能測試的方法

想要知道NFS的性能如何,可以用這個簡單的測試:

# 寫入測試
time dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=1024# 讀取測試
echo 3 > /proc/sys/vm/drop_caches  # 清理緩存
time dd if=/mnt/nfs/testfile of=/dev/null bs=1M

這個測試雖然簡單,但能大致反映NFS的性能水平。

踩過的坑和經驗教訓

說了這么多技術細節,最后想分享一些我踩過的坑,希望大家能避免。

不要忽視網絡質量

有一次,業務部門反映NFS訪問特別慢,我檢查了服務器配置、存儲性能,都沒問題。最后發現是網絡設備有問題,丟包率達到了5%。在這種網絡環境下,NFS的性能肯定好不了。

所以在部署NFS之前,一定要先測試網絡質量。

備份配置文件的重要性

還有一次,我在調整NFS配置時,不小心把/etc/exports文件搞壞了。結果所有客戶端都掛載不上了,業務直接中斷。

幸好我有備份配置文件的習慣,很快就恢復了。從那以后,我每次修改配置前都會先備份:

cp /etc/exports /etc/exports.bak.$(date +%Y%m%d)

權限問題要提前規劃

NFS的權限管理比較復雜,如果不提前規劃好,后期會很麻煩。我建議在部署之前就把用戶權限體系設計好,包括用戶ID的分配、組的設置等。

監控和告警不能少

NFS服務雖然相對穩定,但也會出現各種問題。一定要做好監控和告警,及時發現問題。

我一般會監控這些指標:

  • NFS服務的運行狀態
  • 掛載點的可用性
  • 網絡連通性
  • 磁盤空間使用率

總結

寫了這么多,感覺還有很多東西沒有涉及到。NFS這個東西,說簡單也簡單,說復雜也復雜。關鍵是要在實踐中不斷積累經驗。

我的建議是:

  1. 在內網環境下使用,不要暴露到公網
  2. 做好安全配置,不要圖省事給過大權限
  3. 根據實際場景調整性能參數
  4. 做好監控和備份,及時發現和解決問題
  5. 在高可用要求的場景下考慮其他方案

NFS雖然有這樣那樣的問題,但在合適的場景下,它依然是個不錯的選擇。特別是在中小型企業的內網環境中,NFS的簡單易用還是很有優勢的。

當然,技術在不斷發展,新的文件共享方案也在不斷涌現。我們要保持學習的心態,根據實際需求選擇最合適的方案。

希望這篇文章能幫到正在使用或者準備使用NFS的朋友們。如果你們在使用過程中遇到什么問題,或者有更好的經驗分享,歡迎在評論區交流討論!

記得關注微信公眾號@運維躬行錄,我會持續分享更多實用的運維經驗和技術干貨。如果這篇文章對你有幫助,別忘了點贊轉發,讓更多的朋友看到!
公眾號:運維躬行錄
個人博客:躬行筆記

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90768.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

矩陣譜分解的證明及計算示例

1. 矩陣譜分解的條件矩陣的譜分解&#xff08;也稱為特征分解&#xff09;是將一個矩陣分解為一系列由其特征向量和特征值構成的矩陣乘積的過程。進行譜分解的前提條件包括&#xff1a;<1.> 矩陣是可對角化的&#xff08;Diagonalizable&#xff09;&#xff0c;即矩陣存…

Leetcode 07 java

169. 多數元素 給定一個大小為 n 的數組 nums &#xff0c;返回其中的多數元素。 多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 示例 1&#xff1a; 輸入&#xff1a;nums [3,2,3] 輸出&a…

CS231n-2017 Lecture6訓練神經網絡(一)筆記

本節主要講的是模型訓練時的算法設計數據預處理&#xff1a;關于數據預處理&#xff0c;我們有常用的3個符號&#xff0c;數據矩陣X&#xff0c;假設其尺寸是&#xff0c;N是數據樣本的數量&#xff0c;D是數據的維度均值減法(Mean subtraction)&#xff1a;是預處理最常用的形…

C++ 中實現 `Task::WhenAll` 和 `Task::WhenAny` 的兩種方案

&#x1f4da; C 中實現 Task::WhenAll 和 Task::WhenAny 的兩種方案 引用&#xff1a; 拈朵微笑的花 想一番人世變換 到頭來輸贏又何妨日與夜互消長 富與貴難久長 今早的容顏老於昨晚C 標準庫異步編程示例&#xff08;一&#xff09;C TAP&#xff08;基于任務的異步編程…

【學習】Codeforces Global Round 15 C. Maximize the Intersections

題意&#xff1a;給出一個圓&#xff0c;順時針排布1~2*n&#xff0c;已知連了k條邊&#xff0c;問這個圓最好情況下有多少個線的交點&#xff0c;要求線與線之間不能有重復的連接點&#xff0c;也就是每個點只能被一條線連接 思路&#xff1a; 1.考慮沒有線的時候&#xff0…

圖論:Dijkstra算法

昨天介紹了最小生成樹的兩個算法&#xff0c;最小生成樹的兩個算法旨在求解無向有權圖中的最小代價聯通圖的問題&#xff0c;那么對于有向有權圖&#xff0c;從起點到終點的最小花費代價問題就可以用 Dijkstra 算法來解決而且Dijkstra算法可以求出來從起始點開始到所有節點的最…

WPFC#超市管理系統(2)顧客管理、供應商管理、用戶管理

超市管理系統3. 顧客管理3.1 顧客新增3.2 DataGrid樣式3.3 顧客刪除3.4 顧客修改4. 供應商管理4.1 供應商管理主界面4.2 新增供應商4.3 修改供應商5. 用戶管理5.1 用戶管理主界面5.2 新增用戶5.3 修改用戶總結3. 顧客管理 在CustomerView.xaml使用命令綁定方式添加頁面加載Loa…

Windows本地部署DeepSeek

1、Ollama1、下載Ollama安裝包https://ollama.com/download&#xff08;如果下載很慢 可以直接找我拿安裝包&#xff09;2、使用命令行安裝打開cmd 將下載的安裝包OllamaSetup.exe 放到想要安裝的目錄下。&#xff08;如果直接雙擊&#xff0c;會裝到C盤&#xff09;例如想裝到…

基于Python的新聞爬蟲:實時追蹤行業動態

引言 在信息時代&#xff0c;行業動態瞬息萬變。金融從業者需要實時了解政策變化&#xff0c;科技公司需要跟蹤技術趨勢&#xff0c;市場營銷人員需要掌握競品動向。傳統的人工信息收集方式效率低下&#xff0c;難以滿足實時性需求。Python爬蟲技術為解決這一問題提供了高效方…

阿里視頻直播解決方案VS(MediaMTX + WebRTC) 流媒體解決方案

背景&#xff1a; 公司采購了新的攝像頭&#xff0c;通過rtsp或者rtmp推流到云平臺&#xff0c;云平臺內部進行轉碼處理&#xff0c;客戶端使用HLS或HTTP-FLV播放&#xff0c;移動App可能使用HLS或私有SDK&#xff0c;超低延時則采用WebRTC。 技術選型&#xff1a; RTSP&…

day33:零基礎學嵌入式之網絡——TCP并發服務器

一、服務器1.服務器分類單循環服務器&#xff1a;只能處理一個客戶端任務的服務器并發服務器&#xff1a;可同時處理多個客戶端任務的服務器二、TCP并發服務器的構建1.如何構建&#xff1f;&#xff08;1&#xff09;多進程&#xff08;每一次創建都非常耗時耗空間&#xff0c;…

VR全景制作的流程?VR全景制作可以用在哪些領域?

VR全景制作的流程&#xff1f;VR全景制作可以用在哪些領域&#xff1f;VR全景制作&#xff1a;流程、應用與未來虛擬現實&#xff08;VR&#xff09;全景制作正迅速改變我們的感官體驗&#xff0c;使我們能夠身臨其境地探索虛擬世界&#xff0c;享受沉浸式的奇妙感受。那么&…

用LangChain重構客服系統:騰訊云向量數據庫+GPT-4o實戰

人們眼中的天才之所以卓越非凡&#xff0c;并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 目錄 一、傳統客服系統痛點與重構價值 1.1 傳統方案瓶頸分析 1.2 新方案技術突破點 二、系統架構設計&…

主要分布在腹側海馬體(vHPC)CA1區域(vCA1)的混合調諧細胞(mixed-tuning cells)對NLP中的深層語義分析的積極影響和啟示

腹側海馬體CA1區&#xff08;vCA1&#xff09;的混合調諧細胞&#xff08;mixed-tuning cells&#xff09;通過整合情感、社會關系、空間概念等多模態信息&#xff0c;形成動態的情景化語義表征&#xff0c;為自然語言處理&#xff08;NLP&#xff09;的深層語義分析提供了重要…

ESP32的ADF詳解:6. Audio Processing的API

一、Downmix 1. 核心功能 將基礎音頻流和新加入音頻流混合為單一輸出流&#xff0c;支持動態增益控制和狀態轉換。輸出聲道數與基礎音頻一致&#xff0c;新加入音頻自動轉換聲道匹配。2. 關鍵特性聲道處理 輸出聲道數 基礎音頻聲道數新加入音頻自動轉換聲道&#xff08;如立體…

Qt(基本組件和基本窗口類)

一、基本組件1. Designer設計師為什么要上來先將這個東西呢&#xff0c;這個是QT外置的設計界面的工具&#xff0c;沒啥用&#xff0c;所以了解一下。我們用的多的是QT內置的界面設計&#xff0c;只需要我們雙擊我們創建的項目的.ui文件就可以進入這個界面&#xff0c;你對界面…

docker與k8s的容器數據卷

Docker容器數據卷 特性 docker鏡像由多個只讀層疊加而成&#xff0c;啟動容器時&#xff0c;Docker會加載只讀鏡像層并在鏡像棧頂部添加一個讀寫層。如果運行中的容器修改了現有的一個已經存在的文件&#xff0c;那么該文件將會從讀寫層下面的只讀層復制到讀寫層&#xff0c;該…

自然語言處理技術應用領域深度解析:從理論到實踐的全面探索

1. 引言:自然語言處理的技術革命與應用前景 自然語言處理(Natural Language Processing,NLP)作為人工智能領域的核心分支,正在以前所未有的速度改變著我們的數字化生活。從最初的規則基礎系統到如今基于深度學習的大語言模型,NLP技術經歷了從理論探索到實際應用的深刻變…

OpenGLRender開發記錄(二): 陰影(shadowMap,PCF,PCSS)

目錄已實現功能陰影shadowMapPCFPCSS實現shadowMapPCFPCSS陰影GitHub主頁&#xff1a;https://github.com/sdpyy1 OpenGLRender:https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 已實現功能 除了上次實現IBL之外&#xff0c;項目目前新增了imGUI的渲染&#xff0c;更方便…

Linux:日志亂碼

1、Linux日志亂碼可能是XShell客戶端編碼沒設置為UTF-8引起的&#xff0c;按照以下步驟&#xff0c;設置終端格式&#xff1a;中文版&#xff1a;打開Xshell會話屬性&#xff08;文件→屬性→終端→編碼&#xff09;&#xff0c;選擇與服務器一致的編碼格式&#xff08;如UTF-8…