리눅스에서 삭제된 파일을 복구하는 방법은 무엇입니까?

青灯夜游
풀어 주다: 2020-05-11 18:30:04
원래의
19193명이 탐색했습니다.

Linux에서 삭제된 파일을 복구하는 방법은 무엇입니까? 다음 기사에서는 Linux에서 삭제된 파일을 복구하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

리눅스에서 삭제된 파일을 복구하는 방법은 무엇입니까?

Linux에는 Windows와 같은 휴지통이 없습니다. 기본적으로 rm -rf *를 사용하여 파일을 검색할 수 없습니다. rm -rf *基本上文件是找不回来的。

那么问题来了:

对于linux下误删的文件,我们是否真的无法通过软件进行恢复呢?

答案当然是否定的,对于误删的文件,我们还是能通过软件恢复过来的。对于误删文件还原可以分为两种情况:

  • 一种是删除以后在进程存在删除信息

  • 一种是删除以后进程都找不到,只有借助于工具还原。

接下来以例子分别解说下两种不同的误删还原方式:

误删除文件进程还在的情况:

这种一般是有活动的进程存在持续标准输入或输出,到时文件被删除后,进程PID依旧存在。这也是有些服务器删除一些文件但是磁盘不释放的原因。

打开一个终端对一个测试文件做cat追加操作:

[root@docking ~]# echo "This is DeleteFile test." > deletefile.txt
[root@docking ~]# ls
deletefile.txt
[root@docking ~]# cat >> deletefile.txt 
Add SomeLine into deletefile for fun.
로그인 후 복사

打开另外一个终端查看这个文件可以清楚看到内容:

[root@docking ~]# ls
deletefile.txt
[root@docking ~]# cat deletefile.txt 
This is DeleteFile test.
Add SomeLine into deletefile for fun.
로그인 후 복사

此时,删除文件rm -f deletefile.txt

[root@docking ~]# rm -f deletefile.txt 
[root@docking ~]# ls
#命令查看这个目录,文件已经不存在了,那么现在我们将其恢复出来。
로그인 후 복사
  • lsof查看删除的文件进程是否还存在。

  • 如没有安装请自行yum install lsof或者apt-get install lsof

1、类似这种情况,我们可以先lsof查看删除的文件 是否还在

[root@docking ~]# lsof | grep deletefile
cat       21796          root    1w      REG              253,1        63     138860 /root/deletefile.txt (deleted)
로그인 후 복사

2、恢复cp /proc/pid/fd/1 /指定目录/文件名

进入 进程目录,一般是进入/proc/pid/fd/,针对当前情况:

[root@docking ~]# cd /proc/21796/fd
[root@docking fd]# ll
总用量 0
lrwx------ 1 root root 64 1月  18 22:21 0 -> /dev/pts/0
l-wx------ 1 root root 64 1月  18 22:21 1 -> /root/deletefile.txt (deleted)
lrwx------ 1 root root 64 1月  18 22:21 2 -> /dev/pts/0
로그인 후 복사

恢复操作:

[root@docking fd]# cp 1 ~/deletefile.txt.backup
[root@docking fd]# cat ~/deletefile.txt.backup 
This is DeleteFile test.
Add SomeLine into deletefile for fun.
로그인 후 복사

3、恢复完成。

误删除的文件进程已经不存在,借助于工具还原

准备一些文件目录

#准备一份挂载的盘
mkdir backuptest
cd backuptest
mkdir deletetest
mkdir deletetest/innerfolder
echo "Delete a folder test." > deletetest/innerfolder/deletefile.txt 

echo "tcpdump:x:172:72::/:/sbin/nologin" > tmppasswd
로그인 후 복사

最后准备的目录结构如下:

taroballs@taroballs-PC:/media/taroballs/taroballs/backuptest$ cd ..
taroballs@taroballs-PC:/media/taroballs/taroballs$ tree backuptest/
backuptest/
├── deletetest
│   └── innerfolder
│       └── deletefile.txt
└── tmppasswd

