Làm thế nào để sửa lỗi Bacula lỗi 2902 Lưu trữ xấu?


3

Kịch bản: Máy chủ tự sao lưu tốt. Đã thử thêm một trình nền tập tin trên một máy tính khác, máy trạm của tôi và công việc không thành công với lỗi "2902 Bộ nhớ xấu". Nhật ký cũng cung cấp một liên kết đến tài liệu bacula liên quan đến mật khẩu nhưng tôi nghĩ rằng cấu hình của tôi đã tuân theo các quy tắc được đặt ở đó.

daemon máy chủ

giám đốc

#
# Default Bacula Director Configuration file
#
#  The only thing that MUST be changed is to add one or more
#   file or directory names in the Include directive of the
#   FileSet resource.
#
#  For Bacula release 5.2.12 (12 September 2012) -- gentoo 
#
#  You might also want to change the default email address
#   from root to your address.  See the "mail" and "operator"
#   directives in the Messages resource.
#

Director {                            # define myself
  Name = castellan-dir
  DIRport = 9101                # where we listen for UA connections
  QueryFile = "/usr/libexec/bacula/query.sql"
  WorkingDirectory = "/var/lib/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 1
  Password = "GRek4WPD2RlNGkdzhW00zyA6Xg2FU/fFMVP2eQyWEzi6"         # Console password
  Messages = Daemon
}

JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Incremental
  Client = castellan-fd 
#  FileSet = "Full Set"
  Schedule = "WeeklyCycle"
  Storage = MainBackupArray
  Messages = Standard
  Pool = File
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"

  RunScript {
    RunsWhen = Before
    FailJobOnError = No
    RunsOnClient = No
    Command = "/bin/mount /dev/md4"
  }
  RunScript {
    RunsWhen = After
    RunsOnSuccess = Yes
    RunsOnFailure = Yes
    RunsOnClient = No
    Command = "/bin/umount /dev/md4"
  }

}


#
# Define the main nightly save backup job
#   By default, this job will back up to disk in /tmp
Job {
  Name = "BackupCastellan"
  JobDefs = "DefaultJob"
  FileSet = "Full Set"
}

Job {
  Name = "BackupLiege"
  JobDefs = "DefaultJob"
  Client = liege-fd
  FileSet = "LiegeFullset"
}

#Job {
#  Name = "BackupClient2"
#  Client = castellan2-fd
#  JobDefs = "DefaultJob"
#}

# Backup the catalog database (after the nightly save)
Job {
  Name = "BackupCatalog"
  JobDefs = "DefaultJob"
  Level = Full
  FileSet = "Catalog"
  Schedule = "WeeklyCycleAfterBackup"
  # This creates an ASCII copy of the catalog
  # Arguments to make_catalog_backup.pl are:
  #  make_catalog_backup.pl <catalog-name>
  RunBeforeJob = "/usr/libexec/bacula/make_catalog_backup.pl MyCatalog"
  # This deletes the copy of the catalog
  RunAfterJob  = "/usr/libexec/bacula/delete_catalog_backup"
  Write Bootstrap = "/var/lib/bacula/%n.bsr"
  Priority = 11                   # run after main backup
}

#
# Standard Restore template, to be changed by Console program
#  Only one such job is needed for all Jobs/Clients/Storage ...
#
Job {
  Name = "RestoreFiles"
  Type = Restore
  Client = castellan-fd                 
  FileSet = "Full Set"                  
  Storage = MainBackupArray
  Pool = Default
  Messages = Standard
  Where = /tmp/bacula-restores

  RunScript {
    RunsWhen = Before
    FailJobOnError = No
    RunsOnClient = No
    Command = "/bin/mount /dev/md4"
  }
  RunScript {
    RunsWhen = After
    RunsOnSuccess = Yes
    RunsOnFailure = Yes
    RunsOnClient = No
    Command = "/bin/umount /dev/md4"
  }

}


# List of files to be backed up
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
      compression=gzip
    }
    File = /
    File = /boot
    File = /var
  }

  Exclude {
    File = /dev
    File = /var/lib/bacula
    File = /proc
    File = /mnt
    File = /media
    File = /.journal
    File = /.fsck
    File = /var/lib/minecraft/wholebackups
    File = /var/lib/minecraft/backups
    File = /var/nas/live_torrents
  }
}

FileSet {
  Name = "LiegeFullset"
  Include {
    Options {
      signature = MD5
      compression=gzip
    }
    File = "C:/" 
  }

  Exclude {
    File = "C:/Temp"
  }
}