2 directories, 2 files
로그인 후 복사

现在开始删除该目录rm -rf backuptest/

taroballs@taroballs-PC:/media/taroballs/taroballs$ rm -rf backuptest/
taroballs@taroballs-PC:/media/taroballs/taroballs$  ls  -l
总用量 0
로그인 후 복사

这种情况一般是没有守护进行或者后台进程对其持续输入,所以删除就真的删除了。lsof也看不到,故需要采用工具进行恢复。

现在开始进行误删除文件的恢复。

我们采用的工具是extundelete第三方工具。恢复步骤以及注意事项如下:

  • 停止对当前分区做任何操作,防止inode被覆盖。inode被覆盖基本就告别恢复了。

  • 夸张一点讲,比如停止所在分区的服务,卸载目录所在的设备,有必要的情况下都可以断网。

  • 通过dd命令对 当前分区进行备份,防止第三方软件恢复失败导致数据丢失。

  • 适合数据非常重要的情况,这里是例子,所以就没有备份,如备份可以考虑如下方式:dd if=/path/filename of=/dev/vdc1

  • 通过umount命令,对当前设备分区卸载。或者fuser 命令umount /dev/vdb1

  • 如果提示设备busy,可以用fuser命令强制卸载:fuser -m -v -i -k ./

  • 下载第三方工具extundelete安装,搜索误删除的文件进行还原

extundelete工具安装

extundelete下载地址:http://extundelete.sourceforge.net/

wget https://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
로그인 후 복사

解压该文件tar jxvf extundelete-0.2.4.tar.bz2

若报这种错误

[root@docking ~]# tar jxvf extundelete-0.2.4.tar.bz2 
tar (child): bzip2:无法 exec: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
로그인 후 복사

则使用yum -y install bzip2进行解决

[root@docking ~]# tar jxvf extundelete-0.2.4.tar.bz2 
extundelete-0.2.4/
extundelete-0.2.4/acinclude.m4
extundelete-0.2.4/missing
extundelete-0.2.4/autogen.sh
extundelete-0.2.4/aclocal.m4
extundelete-0.2.4/configure
extundelete-0.2.4/LICENSE
extundelete-0.2.4/README
...................................................
로그인 후 복사
cd  extundelete-0.2.4
./configure
로그인 후 복사

若这步骤报错

[root@docking extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
configure: error: in `/root/extundelete-0.2.4':
configure: error: C++ compiler cannot create executables
See `config.log' for more details
로그인 후 복사

则使用yum -y install gcc-c++解决.

若执行上一步仍然报错,

[root@docking extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
configure: error: Can't find ext2fs library
로그인 후 복사

则使用yum -y install e2fsprogs e2fsprogs-devel来解决。
#Ubuntu的解决办法为sudo apt-get install e2fslibs-dev e2fslibs-dev

不出意外的话到这里应该configure能够顺利完成.

[root@docking extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
Writing generated files to disk
[root@docking extundelete-0.2.4]#
로그인 후 복사

最后make然后 make install

[root@docking extundelete-0.2.4]# make
make -s all-recursive
Making all in src
extundelete.cc: 在函数‘ext2_ino_t find_inode(ext2_filsys, ext2_filsys, ext2_inode*, std::string, int)’中:
extundelete.cc:1272:29: 警告:在 {} 内将‘search_flags’从‘int’转换为较窄的类型‘ext2_ino_t {aka unsigned int}’ [-Wnarrowing]
    buf, match_name2, priv, 0};
                             ^
[root@docking extundelete-0.2.4]# make install
Making install in src
  /usr/bin/install -c extundelete '/usr/local/bin'
로그인 후 복사

extundelete安装完成.

扫描误删除的文件:

使用df -lh查看挂载:

taroballs@taroballs-PC:~$ df -lh
文件系统        容量  已用  可用 已用% 挂载点
udev            1.9G     0  1.9G    0% /dev
tmpfs           387M  1.8M  385M    1% /run
/dev/sda2        92G   61G   26G   71% /
tmpfs           1.9G   49M  1.9G    3% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda3       104G   56G   44G   57% /home
tmpfs           387M   40K  387M    1% /run/user/1000
/dev/sda4        70G   20G   47G   30% /media/taroballs/d8423f8c-d687-4c03-a7c8-06a7fb57f96d
/dev/sdb1       6.8G  4.1G  2.8G   60% /media/taroballs/taroballs
/dev/sr0        4.0G  4.0G     0  100% /media/taroballs/2018-01-16-12-36-00-00
taroballs@taroballs-PC:~$ cd /media/taroballs/taroballs/
taroballs@taroballs-PC:/media/taroballs/taroballs$
로그인 후 복사

可以看到,我们的目录/media/taroballs/taroballs

挂载到/dev/sdb1 这个文件系统中.

umount我们的挂载盘

比如:

taroballs@taroballs-PC:~$ df -lh | grep /dev/sdb1
/dev/sdb1       6.8G  4.1G  2.8G   60% /media/taroballs/taroballs
로그인 후 복사

umount这个目录

taroballs@taroballs-PC:~$ umount /media/taroballs/taroballs
taroballs@taroballs-PC:~$ df -lh | grep /dev/sdb1
taroballs@taroballs-PC:~$ 
#记得删除一定要后umount哦,不然二次写入谁也帮不了你呢。
로그인 후 복사

通过inode节点恢复

taroballs@taroballs-PC:~$ mkdir recovertest
taroballs@taroballs-PC:~$ cd recovertest/
taroballs@taroballs-PC:~/recovertest$
로그인 후 복사

执行恢复extundelete /dev/sdb1 --inode 2

taroballs@taroballs-PC:/media/taroballs/taroballs$ sudo extundelete /dev/sdb1 --inode 2
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Group: 0
Contents of inode 2:
 
.
.省略N行
 
File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
deletetest                                        12             Deleted
tmppasswd                                            14             Deleted
로그인 후 복사

通过扫描发现了我们删除的文件夹,现在执行恢复操作。

(1)恢复单一文件tmppasswd

taroballs@taroballs-PC:~/recovertest$  extundelete /dev/sdb1 --restore-file passwd   
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
Successfully restored file tmppasswd
로그인 후 복사

恢复文件是放到了当前目录RECOVERED_FILES。

查看恢复的文件:

taroballs@taroballs-PC:~/recovertest$ cat tmppasswd 
tcpdump:x:172:72::/:/sbin/nologin
로그인 후 복사

(2)恢复目录deletetest

extundelete /dev/sdb1 --restore-directory  deletetest
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
Searching for recoverable inodes in directory deletetest ... 
5 recoverable inodes found.
Looking through the directory structure for deleted files ...
로그인 후 복사

(3)恢复所有

taroballs@taroballs-PC:~/recovertest$ extundelete /dev/sdb1 --restore-all
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
Searching for recoverable inodes in directory / ... 
5 recoverable inodes found.
Looking through the directory structure for deleted files ... 
0 recoverable inodes still lost. 
taroballs@taroballs-PC:~/recovertest$ tree 
backuptest/
├── deletetest
│   └── innerfolder
│       └── deletefile.txt
└── tmppasswd
2 directories, 2 files
로그인 후 복사

(4)恢复指定inode

taroballs@taroballs-PC:~/recovertest$ extundelete /dev/sdb1 --restore-inode 14
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
taroballs@taroballs-PC:~/recovertest$ cat file.14 
tcpdump:x:172:72::/:/sbin/nologin
#注意恢复inode的时候,恢复 出来的文件名和之前不一样,需要单独进行改名。
로그인 후 복사

最后附上extundelete

그러면 질문이 생깁니다.🎜🎜정말로 Linux에서 소프트웨어를 통해 실수로 삭제한 파일을 복구할 수 없나요?🎜🎜물론, 소프트웨어를 통해 실수로 삭제한 파일을 복구할 수는 있습니다. 실수로 삭제한 파일의 복원은 두 가지 상황으로 나눌 수 있습니다. 🎜
  • 🎜하나는 삭제 후 과정에서 삭제 정보가 있다는 것🎜
  • < li> 🎜하나는 삭제 후에는 프로세스를 찾을 수 없으며 도구를 통해서만 복원할 수 있다는 것입니다. 🎜
🎜 다음으로 실수로 삭제한 파일을 복원하는 두 가지 방법을 예를 사용하여 설명하겠습니다. 🎜🎜실수로 삭제한 파일의 프로세스가 여전히 존재하는 상황:🎜 🎜일반적으로 활성 프로세스에 대한 지속적인 표준 입력 또는 출력이 있는 경우입니다. 파일이 삭제된 후에도 프로세스 PID가 여전히 존재합니다. 이는 일부 서버에서 일부 파일을 삭제했지만 디스크가 해제되지 않는 이유이기도 합니다. 🎜🎜터미널을 열고 테스트 파일에 cat 추가 작업을 수행합니다. 🎜
$ extundelete --help
Usage: extundelete [options] [--] device-file
Options:
  --version, -[vV]       Print version and exit successfully.
  --help,                Print this help and exit successfully.
  --superblock           Print contents of superblock in addition to the rest.
                         If no action is specified then this option is implied.
  --journal              Show content of journal.
  --after dtime          Only process entries deleted on or after &#39;dtime&#39;.
  --before dtime         Only process entries deleted before &#39;dtime&#39;.Actions:
  --inode ino            Show info on inode &#39;ino&#39;.
  --block blk            Show info on block &#39;blk&#39;.
  --restore-inode ino[,ino,...]
                         Restore the file(s) with known inode number &#39;ino&#39;.
                         The restored files are created in ./RECOVERED_FILES                         with their inode number as extension (ie, file.12345).
  --restore-file &#39;path&#39;  Will restore file &#39;path&#39;. &#39;path&#39; is relative to root
                         of the partition and does not start with a &#39;/&#39;
                         The restored file is created in the current
                         directory as &#39;RECOVERED_FILES/path&#39;.
  --restore-files &#39;path&#39; Will restore files which are listed in the file &#39;path&#39;.
                         Each filename should be in the same format as an option
                         to --restore-file, and there should be one per line.
  --restore-directory &#39;path&#39;
                         Will restore directory &#39;path&#39;. &#39;path&#39; is relative to the
                         root directory of the file system.  The restored
                         directory is created in the output directory as &#39;path&#39;.
  --restore-all          Attempts to restore everything.
  -j journal             Reads an external journal from the named file.
  -b blocknumber         Uses the backup superblock at blocknumber when opening
                         the file system.
  -B blocksize           Uses blocksize as the block size when opening the file
                         system.  The number should be the number of bytes.
  --log 0                Make the program silent.
  --log filename         Logs all messages to filename.--log D1=0,D2=filename   Custom control of log messages with comma-separated
   Examples below:       list of options.  Dn must be one of info, warn, or   --log info,error      error.  Omission of the &#39;=name&#39; results in messages   --log warn=0          with the specified level to be logged to the console.
   --log error=filename  If the parameter is &#39;=0&#39;, logging for the specified
                         level will be turned off.  If the parameter is
                         &#39;=filename&#39;, messages with that level will be written
                         to filename.
   -o directory          Save the recovered files to the named directory.
                         The restored files are created in a directory
                         named &#39;RECOVERED_FILES/&#39; by default.
로그인 후 복사
로그인 후 복사
🎜다른 터미널을 열어 파일을 보면 내용을 명확하게 볼 수 있습니다. 🎜rrreee🎜이때 파일을 삭제합니다. rm -f deletefile .txt</code >🎜rrreee<ul style="list-style-type: disc;"><li>🎜lsof는 삭제된 파일 프로세스가 아직 존재하는지 확인합니다. 🎜</li><li>🎜설치되지 않은 경우 <code>yum install lsof 또는 apt-get install lsof🎜🎜1을 실행하세요. , 유사 이 경우 먼저 삭제된 파일이 아직 있는지 lsof로 확인할 수 있습니다🎜rrreee🎜2. cp /proc/pid/fd/1 /지정된 디렉터리/파일 이름
🎜🎜Enter 프로세스 디렉터리는 일반적으로 /proc/pid/fd/에 입력됩니다. 현재 상황: 🎜rrreee🎜복구 작업: 🎜rrreee🎜3. 🎜🎜실수로 삭제한 파일 프로세스는 더 이상 존재하지 않습니다. 도구를 사용하여 복원하세요.🎜🎜일부 파일 디렉터리를 준비하세요🎜rrreee🎜마지막으로 준비된 디렉터리 구조는 다음과 같습니다.🎜rrreee🎜이제 디렉터리 삭제를 시작하세요. rm -rf backuptest/🎜rrreee🎜 이런 경우에는 일반적으로 지속적으로 입력하는 데몬이나 백그라운드 프로세스가 없으므로 삭제하면 실제로 삭제됩니다. lsof도 볼 수 없으므로 복원하려면 도구를 사용해야 합니다. 🎜🎜지금 실수로 삭제한 파일 복구를 시작하세요. 🎜🎜우리가 사용하는 도구는 extundelete 타사 도구입니다. 복구 단계 및 주의 사항은 다음과 같습니다. 🎜
  • 🎜inode를 덮어쓰는 것을 방지하려면 현재 파티션에서 모든 작업을 중지하세요. inode를 덮어쓰면 기본적으로 복원된다. 🎜
  • 🎜예를 들어 과장하려면 파티션이 있는 파티션의 서비스를 중지하고 디렉터리가 있는 장치를 제거하고 필요한 경우 네트워크 연결을 끊습니다. 🎜
  • 🎜타사 소프트웨어 복구 실패로 인한 데이터 손실을 방지하려면 dd 명령을 사용하여 현재 파티션을 백업하세요. 🎜
  • 🎜데이터가 매우 중요한 상황에 적합합니다. 여기에는 백업이 없으므로 다음 방법을 고려할 수 있습니다. dd if=/path/filename of=/ dev/vdc1🎜
  • 🎜umount 명령을 사용하여 현재 장치 파티션을 마운트 해제하세요. 또는 umount /dev/vdb1🎜
  • 🎜퓨저 명령을 사용하세요. 장치가 사용 중이라는 메시지가 표시되면 퓨저 명령을 사용하여 강제로 제거할 수 있습니다.fuser -m -v -i -k ./🎜
  • 🎜타사 도구 extundelete 설치 다운로드, 실수로 삭제한 파일 검색하여 복원 🎜
🎜extundelete 도구 설치🎜🎜extundelete 다운로드 주소: http ://extundelete.sourceforge.net/🎜 rrreee🎜tar jxvf extundelete-0.2.4.tar.bz2🎜🎜이 오류가 보고되면🎜rrreee🎜 파일을 추출하고 yum -을 사용하세요. y install bzip2를 사용하여 문제를 해결하세요🎜 rrreeerrreee🎜이 단계에서 오류가 보고되면🎜rrreee🎜, yum -y install gcc-c++를 사용하여 문제를 해결하세요. 🎜🎜 이전 단계를 실행한 후에도 여전히 보고되는 경우 🎜rrreee🎜yum -y install e2fsprogs e2fsprogs -devel을 사용하여 문제를 해결하세요.
#Ubuntu의 솔루션은 sudo apt-get install e2fslibs-dev e2fslibs-dev입니다.🎜🎜예기치 못한 일이 발생하지 않으면 여기에서 구성을 성공적으로 완료할 수 있습니다.🎜rrreee🎜마지막으로 make 그런 다음 make install🎜rrreee🎜extundelete 설치가 완료됩니다.🎜🎜실수로 삭제된 파일 검사:🎜🎜df -lh 사용 마운트 보기: 🎜rrreee🎜우리 디렉토리 /media/taroballs/taroballs🎜🎜가 파일 시스템 /dev/sdb1.🎜🎜마운트 디스크 마운트 해제🎜🎜에 마운트된 것을 볼 수 있습니다. 예: 🎜rrreee🎜이 디렉토리를 마운트하세요🎜rrreee🎜inode 노드를 통해 복원🎜rrreee🎜복구 수행 extundelete /dev/sdb1 --inode 2🎜rrreee🎜스캔을 통해 발견되었습니다. 폴더를 삭제하고 이제 복구 작업을 수행하세요. 🎜🎜(1) 단일 파일 복원 tmppasswd🎜rrreee🎜복구된 파일은 현재 디렉터리 RECOVERED_FILES에 저장됩니다. 🎜🎜복구된 파일 보기: 🎜rrreee🎜 (2) 디렉터리 복구 deletetest🎜rrreee🎜 (3) 모두 복구 🎜rrreee🎜 (4) 지정된 inode 복구🎜rrreee🎜마지막으로 extundelete의 사용법은 다음과 같습니다. 첨부: 🎜
$ extundelete --help
Usage: extundelete [options] [--] device-file
Options:
  --version, -[vV]       Print version and exit successfully.
  --help,                Print this help and exit successfully.
  --superblock           Print contents of superblock in addition to the rest.
                         If no action is specified then this option is implied.
  --journal              Show content of journal.
  --after dtime          Only process entries deleted on or after &#39;dtime&#39;.
  --before dtime         Only process entries deleted before &#39;dtime&#39;.Actions:
  --inode ino            Show info on inode &#39;ino&#39;.
  --block blk            Show info on block &#39;blk&#39;.
  --restore-inode ino[,ino,...]
                         Restore the file(s) with known inode number &#39;ino&#39;.
                         The restored files are created in ./RECOVERED_FILES                         with their inode number as extension (ie, file.12345).
  --restore-file &#39;path&#39;  Will restore file &#39;path&#39;. &#39;path&#39; is relative to root
                         of the partition and does not start with a &#39;/&#39;
                         The restored file is created in the current
                         directory as &#39;RECOVERED_FILES/path&#39;.
  --restore-files &#39;path&#39; Will restore files which are listed in the file &#39;path&#39;.
                         Each filename should be in the same format as an option
                         to --restore-file, and there should be one per line.
  --restore-directory &#39;path&#39;
                         Will restore directory &#39;path&#39;. &#39;path&#39; is relative to the
                         root directory of the file system.  The restored
                         directory is created in the output directory as &#39;path&#39;.
  --restore-all          Attempts to restore everything.
  -j journal             Reads an external journal from the named file.
  -b blocknumber         Uses the backup superblock at blocknumber when opening
                         the file system.
  -B blocksize           Uses blocksize as the block size when opening the file
                         system.  The number should be the number of bytes.
  --log 0                Make the program silent.
  --log filename         Logs all messages to filename.--log D1=0,D2=filename   Custom control of log messages with comma-separated
   Examples below:       list of options.  Dn must be one of info, warn, or   --log info,error      error.  Omission of the &#39;=name&#39; results in messages   --log warn=0          with the specified level to be logged to the console.
   --log error=filename  If the parameter is &#39;=0&#39;, logging for the specified
                         level will be turned off.  If the parameter is
                         &#39;=filename&#39;, messages with that level will be written
                         to filename.
   -o directory          Save the recovered files to the named directory.
                         The restored files are created in a directory
                         named &#39;RECOVERED_FILES/&#39; by default.
로그인 후 복사
로그인 후 복사

推荐:《linux教程

위 내용은 리눅스에서 삭제된 파일을 복구하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