#
# When to do the backups, full backup on first sunday of the month,
#  differential (i.e. incremental since full) every other sunday,
#  and incremental backups other days
Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sun at 2:05
  Run = Differential 2nd-5th sun at 2:05
  Run = Incremental mon-sat at 2:05
}

# This schedule does the catalog. It starts after the WeeklyCycle
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 4:00
}

# This is the backup of the catalog
FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/lib/bacula/bacula.sql"
  }
}

# Client (File Services) to backup
Client {
  Name = castellan-fd
  Address = castellan
  FDPort = 9102
  Catalog = MyCatalog
  Password = "PeVkZSMSO/rvermyd0shMYfTGg70P3gB2YBdkXcEwDdE"          # password for FileDaemon
  File Retention = 2 months            # 30 days
  Job Retention = 12 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

# Client (File Services) to backup
Client {
  Name = liege-fd
  Address = liege
  FDPort = 9102
  Catalog = MyCatalog
  Password = "vZwrnQRZanw4q8BE3BEraGsc9UQnehYHNyvirP1fhURU"      # password for FileDaemon
  File Retention = 2 months            # 30 days
  Job Retention = 12 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

#
# Second Client (File Services) to backup
#  You should change Name, Address, and Password before using
#
#Client {
#  Name = castellan2-fd                
#  Address = castellan2
#  FDPort = 9102
#  Catalog = MyCatalog
#  Password = "PeVkZSMSO/rvermyd0shMYfTGg70P3gB2YBdkXcEwDdE2"         # password for FileDaemon 2
#  File Retention = 30 days            # 30 days
#  Job Retention = 6 months            # six months
#  AutoPrune = yes                     # Prune expired Jobs/Files
#}


# Definition of file storage device
Storage {
  Name = MainBackupArray
# Do not use "localhost" here    
  Address = 192.168.10.192                # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "3Yzd6Ohb5GMWfMZx8GJbQNf06BSV3WpMQK3Tl3tTsil2"
  Device = MainBackupArray
  Media Type = File
}



# Definition of DDS tape storage device
#Storage {
#  Name = DDS-4    
#  Do not use "localhost" here
#  Address = castellan                # N.B. Use a fully qualified name here
#  SDPort = 9103
#  Password = "3Yzd6Ohb5GMWfMZx8GJbQNf06BSV3WpMQK3Tl3tTsil2"          # password for Storage daemon
#  Device = DDS-4                      # must be same as Device in Storage daemon
#  Media Type = DDS-4                  # must be same as MediaType in Storage daemon
#  Autochanger = yes                   # enable for autochanger device
#}

# Definition of 8mm tape storage device
#Storage {
#  Name = "8mmDrive"
#  Do not use "localhost" here
#  Address = castellan                # N.B. Use a fully qualified name here
#  SDPort = 9103
#  Password = "3Yzd6Ohb5GMWfMZx8GJbQNf06BSV3WpMQK3Tl3tTsil2"
#  Device = "Exabyte 8mm"
#  MediaType = "8mm"
#}

# Definition of DVD storage device
#Storage {
#  Name = "DVD"
#  Do not use "localhost" here
#  Address = castellan                # N.B. Use a fully qualified name here
#  SDPort = 9103
#  Password = "3Yzd6Ohb5GMWfMZx8GJbQNf06BSV3WpMQK3Tl3tTsil2"
#  Device = "DVD Writer"
#  MediaType = "DVD"
#}


# Generic catalog service
Catalog {
  Name = MyCatalog
# Uncomment the following line if you want the dbi driver
# dbdriver = "dbi:mysql"; dbaddress = 127.0.0.1; dbport =  
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "GMWfMZx8GJbQNf06BSV3WpMQK3Tl3tTsil2"
}

# Reasonable message delivery -- send most everything to email address
#  and to the console
Messages {
  Name = Standard
#
# NOTE! If you send to two email or more email addresses, you will need
#  to replace the %r in the from field (-f part) with a single valid
#  email address in both the mailcommand and the operatorcommand.
#  What this does is, it sets the email address that emails would display
#  in the FROM field, which is by default the same email as they're being
#  sent to.  However, if you send email to more than one address, then
#  you'll have to set the FROM address manually, to a single address. 
#  for example, a 'no-reply@mydomain.com', is better since that tends to
#  tell (most) people that its coming from an automated source.

#
  mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<bacula@aehdev.com\>\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<bacula@aehdev.com\>\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = aeheathc@gmail.com = all, !skipped            
  operator = aeheathc@gmail.com = mount
  console = all, !skipped, !saved
#
# WARNING! the following will create a file that you must cycle from
#          time to time as it will grow indefinitely. However, it will
#          also keep all your messages if they scroll off the console.
#
  append = "/var/log/bacula/working/bacula.log" = all, !skipped
  catalog = all
}


#
# Message delivery for daemon messages (no job).
Messages {
  Name = Daemon
  mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = aeheathc@gmail.com = all, !skipped            
  console = all, !skipped, !saved
  append = "/var/log/bacula/working/bacula.log" = all, !skipped
}

# Default pool definition
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 2 days         # one year
}

# File Pool definition
Pool {
  Name = File
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 2 days         # one year
  Maximum Volume Bytes = 100G          # Limit Volume size to something reasonable
  Maximum Volumes = 1000               # Limit number of Volumes in Pool
  LabelFormat = "Vol"
}


# Scratch pool definition
Pool {
  Name = Scratch
  Pool Type = Backup
}

#
# Restricted console used by tray-monitor to get the status of the director
#
Console {
  Name = castellan-mon
  Password = "4BcHoJRAOkZJlMf8wm6s11ZoAfwYYpefAnMstlzfUj7h"
  CommandACL = status, .status
}

tập tin

#
# Default  Bacula File Daemon Configuration file
#
#  For Bacula release 5.2.13 (19 February 2013) -- gentoo 
#
# There is not much to change here except perhaps the
# File daemon Name to
#

#
# List Directors who are permitted to contact this File daemon
#
Director {
  Name = castellan-dir
  Password = "PeVkZSMSO/rvermyd0shMYfTGg70P3gB2YBdkXcEwDdE"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the file daemon
#
Director {
  Name = castellan-mon
  Password = "QEN/69pxCIYQ9GOvJK+XL1VGLl8ovRxfSMOe1Kt2Q/Fp"
  Monitor = yes
}

#
# "Global" File daemon configuration specifications
#
FileDaemon {                          # this is me
  Name = castellan-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
}

# Send all messages except skipped files back to Director
Messages {
  Name = Standard
  director = castellan-dir = all, !skipped, !restored
}

lưu trữ

#
# Default Bacula Storage Daemon Configuration file
#
#  For Bacula release 5.2.12 (12 September 2012) -- gentoo 
#
# You may need to change the name of your tape drive
#   on the "Archive Device" directive in the Device
#   resource.  If you change the Name and/or the 
#   "Media Type" in the Device resource, please ensure
#   that dird.conf has corresponding changes.
#

Storage {                             # definition of myself
  Name = castellan-sd
  SDPort = 9103                  # Director's port      
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
}

#
# List Directors who are permitted to contact Storage daemon
#
Director {
  Name = castellan-dir
  Password = "3Yzd6Ohb5GMWfMZx8GJbQNf06BSV3WpMQK3Tl3tTsil2"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the storage daemon
#
Director {
  Name = castellan-mon
  Password = "uA1iI8Vxirh+JZc7zPTengOQt978CG3F6V3MNI/I2Sbi"
  Monitor = yes
}

#
# Note, for a list of additional Device templates please
#  see the directory <bacula-source>/examples/devices
# Or follow the following link:
#  http://bacula.svn.sourceforge.net/viewvc/bacula/trunk/bacula/examples/devices/
#

#
# Devices supported by this Storage daemon
# To connect, the Director's bacula-dir.conf must have the
#  same Name and MediaType. 
#

Device {
  Name = MainBackupArray
  Media Type = File
  Archive Device = /mnt/backup/main
  LabelMedia = yes;                   # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes;               # when device opened, read it
  Requires Mount = no;
  RemovableMedia = no;
  AlwaysOpen = no;
  #Mount Command = "/bin/mount /dev/md4";
  #Unmount Command = "/bin/umount /dev/md4";
  Mount Point = "/mnt/backup"
  Write Part Command = ""
}

#
# An autochanger device with two drives
#
#Autochanger {
#  Name = Autochanger
#  Device = Drive-1
#  Device = Drive-2
#  Changer Command = "/usr/libexec/bacula/mtx-changer %c %o %S %a %d"
#  Changer Device = /dev/sg0
#}

#Device {
#  Name = Drive-1                      #
#  Drive Index = 0
#  Media Type = DLT-8000
#  Archive Device = /dev/nst0
#  AutomaticMount = yes;               # when device opened, read it
#  AlwaysOpen = yes;
#  RemovableMedia = yes;
#  RandomAccess = no;
#  AutoChanger = yes
#  #
#  # Enable the Alert command only if you have the mtx package loaded
#  # Note, apparently on some systems, tapeinfo resets the SCSI controller
#  #  thus if you turn this on, make sure it does not reset your SCSI 
#  #  controller.  I have never had any problems, and smartctl does
#  #  not seem to cause such problems.
#  #
#  Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
#  If you have smartctl, enable this, it has more info than tapeinfo 
#  Alert Command = "sh -c 'smartctl -H -l error %c'"  
#}

#Device {
#  Name = Drive-2                      #
#  Drive Index = 1
#  Media Type = DLT-8000
#  Archive Device = /dev/nst1
#  AutomaticMount = yes;               # when device opened, read it
#  AlwaysOpen = yes;
#  RemovableMedia = yes;
#  RandomAccess = no;
#  AutoChanger = yes
#  # Enable the Alert command only if you have the mtx package loaded
#  Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
#  If you have smartctl, enable this, it has more info than tapeinfo 
#  Alert Command = "sh -c 'smartctl -H -l error %c'"  
#}

#
# A Linux or Solaris LTO-2 tape drive
#
#Device {
#  Name = LTO-2
#  Media Type = LTO-2
#  Archive Device = /dev/nst0
#  AutomaticMount = yes;               # when device opened, read it
#  AlwaysOpen = yes;
#  RemovableMedia = yes;
#  RandomAccess = no;
#  Maximum File Size = 3GB
## Changer Command = "/usr/libexec/bacula/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
#  # Enable the Alert command only if you have the mtx package loaded
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## If you have smartctl, enable this, it has more info than tapeinfo 
## Alert Command = "sh -c 'smartctl -H -l error %c'"  
#}

#
# A Linux or Solaris LTO-3 tape drive
#
#Device {
#  Name = LTO-3
#  Media Type = LTO-3
#  Archive Device = /dev/nst0
#  AutomaticMount = yes;               # when device opened, read it
#  AlwaysOpen = yes;
#  RemovableMedia = yes;
#  RandomAccess = no;
#  Maximum File Size = 4GB
## Changer Command = "/usr/libexec/bacula/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
#  # Enable the Alert command only if you have the mtx package loaded
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## If you have smartctl, enable this, it has more info than tapeinfo 
## Alert Command = "sh -c 'smartctl -H -l error %c'"  
#}

#
# A Linux or Solaris LTO-4 tape drive
#
#Device {
#  Name = LTO-4
#  Media Type = LTO-4
#  Archive Device = /dev/nst0
#  AutomaticMount = yes;               # when device opened, read it
#  AlwaysOpen = yes;
#  RemovableMedia = yes;
#  RandomAccess = no;
#  Maximum File Size = 5GB
## Changer Command = "/usr/libexec/bacula/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
#  # Enable the Alert command only if you have the mtx package loaded
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## If you have smartctl, enable this, it has more info than tapeinfo 
## Alert Command = "sh -c 'smartctl -H -l error %c'"  
#}




#
# A FreeBSD tape drive
#
#Device {
#  Name = DDS-4 
#  Description = "DDS-4 for FreeBSD"
#  Media Type = DDS-4
#  Archive Device = /dev/nsa1
#  AutomaticMount = yes;               # when device opened, read it
#  AlwaysOpen = yes
#  Offline On Unmount = no
#  Hardware End of Medium = no
#  BSF at EOM = yes
#  Backward Space Record = no
#  Fast Forward Space File = no
#  TWO EOF = yes
#  If you have smartctl, enable this, it has more info than tapeinfo 
#  Alert Command = "sh -c 'smartctl -H -l error %c'"  
#}

# 
# Send all messages to the Director, 
# mount messages also are sent to the email address
#
Messages {
  Name = Standard
  director = castellan-dir = all
}

Máy trạm

tập tin

#
# Default  Bacula File Daemon Configuration file
#
#  For Bacula release 7.0.5 (08/05/14) -- Windows MinGW64
#
# There is not much to change here except perhaps the
# File daemon Name
#

#
# "Global" File daemon configuration specifications
#
FileDaemon {                            # this is me
  Name = liege-fd
  FDport = 9102                # where we listen for the director
  WorkingDirectory = "C:\\Program Files\\Bacula\\working"
  Pid Directory = "C:\\Program Files\\Bacula\\working"
  Plugin Directory = "C:\\Program Files\\Bacula\\plugins"
  Maximum Concurrent Jobs = 10
}

#
# List Directors who are permitted to contact this File daemon
#
Director {
  Name = castellan-dir
  Password = "vZwrnQRZanw4q8BE3BEraGsc9UQnehYHNyvirP1fhURU"  # Director must know this password
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the file daemon
#
Director {
  Name = liege-mon
  Password = ""
  Monitor = yes
}

# Send all messages except skipped files back to Director
Messages {
  Name = Standard
  director = castellan-dir = all, !skipped, !restored
}

Kết quả công việc

28-Mar 02:05 castellan-dir JobId 1518: No prior Full backup Job record found.
28-Mar 02:05 castellan-dir JobId 1518: No prior or suitable Full backup found in catalog. Doing FULL backup.
28-Mar 02:07 castellan-dir JobId 1518: shell command: run BeforeJob "/bin/mount /dev/md4"
28-Mar 02:07 castellan-dir JobId 1518: Start Backup JobId 1518, Job=BackupLiege.2015-03-28_02.05.00_19
28-Mar 02:07 castellan-dir JobId 1518: Using Device "MainBackupArray" to write.
28-Mar 01:48 liege-fd JobId 1518: Fatal error: Authorization key rejected by Storage daemon.
Please see http://www.bacula.org/en/rel-manual/Bacula_Freque_Asked_Questi.html#SECTION00260000000000000000 for help.
28-Mar 02:07 castellan-dir JobId 1518: Fatal error: Bad response to Storage command: wanted 2000 OK storage
, got 2902 Bad storage

28-Mar 02:07 castellan-dir JobId 1518: Error: Bacula castellan-dir 5.2.13 (19Jan13):
  Build OS:               x86_64-pc-linux-gnu gentoo
  JobId:                  1518
  Job:                    BackupLiege.2015-03-28_02.05.00_19
  Backup Level:           Full (upgraded from Incremental)
  Client:                 "liege-fd" 7.0.5 (04Aug14) Microsoft Windows 7 Ultimate Edition Service Pack 1 (build 7601), 64-bit,Cross-compile,Win64
  FileSet:                "LiegeFullset" 2015-03-18 02:05:00
  Pool:                   "File" (From Job resource)
  Catalog:                "MyCatalog" (From Client resource)
  Storage:                "MainBackupArray" (From Job resource)
  Scheduled time:         28-Mar-2015 02:05:00
  Start time:             28-Mar-2015 02:07:29
  End time:               28-Mar-2015 02:07:41
  Elapsed time:           12 secs
  Priority:               10
  FD Files Written:       0
  SD Files Written:       0
  FD Bytes Written:       0 (0 B)
  SD Bytes Written:       0 (0 B)
  Rate:                   0.0 KB/s
  Software Compression:   None
  VSS:                    no
  Encryption:             no
  Accurate:               no
  Volume name(s):
  Volume Session Id:      127
  Volume Session Time:    1422045928
  Last Volume Bytes:      86,414,167,951 (86.41 GB)
  Non-fatal FD errors:    2
  SD Errors:              0
  FD termination status:  Error
  SD termination status:  Waiting on FD
  Termination:            *** Backup Error ***

28-Mar 02:07 castellan-dir JobId 1518: shell command: run AfterJob "/bin/umount /dev/md4"

Câu trả lời:


5

Tôi đã có một vấn đề tương tự, và vấn đề là một sự khác biệt trong phiên bản máy khách và máy chủ. để kiểm tra phiên bản bacula của bạn (làm điều này trên cả máy khách và máy chủ)

apt-cache policy bacula

nếu chúng không giống nhau, thì hãy đảm bảo máy khách của bạn khớp với máy chủ của bạn. Điều này làm việc cho tôi.

nhận một số trợ giúp ở đây https://serverfault.com/questions/202785/how-to-check-bacula-version


lưu ý rằng cách tốt hơn để chech phiên bản hiện được cài đặt sẽ là dpkg -l bacula-sd bacula-fd- chính sách apt-cache có thể hiển thị nhiều phiên bản và hệ thống của bạn có thể không được cập nhật.
Matija Nalis

2

Kiểm tra xem máy trạm (liege) có thể truy cập cổng daemon lưu trữ (9103) trên máy chủ không (castellan = 192.168.10.192). Hãy chắc chắn rằng nó không bị chặn bởi iptables hoặc tường lửa mạng can thiệp.


vâng, nó có thể là tường lửa giữa FD (máy khách) và SD (lưu trữ), vì lỗi cụ thể là giám đốc nhận thấy rằng FD không kết nối với SD như được hướng dẫn.
Matija Nalis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.